index.vue 33.9 KB
Newer Older
1 2 3 4 5
<template>
  <div class="app-container">

    <!-- 搜索工作栏 -->
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
6
      <el-form-item :label="$t('客户编号')" prop="number">
Marcus's avatar
Marcus committed
7
        <el-input v-model="queryParams.number" :placeholder="$t('请输入客户编号')" clearable @keyup.enter.native="handleQuery"/>
8
      </el-form-item>
9
      <el-form-item :label="$t('客户名称')" prop="name">
Marcus's avatar
Marcus committed
10
        <el-input v-model="queryParams.name" :placeholder="$t('请输入客户名称')" clearable @keyup.enter.native="handleQuery"/>
11
      </el-form-item>
12 13
      <el-form-item :label="$t('客户等级')" prop="level">
        <el-select clearable  v-model="queryParams.level" :placeholder="$t('请选择客户等级')" clearable size="small">
14
          <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_LEVEL)"
15
                       :key="dict.value" :label="isChinese ? dict.label : dict.labelEn" :value="dict.value"/>
16 17
        </el-select>
      </el-form-item>
18 19
      <el-form-item :label="$t('联系方式')">
        <el-input :placeholder="$t('请输入联系方式')" v-model="queryParams.defaultContactPhone"></el-input>
20
      </el-form-item>
21
      <el-form-item :label="$t('客户类别')" prop="level">
dcy's avatar
dcy committed
22
        <dict-selector  :type="DICT_TYPE.CUSTOMER_TYPE"   v-model="queryParams.type"></dict-selector>
23
      </el-form-item>
24 25
      <el-form-item :label="$t('客户经理')" prop="customerService">
        <el-select clearable  v-model="queryParams.customerService" :placeholder="$t('请选择客户经理')" clearable size="small">
26 27 28 29
          <el-option v-for="dict in customerServiceList"
                     :key="dict.id" :label="dict.nickname" :value="dict.id"/>
        </el-select>
      </el-form-item>
30 31
      <el-form-item :label="$t('客户来源')" prop="source">
        <el-select clearable  v-model="queryParams.source" :placeholder="$t('请选择客户来源')" clearable size="small">
32
          <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_SOURCE)"
33
                       :key="dict.value" :label="isChinese ? dict.label : dict.labelEn" :value="dict.value"/>
34 35
        </el-select>
      </el-form-item>
36
      <el-form-item :label="$t('国家')" prop="source">
dcy's avatar
dcy committed
37
        <el-select clearable  v-model="queryParams.country" :placeholder="$t('请选择国家')">
38
          <el-option v-for="dict in countryList"
39
                     :key="dict.id" :label=" isChinese ? dict.nameZh : dict.nameEn" :value="parseInt(dict.id)" />
40 41
        </el-select>
      </el-form-item>
42 43
      <el-form-item :label="$t('客户状态')" prop="status">
        <el-select clearable  v-model="queryParams.status" :placeholder="$t('请选择客户状态')" clearable size="small">
44
          <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_STATUS)"
45
                       :key="dict.value" :label="isChinese ? dict.label : dict.labelEn" :value="dict.value"/>
46 47
        </el-select>
      </el-form-item>
48
      <el-form-item :label="$t('创建时间')">
dcy's avatar
dcy committed
49
        <el-date-picker clearable  v-model="dateRangeCreateTime" style="width: 240px" value-format="yyyy-MM-dd"
50
                        type="daterange" range-separator="-" :start-placeholder="$t('开始日期')" :end-placeholder="$t('结束日期')" />
51
      </el-form-item>
52
      <el-form-item :label="$t('信用等级')" prop="department">
dcy's avatar
dcy committed
53
        <el-select clearable  v-model="queryParams.creditLevel" >
54
          <el-option  v-for="(item,index) in creditList" :label="isChinese ?  item.nameZh : item.nameEn" :key="index" :value="item.id" ></el-option>
55 56
        </el-select>
      </el-form-item>
57
      <el-form-item>
58 59
        <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{$t('搜索')}}</el-button>
        <el-button icon="el-icon-refresh" @click="resetQuery">{{$t('重置')}}</el-button>
60 61 62 63 64 65 66
      </el-form-item>
    </el-form>

    <!-- 操作工具栏 -->
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
67
                   v-hasPermi="['ecw:customer:create']">{{$t('新增')}}</el-button>
68
      </el-col>
69
      <el-col :span="1.5" >
70
        <el-button :disabled="selectCustomerList.length === 0"  type="primary" size="mini" @click="transferShow = true;"
71
                   v-hasPermi="['ecw:customer:export']">{{$t('批量移交')}}</el-button>
72
      </el-col>
