| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718 | <template>  <div class="app-container">    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">      <el-form-item label="客户编码" prop="customerCode">        <el-input          style="width:220px"          v-model="queryParams.customerCode"          placeholder="请输入客户编码"          clearable          size="small"          @keyup.enter.native="handleQuery"        />      </el-form-item>      <el-form-item label="客户名称" prop="customerName">        <el-input          style="width:220px"          v-model="queryParams.customerName"          placeholder="请输入客户名称"          clearable          size="small"          @keyup.enter.native="handleQuery"        />      </el-form-item>      <el-form-item label="手机" prop="mobile">        <el-input        style="width:220px"          v-model="queryParams.mobile"          placeholder="请输入手机"          clearable          size="small"          @keyup.enter.native="handleQuery"        />      </el-form-item>      <el-form-item label="跟进阶段" prop="status">        <el-select style="width:220px" multiple filterable  v-model="statusArr" placeholder="请选择跟进阶段" clearable size="small">           <el-option                v-for="item in statusOptions"                :key="item.dictValue"                :label="item.dictLabel"                :value="item.dictValue"              />        </el-select>      </el-form-item>      <el-form-item label="客户类型" prop="customerType">        <el-select style="width:220px" multiple filterable  v-model="ctsTypeArr" placeholder="请选择客户类型" clearable size="small">           <el-option                v-for="item in typeOptions"                :key="item.dictValue"                :label="item.dictLabel"                :value="item.dictValue"              />        </el-select>      </el-form-item>      <el-form-item label="客户标签" prop="tags">            <el-select style="width:220px" multiple  filterable v-model="tagIds" placeholder="请选择客户标签" clearable size="small">              <el-option                    v-for="item in tagsOptions"                    :key="item.dictLabel"                    :label="item.dictLabel"                    :value="item.dictLabel"                  />            </el-select>          </el-form-item>      <el-form-item label="客户来源" prop="source">        <el-select style="width:220px" multiple filterable  v-model="sourceArr" placeholder="请选择客户来源" clearable size="small">           <el-option                v-for="item in sourceOptions"                :key="item.dictValue"                :label="item.dictLabel"                :value="item.dictValue"              />        </el-select>      </el-form-item>      <el-form-item label="客户创建时间" prop="createTimeRange">        <el-date-picker          style="width:205.4px"          clearable size="small"          v-model="createTimeRange"          type="daterange"          value-format="yyyy-MM-dd"          start-placeholder="开始日期"          end-placeholder="结束日期">        </el-date-picker>      </el-form-item>      <el-form-item label="领取时间" prop="receiveTime">        <el-date-picker              style="width:220px"              clearable size="small"              v-model="dateRange"              type="daterange"              value-format="yyyy-MM-dd"              start-placeholder="开始日期"              end-placeholder="结束日期">            </el-date-picker>      </el-form-item>      <el-form-item label="历史订单" prop="isHisOrder">          <el-select style="width:220px" filterable v-model="queryParams.isHisOrder" placeholder="请选择历史订单" clearable size="small">            <el-option key="1"  label="已下单" value="1" />            <el-option key="0"  label="未下单" value="0" />          </el-select>      </el-form-item>      <el-form-item>        <el-button type="cyan" 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"            size="mini"            icon="el-icon-plus"            @click="handleAdd"            v-hasPermi="['crm:customer:addMyCustomer']"          >新增客户</el-button>        </el-col>      <el-col :span="1.5">        <el-button          type="success"          icon="el-icon-edit"          size="mini"          :disabled="multiple"          @click="handleAssign"          v-hasPermi="['crm:customer:assignToUser']"        >客户分配</el-button>      </el-col>      <el-col :span="1.5">        <el-button          type="success"          size="mini"          :disabled="multiple"          @click="handleEditScource"          v-hasPermi="['crm:customer:editScource']"        >修改客户来源</el-button>      </el-col>      <el-col :span="1.5">        <el-button          type="success"          size="mini"          :disabled="multiple"          @click="handleSendBatchSms"          v-hasPermi="['crm:customer:sendBatchSms']"        >批量发送短信</el-button>      </el-col>      <el-col :span="1.5">        <el-button          type="warning"          icon="el-icon-download"          size="mini"          @click="handleExport"          v-hasPermi="['crm:customer:export']"        >导出</el-button>      </el-col>	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>    </el-row>    <el-table  height="500" border v-loading="loading" :data="customerList" @selection-change="handleSelectionChange">      <el-table-column type="selection" width="55" align="center" />      <el-table-column label="客户编码" align="center" prop="customerCode" />      <el-table-column  label="客户名称"   align="center" prop="customerName" :show-overflow-tooltip="true">        <template slot-scope="scope">          <el-link @click="handleShow(scope.row)" :underline="false" type="primary" >{{scope.row.customerName}}</el-link>        </template>      </el-table-column>      <el-table-column  label="手机" width="120px"  align="center" prop="mobile"   >        <template slot-scope="scope">          {{scope.row.mobile}}          <el-button type="text"    size="mini" @click="callNumber(scope.row.customerId,null,null,null)">拨号</el-button>          <el-button v-hasPermi="['crm:customer:addVisit']"  type="text" size="mini" @click="handleAddVisit(scope.row)">写跟进</el-button>        </template>      </el-table-column>      <el-table-column  label="客户来源" align="center" prop="source">        <template slot-scope="scope">            <el-tag prop="status" v-for="(item, index) in sourceOptions"    v-if="scope.row.source==item.dictValue">{{item.dictLabel}}</el-tag>        </template>      </el-table-column>      <el-table-column  label="跟进阶段"  width="200" align="center" prop="visitStatus">        <template slot-scope="scope">            <el-tag prop="visitStatus" v-for="(item, index) in statusOptions"    v-if="scope.row.visitStatus==item.dictValue">{{item.dictLabel}}</el-tag><br/>            <el-button  v-hasPermi="['crm:customer:addVisitStatus']"  type="text" size="mini" @click="handleVisitStatus(scope.row)">修改</el-button>          </template>      </el-table-column>      <el-table-column  label="客户类型"  width="200" align="center" prop="customerType">        <template slot-scope="scope">            <el-tag prop="status" v-for="(item, index) in typeOptions"    v-if="scope.row.customerType==item.dictValue">{{item.dictLabel}}</el-tag>            <el-button   v-hasPermi="['crm:customer:addCustomerType']"  type="text" size="mini" @click="handleCustomerType(scope.row)">修改</el-button>          </template>      </el-table-column>      <el-table-column  label="标签" width="120px"  align="center" prop="tags"   >        <template slot-scope="scope">          {{scope.row.tags}}          <el-button  v-hasPermi="['crm:customer:addTag']"  type="text" size="mini" @click="handleAddTag(scope.row)">打标签</el-button>        </template>      </el-table-column>      <el-table-column  label="备注" width="150px"  align="center" prop="remark"   >        <template slot-scope="scope">          {{scope.row.remark}}          <el-button   v-hasPermi="['crm:customer:addRemark']" type="text" size="mini" @click="handleAddRemark(scope.row)">修改备注</el-button>        </template>      </el-table-column>      <el-table-column label="进线客户详情" align="center" :show-overflow-tooltip="true" prop="registerDesc" />      <el-table-column label="最新跟进时间" align="center" prop="lastTime" />      <el-table-column label="领取时间" align="center" prop="receiveTime" />      <el-table-column label="进线客户提交日期" align="center" prop="registerSubmitTime" />      <el-table-column label="创建时间" align="center" prop="customerCreateTime" width="180">      </el-table-column>      <el-table-column label="操作"   align="center" fixed="right" width="120px" class-name="small-padding fixed-width">        <template slot-scope="scope">          <el-button            size="mini"            type="text"            @click="handleShow(scope.row)"            v-hasPermi="['crm:customer:query']"          >查看</el-button>          <el-button            size="mini"            type="text"            @click="handleRecover(scope.row)"            v-hasPermi="['crm:customer:recover']"          >回收公海</el-button>          <!-- <el-button            size="mini"            type="text"            @click="handleAssign(scope.row)"            v-hasPermi="['crm:customer:assign']"          >转移客户</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-drawer size="75%" :title="show.title" :visible.sync="show.open">        <customer-details  ref="customerDetails" />    </el-drawer>    <el-dialog :title="addSms.title" :visible.sync="addSms.open" width="1000px" append-to-body>       <add-batch-sms ref="sms" @close="closeSms()"></add-batch-sms>    </el-dialog>    <el-dialog :title="source.title" :visible.sync="source.open" width="1000px" append-to-body>       <edit-source ref="editSource" @close="closeSource()"></edit-source>    </el-dialog>    <el-dialog :title="visit.title" :visible.sync="visit.open" width="600px" append-to-body>      <add-visit @closeVisit="closeVisit"   ref="addVisit" />    </el-dialog>    <el-dialog :title="customer.title" :visible.sync="customer.open" width="1000px" append-to-body>       <add-or-edit-customer ref="customer" @close="closeCustomer()"></add-or-edit-customer>    </el-dialog>    <el-dialog :title="assign.title" :visible.sync="assign.open" width="800px" append-to-body>        <assign-user  ref="assignUser" @close="closeAssign"   />    </el-dialog>    <el-dialog :title="addTag.title" :visible.sync="addTag.open" width="600px" append-to-body>        <add-tag ref="tag" @close="closeTag()"></add-tag>    </el-dialog>    <el-dialog :title="addRemark.title" :visible.sync="addRemark.open" width="600px" append-to-body>        <add-remark ref="remark" @close="closeRemark()"></add-remark>    </el-dialog>    <el-dialog :title="addCustomerType.title" :visible.sync="addCustomerType.open" width="600px" append-to-body>        <add-customer-type ref="customerType" @close="closeCustomerType()"></add-customer-type>    </el-dialog>    <el-dialog :title="addVisitStatus.title" :visible.sync="addVisitStatus.open" width="600px" append-to-body>        <add-visit-status ref="visitStatus" @close="closeVisitStatus()"></add-visit-status>    </el-dialog>  </div></template><script>import { getMyCustomerList,recover,exportCustomer  } from "@/api/crm/customer";import customerDetails from '../components/customerDetails.vue';import addVisit from '../components/addVisit.vue';import {getCitys} from "@/api/store/city";import addBatchSms from '../components/addBatchSms.vue';import editSource from '../components/editSource.vue';import addOrEditCustomer from '../components/addOrEditCustomer.vue';import assignUser from '../components/assignUser.vue';import addTag from '../components/addTag.vue';import addRemark from '../components/addRemark.vue';import addCustomerType from '../components/addCustomerType.vue';import addVisitStatus from '../components/addVisitStatus.vue';export default {  name: "Customer",  components: {addVisitStatus,addCustomerType,addRemark,addTag,assignUser,addOrEditCustomer,editSource, addBatchSms,customerDetails,addVisit,addVisit },  data() {    return {      addVisitStatus:{          open:false,          title:"跟进阶段"      },      addCustomerType:{          open:false,          title:"客户类型"      },      addRemark:{          open:false,          title:"客户备注"      },      addTag:{          open:false,          title:"打标签"      },      tagIds:[],      statusArr:[],      ctsTypeArr:[],      sourceArr:[],      tagsOptions:[],      createTimeRange:[],      customer:{          open:false,          title:"新增客户"      },      users:[],      visit:{          open:false,          title:"写跟进"      },      source:{          open:false,          title:"修改客户来源"      },      assign:{        title:"分配客户",        open:false,      },      assignForm: {      },      // 表单校验      assignRules: {        // companyUserId: [        //   { required: true, message: "员工不能为空", trigger: "blur" }        // ],      },      dateRange:[],      addSms:{          open:false,          title:"批量发短信"      },      cityIds:[],      citys:[],      tags:[],      inputVisible: false,      inputValue: '',      statusOptions:[],      typeOptions:[],      sourceOptions:[],      sexOptions:[],      show:{        title:"客户详情",        open:false,      },      // 遮罩层      loading: true,      // 选中数组      ids: [],      // 非单个禁用      single: true,      // 非多个禁用      multiple: true,      // 显示搜索条件      showSearch: true,      // 总条数      total: 0,      // 客户表格数据      customerList: [],      // 弹出层标题      title: "",      // 是否显示弹出层      open: false,      // 查询参数      queryParams: {        pageNum: 1,        pageSize: 10,        customerCode: null,        customerName: null,        mobile: null,        sex: null,        weixin: null,        userId: null,        createUserId: null,        receiveUserId: null,        customerUserId: null,        address: null,        location: null,        detailAddress: null,        lng: null,        lat: null,        status: null,        deptId: null,        isDel: null,        customerType: null,        receiveTime: null,        poolTime: null,        companyId: null,        isLine: null,        source: null,        tags: null      },      // 表单参数      form: {        province:null,        city:null,        district:null,      },      // 表单校验      rules: {        customerName: [          { required: true, message: "客户名称不能为空", trigger: "blur" }        ],        mobile: [          { required: true, message: "手机号不能为空", trigger: "blur" }        ],        sex: [          { required: true, message: "性别不能为空", trigger: "blur" }        ],        source: [          { required: true, message: "客户来源不能为空", trigger: "blur" }        ],      },      loading:null,    };  },  created() {    this.getDicts("crm_customer_source").then((response) => {      this.sourceOptions = response.data;    });    this.getDicts("sys_sex").then((response) => {      this.sexOptions = response.data;    });    this.getDicts("crm_customer_source").then((response) => {      this.sourceOptions = response.data;    });    this.getDicts("sys_sex").then((response) => {      this.sexOptions = response.data;    });    this.getDicts("crm_customer_user_status").then((response) => {      this.statusOptions = response.data;    });    this.getDicts("crm_customer_type").then((response) => {      this.typeOptions = response.data;    });    this.getDicts("crm_customer_tag").then((response) => {        this.tagsOptions = response.data;    });    this.getCitys();    this.getList();  },  methods: {    closeVisitStatus(){        this.addVisitStatus.open=false;        this.getList();    },    handleVisitStatus(row){        this.addVisitStatus.open=true;        var that=this;        setTimeout(() => {            that.$refs.visitStatus.reset(row);        }, 500);    },    closeCustomerType(){        this.addCustomerType.open=false;        this.getList();    },    handleCustomerType(row){        this.addCustomerType.open=true;        var that=this;        setTimeout(() => {            that.$refs.customerType.reset(row);        }, 500);    },    closeRemark(){        this.addRemark.open=false;        this.getList();    },    handleAddRemark(row){        this.addRemark.open=true;        var that=this;        setTimeout(() => {            that.$refs.remark.reset(row);        }, 500);    },    closeTag(){        this.addTag.open=false;        this.getList();    },    handleAddTag(row){        this.addTag.open=true;        var that=this;        setTimeout(() => {            that.$refs.tag.reset(row);        }, 500);    },    handleShow(row){      this.show.open=true;      var that=this;      const tab = "visit";      setTimeout(() => {        that.$refs.customerDetails.getDetails(row.customerId);        that.$refs.customerDetails.handleClick(tab);      }, 200);    },    handleAdd() {      this.customer.open = true;      var that=this;      setTimeout(() => {        that.$refs.customer.handleAdd(2);      }, 200);    },    closeCustomer(){        this.customer.open=false;        this.getList();    },    closeVisit(){        this.visit.open=false;        this.getList();    },    handleAddVisit(row){        this.visit.open=true;        setTimeout(() => {            this.$refs.addVisit.reset(row.customerId);        }, 200);    },    handleAssign(){      var that=this;      var ids=this.ids;      that.assign.open=true;      setTimeout(() => {          that.$refs.assignUser.init(ids,3);      }, 200);    },    closeAssign(){      this.assign.open=false;      this.getList();    },    handleEditScource(){      this.source.open=true;      var that=this;      setTimeout(() => {        that.$refs.editSource.handleEdit(that.ids);      }, 200);    },    closeSource(){        this.source.open=false;        this.getList();    },    closeSms(){        this.addSms.open=false;    },    handleSendBatchSms(){      const customerIds =  this.ids;      this.addSms.open=true;      var that=this;      setTimeout(() => {          console.log(customerIds)          that.$refs.sms.reset(customerIds);      }, 500);    },    handleRecover(row) {      this.$confirm('是否确认回收客户"' + row.customerName + '"?', "警告", {          confirmButtonText: "确定",          cancelButtonText: "取消",          type: "warning"        }).then(function() {          var data={customerUserId:row.customerUserId}          return recover(data);        }).then(() => {          this.getList();          this.msgSuccess("操作成功");        }).catch(function() {});    },    handleCityChange(value) {      console.log(value);      var nodes=this.$refs.citySelect.getCheckedNodes();      this.form.address=nodes[0].pathLabels[0]+"-"+nodes[0].pathLabels[1]+"-"+nodes[0].pathLabels[2];      this.form.cityIds=value.toString();    },    getCitys(){        getCitys().then(res => {          this.loading = false;          this.citys=res.data;        })    },    /** 查询客户列表 */    getList() {      this.loading = true;      if(this.createTimeRange!=null&&this.createTimeRange.length==2){        this.queryParams.createTimeRange=this.createTimeRange[0]+"--"+this.createTimeRange[1]      }      else{        this.queryParams.createTimeRange=null;      }      if(this.statusArr.length>0){        this.queryParams.status=this.statusArr.toString();      }      else{        this.queryParams.status=null      }      if(this.ctsTypeArr.length>0){        this.queryParams.customerType=this.ctsTypeArr.toString();      }      else{        this.queryParams.customerType=null      }      if(this.sourceArr.length>0){        this.queryParams.source=this.sourceArr.toString();      }      else{        this.queryParams.source=null      }      if(this.tagIds.length>0){        this.queryParams.tags=this.tagIds.toString();      }      else{        this.queryParams.tags=null      }      getMyCustomerList(this.addDateRange(this.queryParams, this.dateRange)).then(response => {        this.customerList = response.rows;        this.total = response.total;        this.loading = false;      });    },    // 取消按钮    cancel() {      this.open = false;      this.reset();    },    /** 搜索按钮操作 */    handleQuery() {      this.queryParams.pageNum = 1;      this.getList();    },    /** 重置按钮操作 */    resetQuery() {      this.resetForm("queryForm");      this.statusArr=[];      this.ctsTypeArr=[];      this.tagIds=[];      this.sourceArr=[];      this.createTimeRange=null;      this.dateRange = null;      this.handleQuery();    },    // 多选框选中数据    handleSelectionChange(selection) {      this.ids = selection.map(item => item.customerId)      this.single = selection.length!==1      this.multiple = !selection.length    },    /** 删除按钮操作 */    handleDelete(row) {      const customerIds = row.customerId || this.ids;      this.$confirm('是否确认删除客户编号为"' + customerIds + '"的数据项?', "警告", {          confirmButtonText: "确定",          cancelButtonText: "取消",          type: "warning"        }).then(function() {          return delLineCustomer(customerIds);        }).then(() => {          this.getList();          this.msgSuccess("删除成功");        }).catch(function() {});    },    /** 导出按钮操作 */    handleExport() {      const queryParams = this.queryParams;      this.$confirm('是否确认导出所有客户数据项?', "警告", {          confirmButtonText: "确定",          cancelButtonText: "取消",          type: "warning"        }).then(function() {          return exportCustomer(queryParams);        }).then(response => {          this.download(response.msg);        }).catch(function() {});    },  }};</script><style>  .el-tag + .el-tag {    margin-left: 10px;  }  .button-new-tag {    margin-left: 10px;    height: 32px;    line-height: 30px;    padding-top: 0;    padding-bottom: 0;  }  .input-new-tag {    width: 90px;    margin-left: 10px;    vertical-align: bottom;  }  .el-dialog__wrapper{    z-index: 100000;  }</style>
 |