sunlupeng 1 rok pred
rodič
commit
135eed9029

+ 2 - 2
.env.dev

@@ -6,9 +6,9 @@ VUE_APP_TITLE = 爱思系统
 
 # 爱思系统/开发环境
 # 赵培清
-# VUE_APP_BASE_API = 'http://192.168.100.213:48080'
+VUE_APP_BASE_API = 'http://192.168.100.213:48080'
 # 王东坡
-VUE_APP_BASE_API = 'http://192.168.100.64:48081'
+# VUE_APP_BASE_API = 'http://192.168.100.64:48081'
 # 测试
 # VUE_APP_BASE_API = 'http://47.103.79.143:48081'
 

+ 27 - 6
src/api/crm/business.js

@@ -1,9 +1,30 @@
 import request from '@/utils/request'
 
+// 状态修改
+export function changeUserStatus(id, status) {
+  const data = {
+    id,
+    status
+  }
+  return request({
+    url: '/business/info/update-open-status',
+    method: 'put',
+    data: data
+  })
+}
+
+//获取编号
+export function getOpportunityCode() {
+  return request({
+    url: '/customer/business-opportunity/getOpportunityCode',
+    method: 'get'
+  })
+}
+
 // 查询列表
 export function listBusiness(query) {
   return request({
-    url: '/finance/cash/payment-info/page',
+    url: '/customer/business-opportunity/page',
     method: 'get',
     params: query
   })
@@ -12,7 +33,7 @@ export function listBusiness(query) {
 // 查询详细
 export function getBusiness(dictId) {
   return request({
-    url: '/finance/cash/payment-info/get?id=' + dictId,
+    url: '/customer/business-opportunity/get?id=' + dictId,
     method: 'get'
   })
 }
@@ -20,7 +41,7 @@ export function getBusiness(dictId) {
 // 新增
 export function addBusiness(data) {
   return request({
-    url: '/finance/cash/payment-info/create',
+    url: '/customer/business-opportunity/create',
     method: 'post',
     data: data
   })
@@ -29,7 +50,7 @@ export function addBusiness(data) {
 // 修改
 export function updateBusiness(data) {
   return request({
-    url: '/finance/cash/payment-info/update',
+    url: '/customer/business-opportunity/update',
     method: 'put',
     data: data
   })
@@ -38,7 +59,7 @@ export function updateBusiness(data) {
 // 删除
 export function delBusiness(dictId) {
   return request({
-    url: '/finance/cash/payment-info/delete?id=' + dictId,
+    url: '/customer/business-opportunity/delete?id=' + dictId,
     method: 'delete'
   })
 }
@@ -46,7 +67,7 @@ export function delBusiness(dictId) {
 // 导出
 export function exportBusiness(query) {
   return request({
-    url: '/finance/cash/payment-info/export-excel',
+    url: '/customer/business-opportunity/export-excel',
     method: 'get',
     params: query,
     responseType: 'blob'

+ 35 - 6
src/api/crm/customer.js

@@ -1,9 +1,38 @@
 import request from '@/utils/request'
 
+// 状态修改
+export function changeUserStatus(id, status) {
+  const data = {
+    id,
+    status
+  }
+  return request({
+    url: '/customer/info/update-open-status',
+    method: 'put',
+    data: data
+  })
+}
+
+//获取编号
+export function getCustomerCode() {
+  return request({
+    url: '/customer/info/getCustomerCode',
+    method: 'get'
+  })
+}
 // 查询列表
 export function listCustomer(query) {
   return request({
-    url: '/finance/cash/payment-info/page',
+    url: '/customer/info/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 获取精简信息列表  isOpen不传查全部的 传0就是开启的 1就是关闭的
+export function listSimpleCustomer(query) {
+  return request({
+    url: '/customer/info/list',
     method: 'get',
     params: query
   })
@@ -12,7 +41,7 @@ export function listCustomer(query) {
 // 查询详细
 export function getCustomer(dictId) {
   return request({
-    url: '/finance/cash/payment-info/get?id=' + dictId,
+    url: '/customer/info/get?id=' + dictId,
     method: 'get'
   })
 }
@@ -20,7 +49,7 @@ export function getCustomer(dictId) {
 // 新增
 export function addCustomer(data) {
   return request({
-    url: '/finance/cash/payment-info/create',
+    url: '/customer/info/create',
     method: 'post',
     data: data
   })
@@ -29,7 +58,7 @@ export function addCustomer(data) {
 // 修改
 export function updateCustomer(data) {
   return request({
-    url: '/finance/cash/payment-info/update',
+    url: '/customer/info/update',
     method: 'put',
     data: data
   })
@@ -38,7 +67,7 @@ export function updateCustomer(data) {
 // 删除
 export function delCustomer(dictId) {
   return request({
-    url: '/finance/cash/payment-info/delete?id=' + dictId,
+    url: '/customer/info/delete?id=' + dictId,
     method: 'delete'
   })
 }
@@ -46,7 +75,7 @@ export function delCustomer(dictId) {
 // 导出
 export function exportCustomer(query) {
   return request({
-    url: '/finance/cash/payment-info/export-excel',
+    url: '/customer/info/export-excel',
     method: 'get',
     params: query,
     responseType: 'blob'

+ 248 - 147
src/views/crm/business/index.vue

@@ -1,23 +1,45 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="商机编号" prop="opportunityCode">
+        <el-input v-model="queryParams.opportunityCode" placeholder="请输入商机编号" clearable style="width: 250px"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
       <el-form-item label="商机名称" prop="opportunityName">
         <el-input v-model="queryParams.opportunityName" placeholder="请输入商机名称" clearable style="width: 250px"
           @keyup.enter.native="handleQuery" />
       </el-form-item>
-      <el-form-item label="项目类型" prop="projectType">
-        <el-input v-model="queryParams.projectType" placeholder="请输入项目类型" clearable style="width: 250px"
-          @keyup.enter.native="handleQuery" />
+      <el-form-item label="客户名称" prop="customerId">
+        <el-select v-model="queryParams.customerId" placeholder="请选择客户名称" style="width: 250px">
+          <el-option v-for="item in customerListAll" :key="item.id" :label="item.customerName"
+            :value="item.id">
+          </el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="添加人" prop="creatorName">
-        <el-input v-model="queryParams.creatorName" placeholder="添加人" clearable style="width: 250px"
-          @keyup.enter.native="handleQuery" />
+      <el-form-item label="赢单机率" prop="winRate">
+        <el-select v-model="queryParams.winRate" placeholder="请选择赢单机率" style="width: 250px">
+          <el-option label="高" value="0"></el-option>
+          <el-option label="中" value="1"></el-option>
+          <el-option label="低" value="2"></el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="成立时间" prop="estimatedDealTime">
+
+      <el-form-item label="进单日期" prop="estimatedDealTime">
         <el-date-picker v-model="queryParams.estimatedDealTime" style="width: 250px" value-format="yyyy-MM-dd HH:mm:ss"
           type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
           :default-time="['00:00:00', '23:59:59']" />
       </el-form-item>
+      <el-form-item label="商机等级" prop="opportunityLevel">
+        <el-select v-model="queryParams.opportunityLevel" placeholder="请选择商机等级" style="width: 250px">
+          <el-option label="潜在" value="0"></el-option>
+          <el-option label="可能" value="1"></el-option>
+          <el-option label="重点跟进" value="2"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建人" prop="creatorEmployeeName">
+        <el-input v-model="queryParams.creatorEmployeeName" placeholder="添加人" clearable style="width: 250px"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
@@ -37,11 +59,14 @@
     </el-row>
 
     <el-table v-loading="loading" :data="dataList">
+      <el-table-column label="商机编号" align="center" prop="opportunityCode" min-width="350" />
       <el-table-column label="商机名称" align="center" prop="opportunityName" min-width="100" />
-      <el-table-column label="项目类型" align="center" prop="projectType" min-width="100" />
       <el-table-column label="客户名称" align="center" prop="customerName" min-width="120" />
-      <el-table-column label="申请人" align="center" prop="creatorEmployeeName" min-width="150" />
-      <el-table-column label="部门" align="center" prop="deptName" min-width="100" />
+      <el-table-column label="预计赢单机率" align="center" prop="winRate" min-width="100">
+        <template v-slot="scope">
+          <span>{{ scope.row.winRate == 0 ? '高' : scope.row.winRate == 1 ? '中' : '低' }}</span>
+        </template>
+      </el-table-column>
       <el-table-column label="预计合同金额" align="center" prop="estimatedContractAmount" min-width="100" />
       <el-table-column label="预计项目毛利" align="center" prop="estimatedProjectMargin" min-width="150" />
       <el-table-column label="预计项目成功率" align="center" prop="estimatedSuccessRate" min-width="150" />
@@ -50,8 +75,18 @@
           <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="商机等级" align="center" prop="opportunityLevel" min-width="80" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" min-width="150">
+      <el-table-column label="商机等级" align="center" prop="opportunityLevel" min-width="80">
+        <template v-slot="scope">
+          <span>{{ scope.row.opportunityLevel == 0 ? '潜在' : scope.row.opportunityLevel == 1 ? '可能' : '重点跟进' }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建人" align="center" prop="creatorEmployeeName" min-width="100" />
+      <el-table-column label="创建时间" align="center" prop="createTime" min-width="150">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width" min-width="150">
         <template v-slot="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['customer:info:update']">修改</el-button>
@@ -70,43 +105,58 @@
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="24">
-            <el-form-item label="商机名称" prop="opportunityName">
-              <el-input maxlength="20" v-model="form.opportunityName" placeholder='请输入商机名称'></el-input>
+            <el-form-item label="商机编号" prop="opportunityCode">
+              <el-input v-model="form.opportunityCode" placeholder='请输入商机编号' disabled></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="项目类型" prop="projectType">
-              <el-input v-model="form.projectType" placeholder='请输入项目类型'></el-input>
+            <el-form-item label="商机名称" prop="opportunityName">
+              <el-input maxlength="30" v-model="form.opportunityName" placeholder='请输入商机名称'></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="客户名称" prop="customerId">
-              <el-input v-model="form.customerId" placeholder='请输入客户名称'></el-input>
+            <el-form-item label="客户" prop="customerId">
+              <el-select v-model="form.customerId" placeholder="请选择客户" style="width: 100%">
+                <el-option v-for="item in customerList" :key="item.id" :label="item.customerName"
+                  :value="item.id">
+                </el-option>
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="申请人" prop="creatorEmployeeName">
-              <el-input v-model="form.creatorEmployeeName" placeholder='请输入申请人'></el-input>
+            <el-form-item label="赢单机率" prop="winRate">
+              <el-select v-model="form.winRate" placeholder="请选择赢单机率" style="width: 100%">
+                <el-option label="高" value="0"></el-option>
+                <el-option label="中" value="1"></el-option>
+                <el-option label="低" value="2"></el-option>
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="部门" prop="deptName">
-              <el-input v-model="form.deptName" placeholder='请输入部门'></el-input>
+            <el-form-item label="合同金额" prop="estimatedContractAmount">
+              <el-input v-model="form.estimatedContractAmount" placeholder='预计合同金额(元)'
+                oninput="value=value.match(/\d+\.?\d{0,2}/,'')"></el-input>
             </el-form-item>
           </el-col>
-          <el-col :span="24">
-              <el-form-item label="合同金额" prop="estimatedContractAmount">
-                  <el-input v-model="form.estimatedContractAmount" placeholder='预计合同金额(万元)' oninput="value=value.match(/\d+\.?\d{0,2}/,'')"></el-input>
-              </el-form-item>
-          </el-col>
           <el-col :span="24">
             <el-form-item label="项目毛利" prop="estimatedProjectMargin">
-              <el-input v-model="form.estimatedProjectMargin" placeholder='请输入客户地址'></el-input>
+              <el-input oninput="value=value.replace(/^(0+)|[^\d]+/g,'')" v-model="form.estimatedProjectMargin" placeholder='单位:%,大于0小等于100的正整数'></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="24">
             <el-form-item label="成功率" prop="estimatedSuccessRate">
-              <el-input v-model="form.estimatedSuccessRate" placeholder='请输入客户联系人'></el-input>
+              <el-select v-model="form.estimatedSuccessRate" placeholder="请选择预计项目成功率" style="width: 100%">
+                <el-option label="10%" value="10%"></el-option>
+                <el-option label="20%" value="20%"></el-option>
+                <el-option label="30%" value="30%"></el-option>
+                <el-option label="40%" value="40%"></el-option>
+                <el-option label="50%" value="50%"></el-option>
+                <el-option label="60%" value="60%"></el-option>
+                <el-option label="70%" value="70%"></el-option>
+                <el-option label="80%" value="80%"></el-option>
+                <el-option label="90%" value="90%"></el-option>
+                <el-option label="100%" value="100%"></el-option>
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="24">
@@ -118,7 +168,19 @@
           </el-col>
           <el-col :span="24">
             <el-form-item label="商机等级" prop="opportunityLevel">
-              <el-input v-model="form.opportunityLevel" placeholder='请输入客户联系手机号'></el-input>
+              <el-select v-model="form.opportunityLevel" placeholder="请选择商机等级" style="width: 100%">
+                <el-option label="潜在" value="0"></el-option>
+                <el-option label="可能" value="1"></el-option>
+                <el-option label="重点跟进" value="2"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="附件">
+              <el-upload :action="fileUrl" :headers="headers" :file-list="files" :on-success="handleFileSuccessCite"
+                :before-upload="beforeUploadFile" :on-remove="handleRemove">
+                <el-button size="small" type="primary">点击上传</el-button>
+              </el-upload>
             </el-form-item>
           </el-col>
           <el-col :span="24">
@@ -137,117 +199,122 @@
     <!-- 详情对话框 -->
     <el-dialog :title="title" :visible.sync="openDetail" width="800px" append-to-body>
       <div class="widget-wrapper">
-    <div class="widget-list">
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">商机名称</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.opportunityName">{{ form.opportunityName }}</span>
-        </div>
-      </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">项目类型</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.projectType">{{ form.projectType }}</span>
-        </div>
-      </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">客户名称</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.customerId">{{ form.customerId }}</span>
-        </div>
-      </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">申请人</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.creatorEmployeeName">{{ form.creatorEmployeeName }}</span>
-        </div>
-      </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">部门</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.deptName">{{ form.deptName }}</span>
-        </div>
-      </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">合同金额</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.estimatedContractAmount">{{ form.estimatedContractAmount }}</span>
-        </div>
-      </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">项目毛利</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.estimatedProjectMargin">{{ form.estimatedProjectMargin }}</span>
-        </div>
-      </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">成功率</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.estimatedSuccessRate">{{ form.estimatedSuccessRate }}</span>
-        </div>
-      </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">进单时间</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.estimatedDealTime">{{ form.estimatedDealTime }}</span>
-        </div>
-      </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">商机等级</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.opportunityLevel">{{ form.opportunityLevel }}</span>
-        </div>
-      </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <div class="field-name">备注</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.remarks">{{ form.remarks }}</span>
+        <div class="widget-list">
+          <div class="fx-field x-grid-col-12">
+            <div class="field-label">
+              <span class="field-required">*</span>
+              <div class="field-name">商机编号</div>
+            </div>
+            <div class="field-component">
+              <span :title="form.opportunityCode">{{ form.opportunityCode }}</span>
+            </div>
+          </div>
+          <div class="fx-field x-grid-col-12">
+            <div class="field-label">
+              <span class="field-required">*</span>
+              <div class="field-name">商机名称</div>
+            </div>
+            <div class="field-component">
+              <span :title="form.opportunityName">{{ form.opportunityName }}</span>
+            </div>
+          </div>
+          <div class="fx-field x-grid-col-12">
+            <div class="field-label">
+              <span class="field-required">*</span>
+              <div class="field-name">客户名称</div>
+            </div>
+            <div class="field-component">
+              <span :title="form.customerName">{{ form.customerName }}</span>
+            </div>
+          </div>
+          <div class="fx-field x-grid-col-12">
+            <div class="field-label">
+              <span class="field-required">*</span>
+              <div class="field-name">赢单机率</div>
+            </div>
+            <div class="field-component">
+              <span>{{ form.winRate == 0 ? '高' : form.winRate == 1 ? '中' : '低' }}</span>
+            </div>
+          </div>
+          <div class="fx-field x-grid-col-12">
+            <div class="field-label">
+              <span class="field-required">*</span>
+              <div class="field-name">合同金额</div>
+            </div>
+            <div class="field-component">
+              <span :title="form.estimatedContractAmount">{{ form.estimatedContractAmount }}</span>
+            </div>
+          </div>
+          <div class="fx-field x-grid-col-12">
+            <div class="field-label">
+              <span class="field-required">*</span>
+              <div class="field-name">项目毛利(%)</div>
+            </div>
+            <div class="field-component">
+              <span :title="form.estimatedProjectMargin">{{ form.estimatedProjectMargin }}</span>
+            </div>
+          </div>
+          <div class="fx-field x-grid-col-12">
+            <div class="field-label">
+              <span class="field-required">*</span>
+              <div class="field-name">成功率</div>
+            </div>
+            <div class="field-component">
+              <span :title="form.estimatedSuccessRate">{{ form.estimatedSuccessRate }}</span>
+            </div>
+          </div>
+          <div class="fx-field x-grid-col-12">
+            <div class="field-label">
+              <span class="field-required">*</span>
+              <div class="field-name">进单时间</div>
+            </div>
+            <div class="field-component">
+              <span :title="form.estimatedDealTime">{{ form.estimatedDealTime }}</span>
+            </div>
+          </div>
+          <div class="fx-field x-grid-col-12">
+            <div class="field-label">
+              <span class="field-required">*</span>
+              <div class="field-name">商机等级</div>
+            </div>
+            <div class="field-component">
+              <span>{{ form.opportunityLevel == 0 ? '潜在' : form.opportunityLevel == 1 ? '可能' : '重点跟进' }}</span>
+            </div>
+          </div>
+          <div class="fx-field x-grid-col-12">
+            <div class="field-label">
+              <div class="field-name">附件</div>
+            </div>
+            <div class="field-component">
+              <div v-for="(item, index) in form.fileList" :key="index">
+                <a :href="item.url" target="_blank" :title="item.name" style="color: #5094d5;">{{ item.name }}</a>
+              </div>
+            </div>
+
+          </div>
+          <div class="fx-field x-grid-col-12">
+            <div class="field-label">
+              <div class="field-name">备注</div>
+            </div>
+            <div class="field-component">
+              <span :title="form.remarks">{{ form.remarks }}</span>
+            </div>
+          </div>
         </div>
       </div>
-    </div>
-  </div>
     </el-dialog>
   </div>
 </template>
 
 <script>
-import { listBusiness, getBusiness, delBusiness, addBusiness, updateBusiness, exportBusiness } from "@/api/crm/business";
+import { listSimpleCustomer } from "@/api/crm/customer";
+import { getOpportunityCode, listBusiness, getBusiness, delBusiness, addBusiness, updateBusiness, exportBusiness } from "@/api/crm/business";
 import { getBaseHeader } from "@/utils/request";
 export default {
   data() {
     return {
+      customerListAll: [],
+      customerList: [],
       files: [],
       // 设置上传的请求头部
       headers: getBaseHeader(),
@@ -272,42 +339,75 @@ export default {
       queryParams: {
         pageNo: 1,
         pageSize: 10,
+        opportunityCode: undefined,
         opportunityName: undefined,
-        projectType: undefined,
-        creatorName: undefined,
+        customerId: undefined,
+        winRate: undefined,
+        opportunityLevel: undefined,
+        creatorEmployeeName: undefined,
         estimatedDealTime: [],
+        status: undefined,
       },
       // 表单参数
       form: {},
       // 表单校验
       rules: {
+
+        opportunityCode: [
+          { required: true, message: '请输入商机编号', trigger: 'blur' },
+        ],
         opportunityName: [
           { required: true, message: '请输入商机名称', trigger: 'blur' },
         ],
-        estimatedDealTime: [
-          { required: true, message: '请选择成立时间', trigger: 'blur' }
+        customerId: [
+          { required: true, message: '请选择客户', trigger: 'change' },
+        ],
+        winRate: [
+          { required: true, message: '请选择赢单机率', trigger: 'change' },
         ],
         estimatedContractAmount: [
           { required: true, message: '请输入金额', trigger: 'blur' },
           {
-              pattern: /^(([1-9]{1}\d{0,9})|(0{1}))(\.\d{1,2})?$/,
-              message: "请输入合法的金额数字,最多两位小数",
-              trigger: "blur"
+            pattern: /^(([1-9]{1}\d{0,9})|(0{1}))(\.\d{1,2})?$/,
+            message: "请输入合法的金额数字,最多两位小数",
+            trigger: "blur"
           }
         ],
-        projectType: [
-          { required: true, message: '请输入项目类型', trigger: 'blur' },
+        estimatedProjectMargin: [
+          { required: true, message: '请输入项目毛利', trigger: 'blur' },
         ],
-        customerId: [
-          { required: true, message: '请输入客户名称', trigger: 'blur' },
+        estimatedSuccessRate: [
+          { required: true, message: '请选择预计项目成功率', trigger: 'change' },
+        ],
+        estimatedDealTime: [
+          { required: true, message: '请选择进单时间', trigger: 'blur' },
+        ],
+        opportunityLevel: [
+          { required: true, message: '请选择商机等级', trigger: 'change' },
         ],
       },
     };
   },
   created() {
     this.getList();
+    this.getListSimpleCustomerAll();
   },
   methods: {
+    getListSimpleCustomerAll() {
+      listSimpleCustomer().then(response => {
+        this.customerListAll = response.data;
+      });
+    },
+    getListSimpleCustomer() {
+      listSimpleCustomer({ isOpen: 0 }).then(response => {
+        this.customerList = response.data;
+      });
+    },
+    getOpportunityCode() {
+      getOpportunityCode().then(response => {
+        this.form.opportunityCode = response.data;
+      });
+    },
     handleRemove(file, fileList) {
       console.log(file, fileList);
       let fileIds = [];
@@ -363,18 +463,16 @@ export default {
     // 表单重置
     reset() {
       this.form = {
+        opportunityCode: undefined,
         opportunityName: undefined,
-        projectType: undefined,
         customerId: undefined,
-        creatorEmployeeName: undefined,
-        deptName: undefined,
+        winRate: undefined,
         estimatedContractAmount: undefined,
         estimatedProjectMargin: undefined,
         estimatedSuccessRate: undefined,
-
-
         estimatedDealTime: undefined,
         opportunityLevel: undefined,
+        fileIdList: undefined,
         remarks: undefined,
       };
       this.resetForm("form");
@@ -392,6 +490,8 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
+      this.getOpportunityCode();
+      this.getListSimpleCustomer();
       this.open = true;
       this.title = "添加";
     },
@@ -409,6 +509,7 @@ export default {
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
+      this.getListSimpleCustomer();
       const id = row.id;
       getBusiness(id).then(response => {
         let files = response.data.fileList;
@@ -472,7 +573,7 @@ export default {
         this.exportLoading = true;
         return exportBusiness(params);
       }).then(response => {
-        this.$download.excel(response, '客户信息.xls');
+        this.$download.excel(response, '商机信息.xls');
         this.exportLoading = false;
       }).catch(() => { });
     }

+ 105 - 81
src/views/crm/customer/index.vue

@@ -1,22 +1,32 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="客户编号" prop="customerCode">
+        <el-input v-model="queryParams.customerCode" placeholder="请输入客户编号" clearable style="width: 250px"
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
       <el-form-item label="客户名称" prop="customerName">
         <el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable style="width: 250px"
           @keyup.enter.native="handleQuery" />
       </el-form-item>
-      <el-form-item label="行业" prop="trade">
-        <el-input v-model="queryParams.trade" placeholder="请输入行业" clearable style="width: 250px"
+      <el-form-item label="成立日期" prop="registDate">
+        <el-date-picker v-model="queryParams.registDate" style="width: 250px" value-format="yyyy-MM-dd HH:mm:ss"
+          type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+          :default-time="['00:00:00', '23:59:59']" />
+      </el-form-item>
+      <el-form-item label="联系人" prop="customerPerson">
+        <el-input v-model="queryParams.customerPerson" placeholder="请输入客户名称" clearable style="width: 250px"
           @keyup.enter.native="handleQuery" />
       </el-form-item>
-      <el-form-item label="添加人" prop="creatorName">
-        <el-input v-model="queryParams.creatorName" placeholder="添加人" clearable style="width: 250px"
+      <el-form-item label="手机号" prop="customerPersonPhone">
+        <el-input v-model="queryParams.customerPersonPhone" placeholder="请输入客户名称" clearable style="width: 250px"
           @keyup.enter.native="handleQuery" />
       </el-form-item>
-      <el-form-item label="成立时间" prop="registDate">
-        <el-date-picker v-model="queryParams.registDate" style="width: 250px" value-format="yyyy-MM-dd HH:mm:ss"
-          type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
-          :default-time="['00:00:00', '23:59:59']" />
+      <el-form-item label="是否开启" prop="isOpen">
+        <el-select v-model="queryParams.isOpen" placeholder="状态" clearable style="width: 250px">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)" :key="parseInt(dict.value)"
+            :label="dict.label" :value="parseInt(dict.value)" />
+        </el-select>
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
@@ -37,20 +47,26 @@
     </el-row>
 
     <el-table v-loading="loading" :data="dataList">
-      <el-table-column label="客户名称" align="center" prop="customerName" min-width="100" />
-      <el-table-column label="行业" align="center" prop="trade" min-width="100" />
-      <el-table-column label="客户成立时间" align="center" prop="registDate" min-width="120" />
+      <el-table-column label="客户编号" align="center" prop="customerCode" min-width="350" />
+      <el-table-column label="客户名称" align="center" prop="customerName" min-width="150" />
+      <el-table-column label="客户成立日期" align="center" prop="registDate" min-width="100" />
       <el-table-column label="注册资本金(万元)" align="center" prop="capital" min-width="150" />
-      <el-table-column label="客户地址" align="center" prop="companyAddress" min-width="100" />
-      <el-table-column label="客户联系人" align="center" prop="customerPerson" min-width="100" />
-      <el-table-column label="客户联系手机号" align="center" prop="customerPersonPhone" min-width="150" />
-      <el-table-column label="添加人" align="center" prop="creatorName" min-width="80" />
-      <el-table-column label="添加时间" align="center" prop="createTime" min-width="150">
+      <el-table-column label="法人代表" align="center" prop="legalPerson" min-width="100" />
+      <el-table-column label="员工人数" align="center" prop="workforce" min-width="100" />
+      <el-table-column label="联系人" align="center" prop="customerPerson" min-width="100" />
+      <el-table-column label="联系人手机号" align="center" prop="customerPersonPhone" min-width="150" />
+      <el-table-column label="状态" align="center">
+        <template v-slot="scope">
+          <el-switch v-model="scope.row.isOpen" :active-value="0" :inactive-value="1" @change="handleStatusChange(scope.row)" />
+        </template>
+      </el-table-column>
+      <el-table-column label="创建人" align="center" prop="creatorEmployeeName" min-width="100" />
+      <el-table-column label="创建时间" align="center" prop="createTime" min-width="150">
         <template v-slot="scope">
           <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" min-width="150">
+      <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width" min-width="150">
         <template v-slot="scope">
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
             v-hasPermi="['customer:info:update']">修改</el-button>
@@ -68,13 +84,18 @@
     <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
+          <el-col :span="24">
+            <el-form-item label="客户编号" prop="customerCode">
+              <el-input v-model="form.customerCode" placeholder='请输入客户名称' disabled></el-input>
+            </el-form-item>
+          </el-col>
           <el-col :span="24">
             <el-form-item label="客户名称" prop="customerName">
-              <el-input maxlength="20" v-model="form.customerName" placeholder='请输入客户名称'></el-input>
+              <el-input maxlength="30" v-model="form.customerName" placeholder='请输入客户名称'></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="成立时间" prop="registDate">
+            <el-form-item label="成立日期" prop="registDate">
               <el-date-picker value-format="yyyy-MM-dd" v-model="form.registDate" type="date" placeholder="选择日期"
                 style="width: 100%;">
               </el-date-picker>
@@ -87,32 +108,22 @@
           </el-col>
           <el-col :span="24">
             <el-form-item label="法人代表" prop="legalPerson">
-              <el-input v-model="form.legalPerson" placeholder='请输入法人代表'></el-input>
+              <el-input maxlength="10" v-model="form.legalPerson" placeholder='请输入法人代表'></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="24">
             <el-form-item label="员工人数" prop="workforce">
-              <el-input v-model="form.workforce" placeholder='请输入员工人数'></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="行业" prop="trade">
-              <el-input v-model="form.trade" placeholder='请输入行业'></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="企业性质" prop="customerNature">
-              <el-input v-model="form.customerNature" placeholder='请输入企业性质'></el-input>
+              <el-input-number v-model="form.workforce" :min="1" label="员工人数" style="width: 100%;"></el-input-number>
             </el-form-item>
           </el-col>
           <el-col :span="24">
             <el-form-item label="客户地址" prop="companyAddress">
-              <el-input v-model="form.companyAddress" placeholder='请输入客户地址'></el-input>
+              <el-input maxlength="30" v-model="form.companyAddress" placeholder='请输入客户地址'></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="24">
             <el-form-item label="联系人" prop="customerPerson">
-              <el-input v-model="form.customerPerson" placeholder='请输入客户联系人'></el-input>
+              <el-input maxlength="10" v-model="form.customerPerson" placeholder='请输入客户联系人'></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="24">
@@ -122,16 +133,11 @@
           </el-col>
           <el-col :span="24">
             <el-form-item label="办公地址" prop="companyPersonAddress">
-              <el-input v-model="form.companyPersonAddress" placeholder='请输入客户联系人办公地址'></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="24">
-            <el-form-item label="客户来源" prop="customerFrom">
-              <el-input v-model="form.customerFrom" placeholder='请输入客户来源'></el-input>
+              <el-input maxlength="30" v-model="form.companyPersonAddress" placeholder='请输入客户联系人办公地址'></el-input>
             </el-form-item>
           </el-col>
           <el-col :span="24">
-            <el-form-item label="营业执照">
+            <el-form-item label="附件">
               <el-upload :action="fileUrl" :headers="headers" :file-list="files" :on-success="handleFileSuccessCite"
                 :before-upload="beforeUploadFile" :on-remove="handleRemove">
                 <el-button size="small" type="primary">点击上传</el-button>
@@ -155,6 +161,15 @@
     <el-dialog :title="title" :visible.sync="openDetail" width="800px" append-to-body>
       <div class="widget-wrapper">
     <div class="widget-list">
+      <div class="fx-field x-grid-col-12">
+        <div class="field-label">
+          <span class="field-required">*</span>
+          <div class="field-name">客户编号</div>
+        </div>
+        <div class="field-component">
+          <span :title="form.customerCode">{{ form.customerCode }}</span>
+        </div>
+      </div>
       <div class="fx-field x-grid-col-12">
         <div class="field-label">
           <span class="field-required">*</span>
@@ -167,7 +182,7 @@
       <div class="fx-field x-grid-col-12">
         <div class="field-label">
           <span class="field-required">*</span>
-          <div class="field-name">成立时间</div>
+          <div class="field-name">成立日期</div>
         </div>
         <div class="field-component">
           <span :title="form.registDate">{{ form.registDate }}</span>
@@ -195,7 +210,6 @@
       </div>
       <div class="fx-field x-grid-col-12">
         <div class="field-label">
-          <span class="field-required">*</span>
           <div class="field-name">员工人数</div>
         </div>
         <div class="field-component">
@@ -203,24 +217,6 @@
         </div>
       </div>
 
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">行业</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.trade">{{ form.trade }}</span>
-        </div>
-      </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">企业性质</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.customerNature">{{ form.customerNature }}</span>
-        </div>
-      </div>
       <div class="fx-field x-grid-col-12">
         <div class="field-label">
           <span class="field-required">*</span>
@@ -250,26 +246,16 @@
       </div>
       <div class="fx-field x-grid-col-12">
         <div class="field-label">
-          <span class="field-required">*</span>
           <div class="field-name">办公地址</div>
         </div>
         <div class="field-component">
           <span :title="form.companyPersonAddress">{{ form.companyPersonAddress }}</span>
         </div>
       </div>
-      <div class="fx-field x-grid-col-12">
-        <div class="field-label">
-          <span class="field-required">*</span>
-          <div class="field-name">客户来源</div>
-        </div>
-        <div class="field-component">
-          <span :title="form.customerFrom">{{ form.customerFrom }}</span>
-        </div>
-      </div>
 
       <div class="fx-field x-grid-col-12">
         <div class="field-label">
-          <div class="field-name">营业执照</div>
+          <div class="field-name">附件</div>
         </div>
         <div class="field-component">
           <div v-for="(item, index) in form.fileList" :key="index">
@@ -293,8 +279,9 @@
 </template>
 
 <script>
-import { listCustomer, getCustomer, delCustomer, addCustomer, updateCustomer, exportCustomer } from "@/api/crm/customer";
+import { changeUserStatus,getCustomerCode,listCustomer, getCustomer, delCustomer, addCustomer, updateCustomer, exportCustomer } from "@/api/crm/customer";
 import { getBaseHeader } from "@/utils/request";
+import {CommonStatusEnum} from "@/utils/constants";
 export default {
   data() {
     return {
@@ -322,20 +309,28 @@ export default {
       queryParams: {
         pageNo: 1,
         pageSize: 10,
+        customerCode: undefined,
         customerName: undefined,
-        trade: undefined,
-        creatorName: undefined,
         registDate: [],
+        customerPerson: undefined,
+        customerPersonPhone: undefined,
+        isOpen:undefined,
+        
       },
+      // 枚举
+      SysCommonStatusEnum: CommonStatusEnum,
       // 表单参数
       form: {},
       // 表单校验
       rules: {
+        customerCode: [
+          { required: true, message: '请输入客户编号', trigger: 'blur' },
+        ],
         customerName: [
           { required: true, message: '请输入客户名称', trigger: 'blur' },
         ],
         registDate: [
-          { required: true, message: '请选择成立时间', trigger: 'blur' }
+          { required: true, message: '请选择成立日期', trigger: 'blur' }
         ],
         capital: [
           { required: true, message: '请输入金额', trigger: 'blur' },
@@ -348,9 +343,21 @@ export default {
         legalPerson: [
           { required: true, message: '请输入法人代表', trigger: 'blur' },
         ],
-        workforce: [
-          { required: true, message: '请输入员工人数', trigger: 'blur' },
+        companyAddress: [
+          { required: true, message: '请输入客户地址', trigger: 'blur' },
+        ],
+        customerPerson: [
+          { required: true, message: '请输入联系人', trigger: 'blur' },
+        ],
+        customerPersonPhone: [
+          {
+            required: true,
+            pattern: /^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/,
+            message: "请输入正确的手机号码",
+            trigger: "blur"
+          }
         ],
+        
       },
     };
   },
@@ -358,6 +365,11 @@ export default {
     this.getList();
   },
   methods: {
+    getCustomerCode(){
+      getCustomerCode().then(response => {
+        this.form.customerCode = response.data;
+      });
+    },
     handleRemove(file, fileList) {
       console.log(file, fileList);
       let fileIds = [];
@@ -404,6 +416,19 @@ export default {
         this.total = response.data.total;
         this.loading = false;
       });
+    },
+      // 用户状态修改
+      handleStatusChange(row) {
+      let text = row.isOpen === CommonStatusEnum.ENABLE ? "开启" : "关闭";
+      this.$modal.confirm('确认要"' + text + '""' + row.customerName + '"客户吗?').then(function() {
+          return changeUserStatus(row.id, row.isOpen);
+        }).then(() => {
+          this.$modal.msgSuccess(text + "成功");
+          this.getList();
+        }).catch(function() {
+          row.isOpen = row.isOpen === CommonStatusEnum.ENABLE ? CommonStatusEnum.DISABLE
+              : CommonStatusEnum.ENABLE;
+        });
     },
     // 取消按钮
     cancel() {
@@ -413,20 +438,18 @@ export default {
     // 表单重置
     reset() {
       this.form = {
+        customerCode: undefined,
         customerName: undefined,
         registDate: undefined,
         capital: undefined,
         legalPerson: undefined,
-        workforce: undefined,
-        trade: undefined,
-        customerNature: undefined,
+        workforce: 1,
         companyAddress: undefined,
 
 
         customerPerson: undefined,
         customerPersonPhone: undefined,
         companyPersonAddress: undefined,
-        customerFrom: undefined,
         fileIdList: undefined,
         remarks: undefined,
       };
@@ -445,6 +468,7 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
+      this.getCustomerCode();
       this.open = true;
       this.title = "添加";
     },