73 74 75 76
      <el-col :span="1.5">
        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
                   v-hasPermi="['ecw:customer:export']">{{$t('导出')}}</el-button>
      </el-col>
77 78 79 80
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>

    <!-- 列表 -->
81 82 83 84 85
    <el-table ref="multipleTable" v-loading="loading" :data="list"   @selection-change="handleSelectionChange">
      <el-table-column
        type="selection"
        width="55">
      </el-table-column>
86 87 88 89 90 91 92
      <el-table-column :label="$t('客户编号')" align="center" prop="number" >
        <template v-slot="{row}">
          <router-link :to="'/customer/query/' + row.id">
            {{row.number}}
          </router-link>
        </template>
      </el-table-column>
93 94
      <el-table-column :label="$t('客户名称')" align="center" prop="name">
        <template slot-scope="{row}">
Marcus's avatar
Marcus committed
95
          {{row.name}} <el-tag v-if="row.isInOpenSea" size="mini">{{ $t('') }}</el-tag>
96 97 98
        </template>
      </el-table-column>

99
      <el-table-column :label="$t('客户等级')" align="center" prop="vipLevelNameZh">
100 101 102 103
        <template slot-scope="scope">
          <dict-tag :type="DICT_TYPE.CUSTOMER_LEVEL" :value="scope.row.level" />
        </template>
      </el-table-column>
邓春圆's avatar
邓春圆 committed
104
      <el-table-column :label="$t('信用等级')" :prop="isChinese ? 'creditLevelNameZh' : 'creditLevelNameEn'"></el-table-column>
105
      <el-table-column :label="$t('客户状态')" align="center" prop="status">
106 107 108 109
        <template slot-scope="scope">
          <dict-tag :type="DICT_TYPE.CUSTOMER_STATUS" :value="scope.row.status" />
        </template>
      </el-table-column>
110
      <el-table-column :label="$t('主联系人')" prop="defaultContactName"></el-table-column>
dcy's avatar
dcy committed
111 112 113 114 115
      <el-table-column :label="$t('主联系方式')" prop="defaultContactPhone">
        <template v-slot="{row}">
          +{{row.defaultContactPhone}}
        </template>
      </el-table-column>
116
      <el-table-column :label="$t('创建时间')" align="center" prop="createTime" width="180">
117 118 119 120
        <template slot-scope="scope">
          <span>{{ parseTime(scope.row.createTime) }}</span>
        </template>
      </el-table-column>
121
      <el-table-column :label="$t('入公海时间')" align="center" prop="createTime" width="180">
122 123
        <template  v-slot = {row}>
          <span>{{ parseTime(row.enterOpenSeaTime ? row.enterOpenSeaTime : row.estimateEnterOpenSeaTime )  }}</span>
124 125
        </template>
      </el-table-column>
126
      <el-table-column :label="$t('客户经理')" align="center" prop="customerServiceName">
127
      </el-table-column>
128
      <el-table-column :label="$t('出货渠道')">
129
        <template slot-scope="{row}">
130
          {{channel(row.transportType)}}
131 132
        </template>
      </el-table-column>
133 134
      <el-table-column :label="$t('国家')" align="center" prop="country" :formatter="countryFormatter"></el-table-column>
      <el-table-column :label="$t('操作')" align="center" class-name="small-padding fixed-width">
135
        <template slot-scope="scope">
dcy's avatar
dcy committed
136 137
<!--          <el-button size="mini" type="text" v-show="'development' === env && scope.row.isInOpenSea"  @click="seasPond(scope.row)"-->
<!--                     v-hasPermi="['ecw:customer:query']">{{$t('掉入公海池')}}</el-button>-->
Marcus's avatar
Marcus committed
138
          <el-button size="mini" type="text" icon="el-icon-view" @click="handleView(scope.row)"
139
                     v-hasPermi="['ecw:customer:query']">{{$t('查看')}}</el-button>
140
          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
141
                     v-hasPermi="['ecw:customer:update']">{{$t('修改')}}</el-button>
142
          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
143 144 145
                     v-hasPermi="['ecw:customer:delete']">{{$t('删除')}}</el-button>
          <el-button size="mini" type="text" icon="el-icon-collection" @click="followUp(scope.row)">{{$t('跟进')}}</el-button>
          <el-button size="mini" type="text" icon="el-icon-user" @click="complaint(scope.row)">{{$t('客诉')}}</el-button>
146
          <el-button :disabled="scope.row.isInOpenSea" size="mini" type="text" icon="el-icon-user" @click="delay(scope.row)">{{$t('延期')}}</el-button>
147 148 149 150 151 152 153 154
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页组件 -->
    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
                @pagination="getList"/>

    <!-- 对话框(添加 / 修改) -->
155
    <el-dialog :title="title" :visible.sync="open" width="90%" append-to-body :close-on-click-modal="false">
156 157 158
      <el-form ref="form" :model="form" :rules="rules" label-width="150px">
        <el-row :gutter="10">
          <el-col :span="12">
Marcus's avatar
Marcus committed
159 160
            <el-form-item :label="$t('客户名称')" prop="name">
              <el-input v-model="form.name" :placeholder="$t('请输入客户名称')" />
161 162 163
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
164 165
            <el-form-item :label="$t('国家')" prop="country">
              <el-select v-model="form.country" :placeholder="$t('请选择国家')">
Marcus's avatar
Marcus committed
166
                <el-option v-for="dict in getDictDatas(DICT_TYPE.COUNTRY)"
167
                           :key="dict.value" :label="isChinese ? dict.label : dict.labelEn" :value="parseInt(dict.value)" />
168 169 170 171
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
172 173
            <el-form-item :label="$t('客户等级')" prop="level">
              <el-select v-model="form.level" :placeholder="$t('请选择客户等级')">
174
                <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_LEVEL)"
175
                           :key="dict.value" :label="isChinese ? dict.label : dict.labelEn" :value="parseInt(dict.value)" />
176 177 178 179
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
180 181
            <el-form-item :label="$t('联系地址')" prop="address">
              <el-input v-model="form.address" :placeholder="$t('请输入联系地址')" />
182 183 184
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
185 186
            <el-form-item :label="$t('客户类别')" prop="type">
              <el-select v-model="form.type" :placeholder="$t('请选择客户类别')">
187
                <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_TYPE)"
188
                           :key="dict.value" :label="isChinese ? dict.label : dict.labelEn" :value="dict.value" />
189 190 191
              </el-select>
            </el-form-item>
          </el-col>
192
<!--          <el-col :span="12">-->
Marcus's avatar
Marcus committed
193 194
<!--            <el-form-item :label="$t('所属代理')" prop="agentId">-->
<!--              <el-select v-model="form.agentId" :placeholder="$t('请选择所属代理')">-->
195 196 197 198 199
<!--                <el-option v-for="dict in getDictDatas(DICT_TYPE.COMMON_STATUS)"-->
<!--                           :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" />-->
<!--              </el-select>-->
<!--            </el-form-item>-->
<!--          </el-col>-->
200
          <el-col :span="12">
Marcus's avatar
Marcus committed
201 202
            <el-form-item :label="$t('常用提货网点')" prop="pickupPoint">
              <el-select v-model="form.pickupPoint" :placeholder="$t('请输入常用提货网点')">
203 204
                <el-option v-for="node in nodeList"
                           :key="node.value" :label="node.label" :value="node.value" />
205 206 207 208
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
209

Marcus's avatar
Marcus committed
210 211
            <el-form-item :label="$t('公司名称')" prop="company">
              <el-input v-model="form.company" :placeholder="$t('请输入公司名称')" />
212 213 214
            </el-form-item>
          </el-col>
          <el-col :span="12">
215

Marcus's avatar
Marcus committed
216
            <el-form-item :label="$t('客户生日')" prop="birthday">
217 218 219 220
              <el-date-picker
                v-model="form.birthday"
                type="date"
                value-format="timestamp"
Marcus's avatar
Marcus committed
221
                :placeholder="$t('请输入客户生日')">
222
              </el-date-picker>
223 224 225
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
226
            <el-form-item :label="$t('主营类别')" prop="productType">
227 228
              <el-row :gutter="10">
               <el-col :span="11">
Marcus's avatar
Marcus committed
229 230
                 <el-select v-model="form.productType" :placeholder="$t('请选择产品类别')">
<!--                   <el-option :label="$t('请选择字典生成')" value="" />-->
231 232 233
                 </el-select>
               </el-col>
                <el-col :span="11">
Marcus's avatar
Marcus committed
234 235
                  <el-select v-model="form.productType" :placeholder="$t('请选择主营类别')">
<!--                    <el-option :label="$t('请选择字典生成')" value="" />-->
236 237 238
                  </el-select>
                </el-col>
              </el-row>
239 240 241
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
242 243
            <el-form-item :label="$t('客户来源')" prop="source">
              <el-select v-model="form.source" :placeholder="$t('请选择客户来源')">
244
                <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_SOURCE)"
245
                           :key="dict.value" :label="isChinese ? dict.label : dict.labelEn" :value="parseInt(dict.value)" />
246 247 248 249
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
250 251
            <el-form-item :label="$t('结算方式')" prop="balance">
              <el-select v-model="form.balance" :placeholder="$t('请选择结算方式')">
252
                <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_BALANCE)"
253
                           :key="dict.value" :label="isChinese ? dict.label : dict.labelEn" :value="parseInt(dict.value)" />
254 255 256 257
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
258 259
            <el-form-item :label="$t('客户经理')" prop="customerService">
              <el-select v-model="form.customerService" :placeholder="$t('请选择客户经理')">
260 261
                <el-option v-for="dict in customerServiceList"
                           :key="dict.id" :label="dict.nickname" :value="dict.id" />
262 263 264 265
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
266
            <el-form-item :label="$t('图片')" prop="picture">
267
              <upload v-model="form.picture" :limit="1"></upload>
268
            </el-form-item>
269

270 271
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
272
            <el-form-item :label="$t('客户状态')" prop="status">
273

Marcus's avatar
Marcus committed
274
              <el-select v-model="form.status" :placeholder="$t('请选择客户状态')">
275
                <el-option v-for="dict in getDictDatas(DICT_TYPE.CUSTOMER_STATUS)"
276
                           :key="dict.value" :label="isChinese ? dict.label : dict.labelEn" :value="parseInt(dict.value)" />
277 278 279 280
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
281 282
            <el-form-item :label="$t('推介人')" prop="promoter">
              <el-input v-model="form.promoter" :placeholder="$t('请输入推介人')" />
283 284 285
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
286 287
            <el-form-item :label="$t('创建人')" prop="founder">
              <el-input v-model="form.founder" :placeholder="$t('请输入创建人')" />
288 289 290
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
291
            <el-form-item :label="$t('创建时间')" prop="founder">
292 293 294 295
              <el-date-picker
                v-model="form.createTime"
                type="datetime"
                value-format="timestamp"
Marcus's avatar
Marcus committed
296
                :placeholder="$t('选择创建时间')">
297
              </el-date-picker>
298 299 300
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
301 302
            <el-form-item :label="$t('备注')" prop="remarks">
              <el-input v-model="form.remarks" :placeholder="$t('请输入备注')" />
303 304 305
            </el-form-item>
          </el-col>
          <el-col :span="24">
Marcus's avatar
Marcus committed
306
            <el-form-item :label="$t('到仓确认')" prop="arrivalConfirm">
307 308 309 310 311 312 313 314
              <el-switch v-model="form.arrivalConfirm" :active-value="0" :inactive-value="1" />
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="重货标准(CBM)" prop="weightUnit">
              <el-input v-model="form.weightUnit" placeholder="请输入重货标准(CBM)" />
            </el-form-item>
          </el-col>
315
          <el-col :span="24">
Marcus's avatar
Marcus committed
316
            <el-form-item :label="$t('指定线路')" prop="line">
317 318 319 320 321 322 323 324
              <el-switch v-model="showLine"></el-switch>
              <el-table
                v-show="showLine"
                border
                :data="form.customerLines"
                style="width: 500px">
                <el-table-column
                  prop="departureId"
Marcus's avatar
Marcus committed
325
                  :label="$t('始发地')">
326 327 328
                </el-table-column>
                <el-table-column
                  prop="objectiveId"
Marcus's avatar
Marcus committed
329
                  :label="$t('目的地')">
330 331 332 333
                </el-table-column>
              </el-table>
            </el-form-item>
          </el-col>
334
        </el-row>
335

黄卓's avatar
黄卓 committed
336 337
        <el-card class="box-card">
          <div slot="header" class="clearfix">
Marcus's avatar
Marcus committed
338
            <span>{{ $t('联系人') }}</span>
黄卓's avatar
黄卓 committed
339
            <el-button style="float: right;" size="small" type="primary" @click="form.customerContacts.push({department: undefined})">+</el-button>
黄卓's avatar
黄卓 committed
340 341 342 343 344 345 346
          </div>
          <el-table
            :data="form.customerContacts"
            style="width: 100%"
          >
            <el-table-column
              prop="department"
Marcus's avatar
Marcus committed
347
              :label="$t('部门')"
黄卓's avatar
黄卓 committed
348 349
              width=""
            >
黄卓's avatar
黄卓 committed
350
              <template v-slot="{ row, column, $index }">
Marcus's avatar
Marcus committed
351
                <el-input v-model="row.department" :placeholder="$t('请输入部门')" size="mini"/>
黄卓's avatar
黄卓 committed
352
              </template>
黄卓's avatar
黄卓 committed
353 354 355
            </el-table-column>
            <el-table-column
              prop="position"
Marcus's avatar
Marcus committed
356
              :label="$t('职位')"
黄卓's avatar
黄卓 committed
357 358
              width=""
            >
黄卓's avatar
黄卓 committed
359
              <template v-slot="{row}">
Marcus's avatar
Marcus committed
360
                <el-input v-model="row.position" :placeholder="$t('请输入职位')" size="mini"/>
黄卓's avatar
黄卓 committed
361
              </template>
黄卓's avatar
黄卓 committed
362 363 364
            </el-table-column>
            <el-table-column
              prop="name"
Marcus's avatar
Marcus committed
365
              :label="$t('联系人')"
黄卓's avatar
黄卓 committed
366
            >
Marcus's avatar
Marcus committed
367
              <template v-slot:header>{{ $t('联系人') }}<span style="color: #ff0000">*</span>
368
              </template>
黄卓's avatar
黄卓 committed
369
              <template v-slot="{row}">
Marcus's avatar
Marcus committed
370
                <el-input v-model="row.name" :placeholder="$t('请输入联系人')" size="mini"/>
黄卓's avatar
黄卓 committed
371
              </template>
黄卓's avatar
黄卓 committed
372 373 374
            </el-table-column>
            <el-table-column
              prop="areaCode"
Marcus's avatar
Marcus committed
375
              :label="$t('区号')"
黄卓's avatar
黄卓 committed
376
            >
Marcus's avatar
Marcus committed
377
              <template v-slot:header>{{ $t('区号') }}<span style="color: #ff0000">*</span>
378
              </template>
黄卓's avatar
黄卓 committed
379
              <template v-slot="{row}">
Marcus's avatar
Marcus committed
380
                <el-select v-model="row.areaCode" :placeholder="$t('请选择区号')">
黄卓's avatar
黄卓 committed
381
                  <el-option v-for="dict in getDictDatas(DICT_TYPE.AREA_CODE)"
382
                             :key="dict.value" :label="isChinese ? dict.label : dict.labelEn" :value="parseInt(dict.value)" />
黄卓's avatar
黄卓 committed
383 384
                </el-select>
              </template>
黄卓's avatar
黄卓 committed
385 386
            </el-table-column>
            <el-table-column
黄卓's avatar
黄卓 committed
387
              prop="phoneNew"
Marcus's avatar
Marcus committed
388
              :label="$t('联系方式')"
黄卓's avatar
黄卓 committed
389
            >
Marcus's avatar
Marcus committed
390
              <template v-slot:header>{{ $t('联系方式') }}<span style="color: #ff0000">*</span>
391
              </template>
黄卓's avatar
黄卓 committed
392
              <template v-slot="{row}">
Marcus's avatar
Marcus committed
393
                <el-input v-model="row.phoneNew" :placeholder="$t('请输入联系方式')" size="mini"/>
黄卓's avatar
黄卓 committed
394
              </template>
黄卓's avatar
黄卓 committed
395 396 397
            </el-table-column>
            <el-table-column
              prop=""
Marcus's avatar
Marcus committed
398
              :label="$t('关联账号')"
黄卓's avatar
黄卓 committed
399 400 401 402
            >
            </el-table-column>
            <el-table-column
              prop="social"
Marcus's avatar
Marcus committed
403
              :label="$t('社交软件')"
黄卓's avatar
黄卓 committed
404
            >
黄卓's avatar
黄卓 committed
405
              <template v-slot="{row}">
Marcus's avatar
Marcus committed
406
                <el-select v-model="row.social" :placeholder="$t('请选择社交软件')">
黄卓's avatar
黄卓 committed
407
                  <el-option v-for="dict in getDictDatas(DICT_TYPE.SOCIAL)"
408
                             :key="dict.value" :label="isChinese ? dict.label : dict.labelEn" :value="parseInt(dict.value)" />
黄卓's avatar
黄卓 committed
409 410
                </el-select>
              </template>
黄卓's avatar
黄卓 committed
411 412 413
            </el-table-column>
            <el-table-column
              prop="socialNumber"
Marcus's avatar
Marcus committed
414
              :label="$t('社交软件号码')"
黄卓's avatar
黄卓 committed
415
            >
黄卓's avatar
黄卓 committed
416
              <template v-slot="{row}">
Marcus's avatar
Marcus committed
417
                <el-input v-model="row.socialNumber" :placeholder="$t('请输入社交软件号码')" size="mini"/>
黄卓's avatar
黄卓 committed
418
              </template>
黄卓's avatar
黄卓 committed
419 420 421
            </el-table-column>
            <el-table-column
              prop="email"
Marcus's avatar
Marcus committed
422
              :label="$t('邮箱')"
黄卓's avatar
黄卓 committed
423
            >
黄卓's avatar
黄卓 committed
424
              <template v-slot="{row}">
Marcus's avatar
Marcus committed
425
                <el-input v-model="row.email" :placeholder="$t('请输入邮箱')" size="mini"/>
黄卓's avatar
黄卓 committed
426
              </template>
黄卓's avatar
黄卓 committed
427 428 429
            </el-table-column>
            <el-table-column
              prop="isDefault"
Marcus's avatar
Marcus committed
430
              :label="$t('设为默认')"
黄卓's avatar
黄卓 committed
431
            >
黄卓's avatar
黄卓 committed
432
              <template v-slot="{row}">
Marcus's avatar
Marcus committed
433
                <el-select v-model="row.isDefault" :placeholder="$t('设为默认')">
黄卓's avatar
黄卓 committed
434 435 436 437
                  <el-option v-for="dict in getDictDatas(DICT_TYPE.IS_DEFAULT)"
                             :key="dict.value" :label="dict.label" :value="parseInt(dict.isDefault)" />
                </el-select>
              </template>
黄卓's avatar
黄卓 committed
438 439 440
            </el-table-column>
            <el-table-column
              prop="name"
Marcus's avatar
Marcus committed
441
              :label="$t('操作')"
黄卓's avatar
黄卓 committed
442
            >
黄卓's avatar
黄卓 committed
443
              <template v-slot="{ row, column, $index }">
Marcus's avatar
Marcus committed
444
                <el-button type="danger" @click="form.customerContacts.splice($index, 1)">{{ $t('删除') }}</el-button>
黄卓's avatar
黄卓 committed
445
              </template>
黄卓's avatar
黄卓 committed
446 447 448 449
            </el-table-column>
          </el-table>
        </el-card>

450 451
        <el-row :gutter="10" style="margin-top: 15px">
          <el-col :span="12">
Marcus's avatar
Marcus committed
452 453
            <el-form-item :label="$t('发票抬头')" prop="invoiceTitle">
              <el-input v-model="form.invoiceTitle" :placeholder="$t('请输入发票抬头')" />
454 455 456
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
457 458
            <el-form-item :label="$t('纳税人识别号')" prop="licenseNumber">
              <el-input v-model="form.licenseNumber" :placeholder="$t('请输入纳税人识别号')" />
459 460 461
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
462 463
            <el-form-item :label="$t('开户行')" prop="bank">
              <el-input v-model="form.bank" :placeholder="$t('请输入开户行')" />
464 465 466
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
467 468
            <el-form-item :label="$t('账户')" prop="bankNumber">
              <el-input v-model="form.bankNumber" :placeholder="$t('请输入账户')" />
469 470 471
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
472 473
            <el-form-item :label="$t('项目')" prop="project">
              <el-input v-model="form.project" :placeholder="$t('请输入项目')" />
474 475 476
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
477 478
            <el-form-item :label="$t('开票地址')" prop="billingAddress">
              <el-input v-model="form.billingAddress" :placeholder="$t('请输入开票地址')" />
479 480 481
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
482 483
            <el-form-item :label="$t('开票电话')" prop="billingTell">
              <el-input v-model="form.billingTell" :placeholder="$t('请输入开票电话')" />
484 485 486
            </el-form-item>
          </el-col>
          <el-col :span="12">
Marcus's avatar
Marcus committed
487 488
            <el-form-item :label="$t('税率')" prop="taxRate">
              <el-input v-model="form.taxRate" :placeholder="$t('请输入税率')" />
489 490 491
            </el-form-item>
          </el-col>
        </el-row>
492 493
      </el-form>
      <div slot="footer" class="dialog-footer">
494 495
        <el-button type="primary" @click="submitForm">{{$t('确 定')}}</el-button>
        <el-button @click="cancel">{{$t('取 消')}}</el-button>
496 497
      </div>
    </el-dialog>
498 499
    <customer-follow-list :customer-id="customerId" :id="customerId" ref="CustomerFollowList"></customer-follow-list>
    <customer-complaints :customer-id="customerId" ref="customerComplaints"></customer-complaints>
500
    <transfer-customer :show.sync="transferShow" :customer-ids.sync="selectCustomerList"></transfer-customer>
501 502 503 504
  </div>
</template>

<script>
505 506 507 508
import {
  createCustomer, updateCustomer, deleteCustomer, getCustomer,
  getCustomerPage, exportCustomerExcel, testEnterToOpenSea
} from "@/api/ecw/customer";
509 510 511 512
import { getDictDatas, DICT_TYPE } from '@/utils/dict';
import {CommonStatusEnum} from '@/utils/constants'
import { uploadFile } from "@/api/infra/file";

513 514
import upload from '@/components/ImageUpload'
import {getNodeList} from "@/api/ecw/node"
515 516
import CustomerFollowList from "@/components/CustomerFollowList"
import customerComplaints from "@/components/customerComplaints"
dcy's avatar
dcy committed
517
import {listServiceUser} from "@/api/system/user";
518
import { getCountryListAll } from '@/api/ecw/country'
519 520
import {getCreditPage} from "@/api/customer/credit";
import transferCustomer from "@/views/ecw/customer/transferCustomer";
521
import Template from "@/views/cms/template/index.vue";
522 523 524

export default {
  name: "Customer",
525
  computed:{
邓春圆's avatar
邓春圆 committed
526 527 528
    isChinese(){
      return this.$i18n.locale === 'zh_CN'
    },
529 530
    channel(){
      return (val)=>{
邓春圆's avatar
邓春圆 committed
531
        return !!val ? this.getDictDatas(this.DICT_TYPE.ECW_CUSTOMER_TRANSPORT_TYPE).filter(i => (val.split(',') || []).includes(i.value)).map(i => this.isChinese ? i.label : i.labelEn ).join('') :''
532 533 534
      }
    }
  },
535
  components: {
536
    Template,
537 538
    upload,
    CustomerFollowList,
539 540
    customerComplaints,
    transferCustomer
541 542 543
  },
  data() {
    return {
544
      env:process.env.NODE_ENV,
545 546
      getDictDatas,
      DICT_TYPE,
547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572
      // 遮罩层
      loading: true,
      // 导出遮罩层
      exportLoading: false,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 客户列表
      list: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      dateRangeCreateTime: [],
      // 查询参数
      queryParams: {
        pageNo: 1,
        pageSize: 10,
        number: null,
        name: null,
        level: null,
        source: null,
        customerService: null,
        status: null,
        department: null,
dcy's avatar
dcy committed
573 574
        creditLevel:null,
        country:null,
575 576
      },
      // 表单参数
黄卓's avatar
黄卓 committed
577
      form: {},
578 579
      // 表单校验
      rules: {
580 581 582 583
        name: [{ required: true, message: this.$t('客户名称不能为空'), trigger: "blur" }],
        country: [{ required: true, message: this.$t('国家不能为空'), trigger: "blur" }],
        level: [{ required: true, message: this.$t('客户等级不能为空'), trigger: "blur" }],
        type: [{ required: true, message: this.$t('客户类别不能为空'), trigger: "blur" }],
Marcus's avatar
Marcus committed
584
        // createTime: [{ required: true, message: this.$t("创建时间不能为空"), trigger: "blur" }],
585 586 587 588
        source: [{ required: true, message: this.$t('客户来源不能为空'), trigger: "blur" }],
        customerService: [{ required: true, message: this.$t('客户经理不能为空'), trigger: "blur" }],
        status: [{ required: true, message: this.$t('客户状态不能为空'), trigger: "blur" }],
        founder: [{ required: true, message: this.$t('创建人不能为空'), trigger: "blur" }],
589 590 591
      },
      // 网点
      nodeList: [],
592 593
      showLine: false,
      customerId:undefined,
594
      customerServiceList:[],
595 596 597 598
      countryList: [],
      creditList:[],
      selectCustomerList:[],
      transferShow:false
599 600 601
    };
  },
  created() {
602 603 604
    getCreditPage({page:1,rows:999}).then(r => {
      this.creditList = r.data.list
    })
605
    this.getList();
606 607 608
    // getNodeList().then(r => {
    //   this.nodeList = r.data
    // })
dcy's avatar
dcy committed
609 610 611
    listServiceUser().then(r=>{
      this.customerServiceList = r.data;
    })
612 613 614
    getCountryListAll().then(r => {
      this.countryList = r.data
    })
615 616
  },
  methods: {
617 618
    countryFormatter(row, column, cellValue) {
      const country = this.countryList.find((e) => e.id === cellValue)
邓春圆's avatar
邓春圆 committed
619
      return this.isChinese ? country?.nameZh : country?.nameEn
620
    },
621 622 623 624 625 626 627 628
    /** 查询列表 */
    getList() {
      this.loading = true;
      // 处理查询参数
      let params = {...this.queryParams};
      this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
      // 执行查询
      getCustomerPage(params).then(response => {
629
        console.log(response,'response')
630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660
        this.list = response.data.list;
        this.total = response.data.total;
        this.loading = false;
      });
    },
    /** 取消按钮 */
    cancel() {
      this.open = false;
      this.reset();
    },
    /** 表单重置 */
    reset() {
      this.form = {
        id: undefined,
        number: undefined,
        name: undefined,
        level: undefined,
        country: undefined,
        type: undefined,
        agentId: undefined,
        company: undefined,
        address: undefined,
        productType: undefined,
        productId: undefined,
        pickupPoint: undefined,
        memberId: undefined,
        birthday: undefined,
        balance: undefined,
        source: undefined,
        picture: undefined,
        customerService: undefined,
黄卓's avatar
黄卓 committed
661
        customerContacts: [],
662
        customerLines: [],
663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689
        promoter: undefined,
        status: undefined,
        founder: undefined,
        department: undefined,
        invoiceTitle: undefined,
        licenseNumber: undefined,
        bank: undefined,
        bankNumber: undefined,
        project: undefined,
        billingAddress: undefined,
        billingTell: undefined,
        taxRate: undefined,
        remarks: undefined,
        arrivalConfirm: undefined,
        weightUnit: undefined,
      };
      this.resetForm("form");
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNo = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.dateRangeCreateTime = [];
      this.resetForm("queryForm");
dcy's avatar
dcy committed
690 691 692 693 694 695 696 697 698 699 700 701 702
      this.queryParams = {
        pageNo: 1,
        pageSize: 10,
        number: null,
        name: null,
        level: null,
        source: null,
        customerService: null,
        status: null,
        department: null,
        creditLevel:null,
        country:null,
      }
703 704 705 706
      this.handleQuery();
    },
    /** 新增按钮操作 */
    handleAdd() {
707
      this.$router.push('/customer/add-edit/0')
708 709
      // this.reset();
      // this.open = true;
Marcus's avatar
Marcus committed
710
      // this.title = this.$t("添加客户");
711
    },
黄卓's avatar
黄卓 committed
712
    /** 查看按钮操作 */
Marcus's avatar
Marcus committed
713
    handleView(row) {
黄卓's avatar
黄卓 committed
714 715
      this.$router.push('/customer/query/' + row.id)
    },
716 717 718 719 720 721 722 723 724
    /** 调入公海池测试用 */
    seasPond(row) {
      testEnterToOpenSea(row.id).then(r => {
         if(r.code === 0){
           this.$t('调入公海池成功!')
           this.getList();
         }
      })
    },
725 726
    /** 修改按钮操作 */
    handleUpdate(row) {
727 728 729 730 731 732
      this.$router.push('/customer/edit/' + row.id)
      // this.reset();
      // const id = row.id;
      // getCustomer(id).then(response => {
      //   this.form = { ...this.form, ...response.data };
      //   this.open = true;
Marcus's avatar
Marcus committed
733
      //   this.title = this.$t("修改客户");
734
      // });
735 736 737 738 739
    },
    /** 提交按钮 */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (!valid) {
740
          // return;
741 742 743 744
        }
        // 修改的提交
        if (this.form.id != null) {
          updateCustomer(this.form).then(response => {
745
            this.$modal.msgSuccess(this.$t('修改成功'));
746 747 748 749 750 751 752
            this.open = false;
            this.getList();
          });
          return;
        }
        // 添加的提交
        createCustomer(this.form).then(response => {
753
          this.$modal.msgSuccess(this.$t('新增成功'));
754 755 756 757 758 759 760 761
          this.open = false;
          this.getList();
        });
      });
    },
    /** 删除按钮操作 */
    handleDelete(row) {
      const id = row.id;
762 763 764
      const name = row.name;
      const number = row.number;
      this.$modal.confirm(this.$t('是否确认删除客户编号为"') + number + this.$t('"的数据项?')).then(function() {
765 766 767
          return deleteCustomer(id);
        }).then(() => {
          this.getList();
768
          this.$modal.msgSuccess(this.$t('删除成功'));
769 770 771 772 773 774 775 776 777 778
        }).catch(() => {});
    },
    /** 导出按钮操作 */
    handleExport() {
      // 处理查询参数
      let params = {...this.queryParams};
      params.pageNo = undefined;
      params.pageSize = undefined;
      this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
      // 执行导出
779
      this.$modal.confirm(this.$t('是否确认导出所有客户数据项?')).then(() => {
780 781 782
          this.exportLoading = true;
          return exportCustomerExcel(params);
        }).then(response => {
783
          this.$download.excel(response, `${this.$t('客户信息')}.xls`);
dragondean@qq.com's avatar
dragondean@qq.com committed
784 785
          /* console.log(response,'response')
          this.$download.excel(response, `${this.$t('全部客户信息')}.xls`); */
786 787
          this.exportLoading = false;
        }).catch(() => {});
788 789 790
    },
    followUp(row){
      this.customerId = row.id;
dcy's avatar
dcy committed
791 792 793
     this.$nextTick(()=>{
       this.$refs.CustomerFollowList.customerFollow.dialogVisible = true;
     })
794
    },
795 796 797 798
    delay(row){

      this.$router.push({path:'/customer/delay',query:{id:row.id}})
    },
799 800 801 802 803
    complaint(row){
      this.customerId = row.id;
     this.$nextTick(()=>{
       this.$refs.customerComplaints.handleAdd();
     })
804 805 806
    },
    handleSelectionChange(val){
      this.selectCustomerList = val.map(i => i.id);
807
    }
808 809 810 811
  },
  watch:{
    selectCustomerList(val){
      if(val.length === 0){
812
        this.getList()
813 814 815 816
        this.$refs.multipleTable.clearSelection();
      }
    },

817 818 819
  }
};
</script>