Explorar o código

feature(项目):项目详情及升级功能优化

ZZH-wl %!s(int64=2) %!d(string=hai) anos
pai
achega
a90cdc8856

+ 1 - 1
package.json

@@ -4,7 +4,7 @@
   "private": true,
   "author": "chuzhixin",
   "scripts": {
-    "serve": "vue-cli-service serve --mode development",
+    "serve": "nvm use v14.21.3 && vue-cli-service serve --mode development",
     "build:dev": "vue-cli-service build --mode development",
     "build": "vue-cli-service build -mode production",
     "build:test": "vue-cli-service build --mode test",

+ 1 - 1
src/components/select/SelectCustomerBid.vue

@@ -73,7 +73,7 @@
     props: {
       title: {
         type: String,
-        default: '选择客户联系人',
+        default: '选择历史招标信息',
       },
       add: Boolean,
       multiple: Boolean,

+ 13 - 8
src/components/select/SelectDistributorContact.vue

@@ -11,16 +11,12 @@
           @keyup.enter.native="fetchData" />
         <el-button icon="el-icon-search" type="primary" @click="fetchData">查询</el-button>
 
-        <!--        <span>显示:</span>-->
-        <!--        <el-radio-group v-model="queryForm.type">-->
-        <!--          <el-radio-button label="全部客户" />-->
-        <!--          <el-radio-button label="我负责的客户" />-->
-        <!--        </el-radio-group>-->
         <table-tool
           :columns="columns"
           :show-columns.sync="showColumns"
           style="float: right"
           table-type="selectCustomerContactTable" />
+        <el-button style="float: right; margin-right: 10px" type="primary" @click="handleAdd">新建</el-button>
       </el-col>
     </el-row>
     <el-table ref="contactTable" v-loading="listLoading" :data="list" @selection-change="setSelectRows">
@@ -57,16 +53,20 @@
       <el-button size="mini" type="primary" @click="save">保存</el-button>
       <el-button size="mini" @click="innerVisible = false">取消</el-button>
     </span>
+    <!-- 新建联系人弹窗 -->
+    <add-distributor-contact ref="contact" :dist-id="defaultDist.distId" @initData="fetchData" />
   </el-dialog>
 </template>
 
 <script>
   import distrApi from '@/api/base/distr'
   import TableTool from '@/components/table/TableTool'
+  import AddDistributorContact from '@/views/base/distributor/components/EditContact'
 
   export default {
     name: 'SelectContact',
     components: {
+      AddDistributorContact,
       TableTool,
     },
     props: {
@@ -76,11 +76,11 @@
       },
       add: Boolean,
       multiple: Boolean,
-      // 示例{ custId: id, custName: custName}
-      defaultCustomer: {
+      // 示例{ distId: id, distName: distName }
+      defaultDist: {
         type: Object,
         default() {
-          return {}
+          return { distId: undefined, distName: undefined }
         },
       },
       queryParams: {
@@ -147,6 +147,11 @@
     },
     mounted() {},
     methods: {
+      handleAdd() {
+        this.$refs.contact.distId = this.defaultDist.distId
+        this.$refs.contact.open()
+        console.log(this.defaultDist, 'this.defaultDist--------------------')
+      },
       open() {
         this.innerVisible = true
         this.fetchData()

+ 3 - 0
src/views/base/distributor/components/EditContact.vue

@@ -121,6 +121,9 @@
           this.contactForm = { ...row }
         }
         this.contactVisible = true
+        console.log(this.contactForm, 'this.contactForm--------------------')
+        console.log(this.distId, 'this.distId--------------------')
+
       },
       // 联系人新建
       async contactSave() {

+ 26 - 251
src/views/proj/business/components/BusinessAdd.vue

@@ -1,13 +1,7 @@
 <template>
   <el-dialog append-to-body :title="title" :visible.sync="dialogFormVisible" width="60%" @close="close">
-    <el-steps :active="activeSteps" align-center style="margin: -15px 0 15px 0">
-      <el-step title="创建项目" />
-      <el-step title="添加产品" />
-      <!--      <el-step title="跟进日程" />-->
-    </el-steps>
-
     <el-form ref="form" :model="form" :rules="rules">
-      <el-row v-if="activeSteps === 1" :gutter="20">
+      <el-row :gutter="20">
         <el-col :span="8">
           <el-form-item label="关联客户" prop="custName">
             <el-input
@@ -30,21 +24,6 @@
             <el-input v-model="form.nboName" />
           </el-form-item>
         </el-col>
-        <el-col :span="8">
-          <el-form-item label="主要联系人" prop="contactName">
-            <el-input v-model="form.contactName" readonly suffix-icon="el-icon-search" @focus="handleSelectContact" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="职位" prop="contactPostion">
-            <el-input v-model="form.contactPostion" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="联系电话" prop="contactTelephone">
-            <el-input v-model="form.contactTelephone" />
-          </el-form-item>
-        </el-col>
         <el-col :span="8">
           <el-form-item label="项目来源" prop="nboSource">
             <el-select v-model="form.nboSource" clearable placeholder="项目来源" style="width: 100%">
@@ -52,6 +31,16 @@
             </el-select>
           </el-form-item>
         </el-col>
+        <el-col v-if="form.nboSource === '80'" :span="8">
+          <el-form-item label="招标信息" prop="bidInfo">
+            <el-input
+              v-model="form.bidInfo"
+              :disabled="!isBid || !canSelectBid"
+              readonly
+              suffix-icon="el-icon-search"
+              @focus="handleSelectCustomerBid" />
+          </el-form-item>
+        </el-col>
         <el-col :span="8">
           <el-form-item label="销售工程师" prop="saleName">
             <el-input
@@ -87,31 +76,6 @@
               @focus="handleSelectDistributor" />
           </el-form-item>
         </el-col>
-        <el-col :span="8">
-          <el-form-item label="是否来自历史招标信息" prop="isBid">
-            <el-switch
-              v-model="isBid"
-              active-text="是"
-              :disabled="!canSelectBid"
-              inactive-text="否"
-              style="width: 100%" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="招标信息" prop="bidInfo">
-            <el-input
-              v-model="form.bidInfo"
-              :disabled="!isBid || !canSelectBid"
-              readonly
-              suffix-icon="el-icon-search"
-              @focus="handleSelectCustomerBid" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="项目预算" prop="nboBudget">
-            <amount-input v-model.trim="form.nboBudget" placeholder="请输入金额" />
-          </el-form-item>
-        </el-col>
         <el-col :span="8">
           <el-form-item label="是否大项目" prop="isBig">
             <el-select v-model="form.isBig" placeholder="请选择" style="width: 100%">
@@ -119,49 +83,10 @@
             </el-select>
           </el-form-item>
         </el-col>
-        <!--        <el-col :span="8">-->
-        <!--          <el-form-item label="预计成交价格" prop="estTransPrice">-->
-        <!--            <amount-input v-model.trim="form.estTransPrice" placeholder="请输入金额" />-->
-        <!--          </el-form-item>-->
-        <!--        </el-col>-->
-        <el-col :span="8">
-          <el-form-item label="预计成交时间" prop="estTransTime">
-            <el-date-picker v-model="form.estTransTime" placeholder="选择日期" style="width: 100%" type="datetime" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="计划采购时间" prop="planPurchaseTime">
-            <el-date-picker
-              v-model="form.planPurchaseTime"
-              placeholder="选择日期"
-              style="width: 100%"
-              type="datetime" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="风险情况" prop="riskProfile">
-            <el-input v-model="form.riskProfile" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="困难点" prop="difficulty">
-            <el-input v-model="form.difficulty" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="竞争公司" prop="competitor">
-            <el-input v-model="form.competitor" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="介入情况" prop="intervention">
-            <el-input v-model="form.intervention" />
-          </el-form-item>
-        </el-col>
         <el-col :span="8">
           <el-form-item label="项目类别" prop="nboType">
             <el-select v-model="form.nboType" placeholder="请选择" style="width: 100%">
-              <el-option label="C" value="30" />
+              <el-option label="C类" value="30" />
               <el-option label="储备" value="50" />
             </el-select>
           </el-form-item>
@@ -172,57 +97,12 @@
           </el-form-item>
         </el-col>
       </el-row>
-      <el-row v-if="activeSteps === 2" :gutter="20">
-        <el-col :span="24">
-          <el-button size="mini" type="primary" @click="handleSelectProduct">添加产品</el-button>
-          <product-table
-            ref="productTable"
-            :product-data="productData"
-            @changeProductData="changeProductData"
-            @delProductData="delProductData" />
-        </el-col>
-      </el-row>
-
-      <!--      <el-row v-if="activeSteps === 3" :gutter="20">-->
-      <!--        <el-col :span="12">-->
-      <!--          <el-form-item label="跟进时间" prop="followTime">-->
-      <!--            <el-date-picker v-model="form.followTime" placeholder="选择时间" style="width: 100%" type="datetime" />-->
-      <!--          </el-form-item>-->
-      <!--        </el-col>-->
-      <!--        <el-col :span="12">-->
-      <!--          <el-form-item label="负责人员" prop="followUserName">-->
-      <!--            <el-input-->
-      <!--              v-model="form.followUserName"-->
-      <!--              readonly-->
-      <!--              suffix-icon="el-icon-search"-->
-      <!--              @focus="handleSelectFollowUser" />-->
-      <!--          </el-form-item>-->
-      <!--        </el-col>-->
-      <!--        <el-col :span="24">-->
-      <!--          <el-form-item label="跟进内容" prop="followContent">-->
-      <!--            <el-input-->
-      <!--              v-model="form.followContent"-->
-      <!--              placeholder="请输入跟进内容"-->
-      <!--              rows="5"-->
-      <!--              show-word-limit-->
-      <!--              type="textarea" />-->
-      <!--          </el-form-item>-->
-      <!--        </el-col>-->
-      <!--      </el-row>-->
     </el-form>
     <div slot="footer" class="dialog-footer">
-      <el-button v-if="activeSteps !== 1" type="primary" @click="activeSteps--">上一步</el-button>
-      <el-button v-if="activeSteps !== 2" type="primary" @click="nextStep">下一步</el-button>
-      <el-button v-if="activeSteps === 2" :loading="loading" type="primary" @click="save">提 交</el-button>
+      <el-button :loading="loading" type="primary" @click="save">提 交</el-button>
     </div>
     <!-- 选择客户弹窗 -->
     <select-customer ref="selectCustomer" @save="selectCustomer" />
-    <!-- 选择客户联系人弹窗 -->
-    <select-contact
-      ref="selectContact"
-      :default-customer="customerInfo"
-      :query-params="queryContact"
-      @save="selectContact" />
     <!-- 选择客户招标信息弹窗 -->
     <select-customer-bid ref="selectCustomerBid" :query-params="queryContact" @save="selectCustomerBid" />
     <!-- 选择销售工程师弹窗 -->
@@ -232,10 +112,6 @@
       @save="selectSales" />
     <!-- 选择经销商弹窗 -->
     <select-distributor ref="selectDistributor" @save="selectDistributor" />
-    <!-- 选择产品弹窗 -->
-    <select-product ref="selectProduct" multiple @save="selectProduct" />
-    <!-- 选择跟进负责人弹窗 -->
-    <select-user ref="selectFollowUser" @save="selectFollowUser" />
   </el-dialog>
 </template>
 
@@ -243,22 +119,14 @@
   import to from 'await-to-js'
   import { mapGetters } from 'vuex'
   import businessApi from '@/api/proj/business'
-  import AmountInput from '@/components/currency'
-  import ProductTable from './ProductTable'
   import SelectCustomerBid from '@/components/select/SelectCustomerBid'
-  import SelectContact from '@/components/select/SelectCustomerContact'
   import SelectCustomer from '@/components/select/SelectCustomer'
   import SelectUser from '@/components/select/SelectUser'
   import SelectDistributor from '@/components/select/SelectDistributor'
-  import SelectProduct from '@/components/select/SelectProduct'
 
   export default {
-    name: 'BusinessEdit',
+    name: 'BusinessAdd',
     components: {
-      AmountInput,
-      ProductTable,
-      SelectContact,
-      SelectProduct,
       SelectDistributor,
       SelectCustomer,
       SelectUser,
@@ -286,52 +154,32 @@
           nboName: '',
           custId: undefined,
           custName: '',
-          obtainTime: undefined,
+          productLine: undefined,
           nboSource: undefined,
-          contactId: undefined,
-          contactName: undefined,
-          contactPostion: undefined,
-          contactTelephone: undefined,
+          bidId: undefined,
+          bidInfo: undefined,
           saleId: undefined,
           saleName: undefined,
+          salesModel: undefined,
           distributorId: undefined,
           distributorName: undefined,
-          productLine: undefined,
-          nboBudget: 0,
           isBig: '20',
-          planPurchaseTime: undefined,
-          estTransTime: undefined,
-          estTransPrice: undefined,
-          riskProfile: undefined,
-          difficulty: undefined,
-          competitor: undefined,
-          intervention: undefined,
-          remark: undefined,
-          products: undefined,
           nboType: '30',
-          bidId: undefined,
-          bidInfo: undefined,
-          // 跟进
-          followTime: new Date(),
-          followUserId: undefined,
-          followUserName: undefined,
-          followContent: undefined,
+          remark: undefined,
         },
         rules: {
-          nboName: [{ required: true, trigger: ['blur', 'change'], message: '请输入项目名称' }],
           custName: [{ required: true, trigger: ['blur', 'change'], message: '请选择关联客户' }],
+          productLine: [{ required: true, trigger: ['blur', 'change'], message: '请选择产品线' }],
+          nboName: [{ required: true, trigger: ['blur', 'change'], message: '请输入项目名称' }],
           nboSource: [{ required: true, trigger: ['blur', 'change'], message: '请选择项目来源' }],
-          contactName: [{ required: true, trigger: ['blur', 'change'], message: '请选择主要联系人' }],
+          bidInfo: [{ required: true, trigger: ['blur', 'change'], message: '请选择招标信息' }],
           saleName: [{ required: true, trigger: ['blur', 'change'], message: '请选择销售工程师' }],
           salesModel: [{ required: true, trigger: ['blur', 'change'], message: '请选择销售模式' }],
           distributorName: [
             { validator: validateDistributor, trigger: ['blur', 'change'], message: '请选择经销商/代理商' },
           ],
           isBig: [{ required: true, trigger: ['blur', 'change'], message: '请选择是否大项目' }],
-          productLine: [{ required: true, trigger: ['blur', 'change'], message: '请选择产品线' }],
-          // 跟进
-          followTime: [{ required: true, trigger: ['blur', 'change'], message: '请输入跟进时间' }],
-          followContent: [{ required: true, trigger: ['blur', 'change'], message: '请输入跟进内容' }],
+          nboType: [{ required: true, trigger: ['blur', 'change'], message: '请选择项目类别' }],
         },
         title: '',
         dialogFormVisible: false,
@@ -341,7 +189,6 @@
         yesOrNoOptions: [],
         queryContact: {},
         customerInfo: {},
-        productData: [],
         isBid: true,
       }
     },
@@ -378,18 +225,6 @@
           this.yesOrNoOptions = yesOrNo.data.values || []
         })
       },
-      nextStep() {
-        if (this.activeSteps === 1) {
-          this.$refs['form'].validate(async (valid) => {
-            if (valid) {
-              this.activeSteps++
-            }
-          })
-        } else if (this.activeSteps === 2) {
-          this.form.products = this.productData
-          this.activeSteps++
-        }
-      },
       changeSalesModel() {
         if (this.form.salesModel === '10') {
           this.form.distributorId = undefined
@@ -402,25 +237,12 @@
       handleSelectCustomer() {
         this.$refs.selectCustomer.open()
       },
-      handleSelectContact() {
-        if (!this.queryContact.custId) {
-          this.$message.warning('请先选择客户')
-          return
-        }
-        this.$refs.selectContact.open()
-      },
       handleSelectSale() {
         this.$refs.selectSales.open()
       },
       handleSelectDistributor() {
         this.$refs.selectDistributor.open()
       },
-      handleSelectProduct() {
-        this.$refs.selectProduct.open()
-      },
-      handleSelectFollowUser() {
-        this.$refs.selectFollowUser.open()
-      },
       handleSelectCustomerBid() {
         if (!this.isBid) {
           return
@@ -449,14 +271,6 @@
           this.form.nboName = this.form.custName + productLineName
         }
       },
-      selectContact(val) {
-        if (val && val.length > 0) {
-          this.form.contactId = val[0].id
-          this.form.contactName = val.map((item) => item.cuctName).join()
-          this.form.contactPostion = val.map((item) => item.postion).join()
-          this.form.contactTelephone = val.map((item) => item.telephone).join()
-        }
-      },
       selectSales(val) {
         if (val && val.length > 0) {
           this.form.saleId = val[0].id
@@ -469,52 +283,13 @@
           this.form.distributorName = val.map((item) => item.distName).join()
         }
       },
-      selectFollowUser(val) {
-        this.form.followUserName = val.map((item) => item.nickName).join()
-      },
-      selectProduct(data) {
-        let projData = data.map((item) => ({
-          prodId: item.id,
-          prodCode: item.prodCode,
-          prodName: item.prodName,
-          prodClass: item.prodClass,
-          guidPrice: item.guidPrice,
-          prodPrice: item.marketPrice,
-          prodNum: 1,
-        }))
-        this.productData.push(...projData)
-        this.productData = this.removeDuplicateObj(this.productData)
-      },
       selectCustomerBid(val) {
         if (val && val.length > 0) {
           this.form.bidId = val[0].id
           this.form.bidInfo = val[0].title
         }
       },
-      // 数组对象去重
-      removeDuplicateObj(arr) {
-        let obj = {}
-        arr = arr.reduce((newArr, next) => {
-          obj[next.prodId] ? '' : (obj[next.prodId] = true && newArr.push(next))
-          return newArr
-        }, [])
-        return arr
-      },
-      // 修改产品列表数据
-      changeProductData(data) {
-        this.productData = this.productData.map((item) => {
-          return item.prodId === data.prodId ? data : item
-        })
-      },
-      delProductData(data) {
-        this.productData = this.productData.filter((item) => item.prodId !== data.prodId)
-      },
-      async getProductData(busId) {
-        const { data } = await businessApi.getProductByBusinessId({ id: busId })
-        if (data) {
-          this.productData = data
-        }
-      },
+
       showEdit(row, bid) {
         this.activeSteps = 1
         this.productData = []
@@ -544,18 +319,18 @@
             custId: this.form.custId,
             custName: this.form.custName,
           }
-          this.getProductData(row.id)
         }
+        this.$nextTick(() => this.$refs['form'].clearValidate())
         this.dialogFormVisible = true
       },
       close() {
         this.$refs['form'].resetFields()
+        this.$refs['form'].clearValidate()
         this.form = this.$options.data().form
         this.dialogFormVisible = false
         this.loading = false
       },
       save() {
-        this.form.products = this.productData
         this.$refs['form'].validate(async (valid) => {
           if (valid) {
             this.loading = true

+ 234 - 223
src/views/proj/business/components/BusinessEdit.vue

@@ -1,21 +1,21 @@
 <template>
-  <el-dialog append-to-body :title="title" :visible.sync="dialogFormVisible" width="60%" @close="close">
+  <el-dialog
+    append-to-body
+    style="margin-top: -8vh"
+    :title="title"
+    :visible.sync="dialogFormVisible"
+    width="60%"
+    @close="close">
     <el-steps :active="activeSteps" align-center style="margin: -15px 0 15px 0">
-      <el-step title="创建项目" />
+      <el-step title="修改项目" />
       <el-step title="添加产品" />
-      <!--      <el-step title="跟进日程" />-->
     </el-steps>
 
     <el-form ref="form" :model="form" :rules="rules">
       <el-row v-if="activeSteps === 1" :gutter="20">
         <el-col :span="8">
           <el-form-item label="关联客户" prop="custName">
-            <el-input
-              v-model="form.custName"
-              :disabled="Boolean(custInfo.custName)"
-              readonly
-              suffix-icon="el-icon-search"
-              @focus="handleSelectCustomer" />
+            <el-input v-model="form.custName" disabled readonly />
           </el-form-item>
         </el-col>
         <el-col :span="8">
@@ -30,21 +30,6 @@
             <el-input v-model="form.nboName" />
           </el-form-item>
         </el-col>
-        <el-col :span="8">
-          <el-form-item label="主要联系人" prop="contactName">
-            <el-input v-model="form.contactName" readonly suffix-icon="el-icon-search" @focus="handleSelectContact" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="职位" prop="contactPostion">
-            <el-input v-model="form.contactPostion" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="联系电话" prop="contactTelephone">
-            <el-input v-model="form.contactTelephone" />
-          </el-form-item>
-        </el-col>
         <el-col :span="8">
           <el-form-item label="项目来源" prop="nboSource">
             <el-select v-model="form.nboSource" clearable placeholder="项目来源" style="width: 100%">
@@ -52,6 +37,16 @@
             </el-select>
           </el-form-item>
         </el-col>
+        <el-col v-if="form.nboSource === '80'" :span="8">
+          <el-form-item label="招标信息" prop="bidInfo">
+            <el-input
+              v-model="form.bidInfo"
+              :disabled="!isBid"
+              readonly
+              suffix-icon="el-icon-search"
+              @focus="handleSelectCustomerBid" />
+          </el-form-item>
+        </el-col>
         <el-col :span="8">
           <el-form-item label="销售工程师" prop="saleName">
             <el-input
@@ -87,26 +82,6 @@
               @focus="handleSelectDistributor" />
           </el-form-item>
         </el-col>
-        <el-col :span="8">
-          <el-form-item label="是否来自历史招标信息" prop="isBid">
-            <el-switch v-model="isBid" active-text="是" inactive-text="否" style="width: 100%" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="招标信息" prop="bidInfo">
-            <el-input
-              v-model="form.bidInfo"
-              :disabled="!isBid"
-              readonly
-              suffix-icon="el-icon-search"
-              @focus="handleSelectCustomerBid" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="项目预算" prop="nboBudget">
-            <amount-input v-model.trim="form.nboBudget" placeholder="请输入金额" />
-          </el-form-item>
-        </el-col>
         <el-col :span="8">
           <el-form-item label="是否大项目" prop="isBig">
             <el-select v-model="form.isBig" placeholder="请选择" style="width: 100%">
@@ -115,128 +90,128 @@
           </el-form-item>
         </el-col>
         <!--        <el-col :span="8">-->
-        <!--          <el-form-item label="预计成交价格" prop="estTransPrice">-->
-        <!--            <amount-input v-model.trim="form.estTransPrice" placeholder="请输入金额" />-->
+        <!--          <el-form-item label="项目类别" prop="nboType">-->
+        <!--            <el-select v-model="form.nboType" placeholder="请选择" style="width: 100%">-->
+        <!--              <el-option label="C类" value="30" />-->
+        <!--              <el-option label="储备" value="50" />-->
+        <!--            </el-select>-->
         <!--          </el-form-item>-->
         <!--        </el-col>-->
+        <!--   C => B     -->
         <el-col :span="8">
-          <el-form-item label="预计成交时间" prop="estTransTime">
-            <el-date-picker v-model="form.estTransTime" placeholder="选择日期" style="width: 100%" type="datetime" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="计划采购时间" prop="planPurchaseTime">
-            <el-date-picker
-              v-model="form.planPurchaseTime"
-              placeholder="选择日期"
-              style="width: 100%"
-              type="datetime" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="风险情况" prop="riskProfile">
-            <el-input v-model="form.riskProfile" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="困难点" prop="difficulty">
-            <el-input v-model="form.difficulty" />
+          <el-form-item label="项目预算" prop="nboBudget">
+            <amount-input v-model.trim="form.nboBudget" placeholder="请输入金额" />
           </el-form-item>
         </el-col>
+        <div v-if="form.salesModel !== '10'">
+          <el-col :span="8">
+            <el-form-item label="渠道销售人员" prop="dealerSalesName">
+              <el-input
+                v-model="form.dealerSalesName"
+                readonly
+                suffix-icon="el-icon-search"
+                @focus="handleSelectDistributorContact" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="渠道销售电话/微信" prop="dealerSalesContact">
+              <el-input v-model="form.dealerSalesContact" />
+            </el-form-item>
+          </el-col>
+        </div>
+        <!--        <el-col :span="8">-->
+        <!--          <el-form-item-->
+        <!--            label="报价单"-->
+        <!--            prop="quotationFile"-->
+        <!--            :required="form.nboType === '10' || form.nboType === '20'">-->
+        <!--            <el-upload-->
+        <!--              :action="uploadFileUrl"-->
+        <!--              :file-list="quotationFileList"-->
+        <!--              :limit="1"-->
+        <!--              :on-success="setQuotationFile">-->
+        <!--              <el-button size="mini" type="primary">点击上传</el-button>-->
+        <!--            </el-upload>-->
+        <!--          </el-form-item>-->
+        <!--        </el-col>-->
+        <!--   B => A     -->
         <el-col :span="8">
-          <el-form-item label="竞争公司" prop="competitor">
-            <el-input v-model="form.competitor" />
+          <el-form-item label="采购方式" prop="purchasingWay">
+            <el-select v-model="form.purchasingWay" placeholder="请选择" style="width: 100%">
+              <el-option v-for="item in purchasingWayOptions" :key="item.key" :label="item.value" :value="item.key" />
+            </el-select>
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="介入情况" prop="intervention">
-            <el-input v-model="form.intervention" />
+          <el-form-item label="资金来源" prop="capitalSource">
+            <el-input v-model="form.capitalSource" />
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="技术支持时间" prop="technicalSupportTime">
+          <el-form-item label="计划采购时间" prop="planPurchaseTime">
             <el-date-picker
-              v-model="form.technicalSupportTime"
+              v-model="form.planPurchaseTime"
               placeholder="选择日期"
               style="width: 100%"
-              type="datetime" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="技术支持人员" prop="technicalSupportName">
-            <el-input v-model="form.technicalSupportName" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="技术支持内容" prop="technicalSupportContent">
-            <el-input v-model="form.technicalSupportContent" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="总部对接人" prop="parentReceiver">
-            <el-input v-model="form.parentReceiver" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="资金来源" prop="capitalSource">
-            <el-input v-model="form.capitalSource" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="项目预算期限" prop="nboBudgetTime">
-            <el-date-picker v-model="form.nboBudgetTime" placeholder="选择日期" style="width: 100%" type="datetime" />
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss" />
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="产品/方案满足情况" prop="productSatisfaction">
-            <el-input v-model="form.productSatisfaction" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="8">
-          <el-form-item label="采购方式" prop="purchasingWay">
-            <!-- <el-input v-model="form.purchasingWay" /> -->
-            <el-select v-model="form.purchasingWay" placeholder="请选择" style="width: 100%">
-              <el-option v-for="item in purchasingWayOptions" :key="item.key" :label="item.value" :value="item.key" />
-            </el-select>
+          <el-form-item label="客户决策人" prop="makerName">
+            <el-input v-model="form.makerName" />
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="采购时间" prop="purchasingTime">
-            <el-date-picker v-model="form.purchasingTime" placeholder="选择日期" style="width: 100%" type="datetime" />
+          <el-form-item label="客户决策部门" prop="makerDept">
+            <el-input v-model="form.makerDept" />
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="决策人员" prop="makerName">
-            <el-input v-model="form.makerName" />
+          <el-form-item label="客户联系人" prop="contactName">
+            <el-input
+              v-model="form.contactName"
+              readonly
+              suffix-icon="el-icon-search"
+              @focus="handleSelectCustomerContact" />
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="决策部门" prop="makerDept">
-            <el-input v-model="form.makerDept" />
+          <el-form-item label="客户联系人电话/微信" prop="contactTelephone">
+            <el-input v-model="form.contactTelephone" />
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="经销商销售人员" prop="dealerSalesName">
-            <el-input v-model="form.dealerSalesName" />
+          <el-form-item label="竞争公司" prop="competitor">
+            <el-input v-model="form.competitor" />
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="维护部门及人员" prop="accendant">
-            <el-input v-model="form.accendant" />
+          <el-form-item label="客户倾向厂家" prop="customerIntentionFactory">
+            <el-input v-model="form.customerIntentionFactory" />
           </el-form-item>
         </el-col>
-        <!-- <el-col :span="8">
-          <el-form-item label="是否采纳大数技术参数" prop="isAdoptDashoo">
-            <el-select
-              v-model="form.isAdoptDashoo"
-              clearable
-              placeholder="是否采纳"
-              style="width: 100%"
-              @change="changeSalesModel" :disabled="true">
-              <el-option v-for="dict in yesOrNoOptions" :key="dict.key" :label="dict.value" :value="dict.key" />
-            </el-select>
-          </el-form-item>
-        </el-col> -->
+        <!--        <el-col :span="8">-->
+        <!--          <el-form-item-->
+        <!--            label="是否采纳大数技术参数"-->
+        <!--            prop="isAdoptDashoo"-->
+        <!--            :required="type === 'up' && form.nboType === '10'">-->
+        <!--            <el-radio-group v-model="form.isAdoptDashoo" style="width: 100%">-->
+        <!--              <el-radio label="10">是</el-radio>-->
+        <!--              <el-radio label="20">否</el-radio>-->
+        <!--            </el-radio-group>-->
+        <!--          </el-form-item>-->
+        <!--        </el-col>-->
+        <!--        <el-col v-if="form.isAdoptDashoo === '10'" :span="8">-->
+        <!--          <el-form-item label="参数文件" prop="dashooParamFile" :required="form.isAdoptDashoo === '10'">-->
+        <!--            <el-upload-->
+        <!--              :action="uploadFileUrl"-->
+        <!--              :file-list="dashooParamFileList"-->
+        <!--              :limit="1"-->
+        <!--              :on-success="setDashooParamFile">-->
+        <!--              <el-button size="mini" type="primary">点击上传</el-button>-->
+        <!--            </el-upload>-->
+        <!--          </el-form-item>-->
+        <!--        </el-col>-->
         <el-col :span="24">
           <el-form-item label="备注信息" prop="remark">
             <el-input v-model="form.remark" placeholder="请输入备注信息" rows="3" show-word-limit type="textarea" />
@@ -253,33 +228,6 @@
             @delProductData="delProductData" />
         </el-col>
       </el-row>
-
-      <!--      <el-row v-if="activeSteps === 3" :gutter="20">-->
-      <!--        <el-col :span="12">-->
-      <!--          <el-form-item label="跟进时间" prop="followTime">-->
-      <!--            <el-date-picker v-model="form.followTime" placeholder="选择时间" style="width: 100%" type="datetime" />-->
-      <!--          </el-form-item>-->
-      <!--        </el-col>-->
-      <!--        <el-col :span="12">-->
-      <!--          <el-form-item label="负责人员" prop="followUserName">-->
-      <!--            <el-input-->
-      <!--              v-model="form.followUserName"-->
-      <!--              readonly-->
-      <!--              suffix-icon="el-icon-search"-->
-      <!--              @focus="handleSelectFollowUser" />-->
-      <!--          </el-form-item>-->
-      <!--        </el-col>-->
-      <!--        <el-col :span="24">-->
-      <!--          <el-form-item label="跟进内容" prop="followContent">-->
-      <!--            <el-input-->
-      <!--              v-model="form.followContent"-->
-      <!--              placeholder="请输入跟进内容"-->
-      <!--              rows="5"-->
-      <!--              show-word-limit-->
-      <!--              type="textarea" />-->
-      <!--          </el-form-item>-->
-      <!--        </el-col>-->
-      <!--      </el-row>-->
     </el-form>
     <div slot="footer" class="dialog-footer">
       <el-button v-if="activeSteps !== 1" type="primary" @click="activeSteps--">上一步</el-button>
@@ -289,13 +237,13 @@
     <!-- 选择客户弹窗 -->
     <select-customer ref="selectCustomer" @save="selectCustomer" />
     <!-- 选择客户联系人弹窗 -->
-    <select-contact
-      ref="selectContact"
+    <select-customer-contact
+      ref="selectCustomerContact"
       :default-customer="customerInfo"
-      :query-params="queryContact"
-      @save="selectContact" />
+      :query-params="queryCustomerContact"
+      @save="selectCustomerContact" />
     <!-- 选择客户招标信息弹窗 -->
-    <select-customer-bid ref="selectCustomerBid" :query-params="queryContact" @save="selectCustomerBid" />
+    <select-customer-bid ref="selectCustomerBid" :query-params="queryCustomerContact" @save="selectCustomerBid" />
     <!-- 选择销售工程师弹窗 -->
     <select-user
       ref="selectSales"
@@ -303,32 +251,38 @@
       @save="selectSales" />
     <!-- 选择经销商弹窗 -->
     <select-distributor ref="selectDistributor" @save="selectDistributor" />
+    <!-- 选择渠道销售人员弹窗 -->
+    <select-distributor-contact
+      ref="selectDistributorContact"
+      :default-dist="distInfo"
+      :query-params="queryDistContact"
+      @save="selectDistributorContact" />
     <!-- 选择产品弹窗 -->
     <select-product ref="selectProduct" multiple @save="selectProduct" />
-    <!-- 选择跟进负责人弹窗 -->
-    <select-user ref="selectFollowUser" @save="selectFollowUser" />
   </el-dialog>
 </template>
 
 <script>
-  import businessApi from '@/api/proj/business'
-  import AmountInput from '@/components/currency'
   import to from 'await-to-js'
   import { mapGetters } from 'vuex'
+  import businessApi from '@/api/proj/business'
+  import AmountInput from '@/components/currency'
   import ProductTable from './ProductTable'
-  import SelectCustomerBid from '@/components/select/SelectCustomerBid'
-  import SelectContact from '@/components/select/SelectCustomerContact'
   import SelectCustomer from '@/components/select/SelectCustomer'
-  import SelectUser from '@/components/select/SelectUser'
+  import SelectCustomerContact from '@/components/select/SelectCustomerContact'
+  import SelectCustomerBid from '@/components/select/SelectCustomerBid'
   import SelectDistributor from '@/components/select/SelectDistributor'
+  import SelectDistributorContact from '@/components/select/SelectDistributorContact'
+  import SelectUser from '@/components/select/SelectUser'
   import SelectProduct from '@/components/select/SelectProduct'
 
   export default {
     name: 'BusinessEdit',
     components: {
+      SelectCustomerContact,
+      SelectDistributorContact,
       AmountInput,
       ProductTable,
-      SelectContact,
       SelectProduct,
       SelectDistributor,
       SelectCustomer,
@@ -350,8 +304,9 @@
         else callback()
       }
       return {
-        loading: false,
+        canSelectBid: true,
         activeSteps: 1,
+        loading: false,
         form: {
           nboName: '',
           custId: undefined,
@@ -378,48 +333,54 @@
           intervention: undefined,
           remark: undefined,
           products: undefined,
+          nboType: '30',
           bidId: undefined,
           bidInfo: undefined,
-
           // 跟进
           followTime: new Date(),
           followUserId: undefined,
           followUserName: undefined,
           followContent: undefined,
-
-          //20230330 新添加编辑
-          nextFollowTime: undefined,
-          finalFollowTime: undefined,
-          technicalSupportTime: undefined,
-          technicalSupportName: undefined,
-          technicalSupportContent: undefined,
-          parentReceiver: undefined,
-          capitalSource: undefined,
-          nboBudgetTime: undefined,
-          productSatisfaction: undefined,
-          purchasingWay: undefined,
-          purchasingTime: undefined,
-          makerName: undefined,
-          makerDept: undefined,
-          dealerSalesName: undefined,
-          accendant: undefined,
-          isAdoptDashoo: undefined,
         },
         rules: {
-          nboName: [{ required: true, trigger: ['blur', 'change'], message: '请输入项目名称' }],
           custName: [{ required: true, trigger: ['blur', 'change'], message: '请选择关联客户' }],
+          productLine: [{ required: true, trigger: ['blur', 'change'], message: '请选择产品线' }],
+          nboName: [{ required: true, trigger: ['blur', 'change'], message: '请输入项目名称' }],
           nboSource: [{ required: true, trigger: ['blur', 'change'], message: '请选择项目来源' }],
-          contactName: [{ required: true, trigger: ['blur', 'change'], message: '请选择主要联系人' }],
+          bidInfo: [{ required: true, trigger: ['blur', 'change'], message: '请选择招标信息' }],
           saleName: [{ required: true, trigger: ['blur', 'change'], message: '请选择销售工程师' }],
           salesModel: [{ required: true, trigger: ['blur', 'change'], message: '请选择销售模式' }],
           distributorName: [
             { validator: validateDistributor, trigger: ['blur', 'change'], message: '请选择经销商/代理商' },
           ],
           isBig: [{ required: true, trigger: ['blur', 'change'], message: '请选择是否大项目' }],
-          productLine: [{ required: true, trigger: ['blur', 'change'], message: '请选择产品线' }],
-          // 跟进
-          followTime: [{ required: true, trigger: ['blur', 'change'], message: '请输入跟进时间' }],
-          followContent: [{ required: true, trigger: ['blur', 'change'], message: '请输入跟进内容' }],
+
+          nboType: [{ required: true, trigger: ['blur', 'change'], message: '请选择项目类别' }],
+          // C => B
+          nboBudget: [
+            { required: true, trigger: ['blur', 'change'], message: '请输入项目预算' },
+            // { validator: validateNboBudget, trigger: ['blur', 'change'], message: '项目预算应大于0' },
+          ],
+          dealerSalesId: [{ required: true, trigger: ['blur', 'change'], message: '请选择渠道销售' }],
+          dealerSalesName: [{ required: true, trigger: ['blur', 'change'], message: '请选择项渠道销售人员' }],
+          dealerSalesContact: [{ required: true, trigger: ['blur', 'change'], message: '请输入渠道销售电话/微信' }],
+          estTransPrice: [{ required: true, trigger: ['blur', 'change'], message: '请选择预计出货金额' }],
+          // quotationFile: [{ required: true, trigger: ['blur', 'change'], message: '请选择报价单' }],
+          products: [{ required: true, trigger: ['blur', 'change'], message: '请选择产品' }],
+          // B => A
+          purchasingWay: [{ required: true, trigger: ['blur', 'change'], message: '请选择采购方式' }],
+          capitalSource: [{ required: true, trigger: ['blur', 'change'], message: '请输入资金来源' }],
+          planPurchaseTime: [{ required: true, trigger: ['blur', 'change'], message: '请选择计划采购时间' }],
+          contactId: [{ required: true, trigger: ['blur', 'change'], message: '请选择客户联系人' }],
+          contactName: [{ required: true, trigger: ['blur', 'change'], message: '请选择客户联系人姓名' }],
+          contactTelephone: [{ required: true, trigger: ['blur', 'change'], message: '请输入客户联系人电话/微信' }],
+          makerId: [{ required: true, trigger: ['blur', 'change'], message: '请选择客户决策人' }],
+          makerName: [{ required: true, trigger: ['blur', 'change'], message: '请选择客户决策人姓名' }],
+          makerDept: [{ required: true, trigger: ['blur', 'change'], message: '请选择客户决策部门' }],
+          customerIntentionFactory: [{ required: true, trigger: ['blur', 'change'], message: '请输入客户倾向厂家' }],
+          competitor: [{ required: true, trigger: ['blur', 'change'], message: '请输入竞争公司' }],
+          // isAdoptDashoo: [{ required: true, trigger: ['blur', 'change'], message: '请选择是或否' }],
+          // dashooParamFile: [{ validator: validateAdoptDashoo, trigger: ['blur', 'change'], message: '请选择上传文件' }],
         },
         title: '',
         dialogFormVisible: false,
@@ -427,11 +388,13 @@
         salesModelOptions: [],
         productLineOptions: [],
         yesOrNoOptions: [],
-        queryContact: {},
+        purchasingWayOptions: [],
+        queryCustomerContact: {},
         customerInfo: {},
+        queryDistContact: {},
+        distInfo: {},
         productData: [],
         isBid: true,
-        purchasingWayOptions: [],
       }
     },
     computed: {
@@ -444,7 +407,7 @@
     watch: {
       custInfo: function (val) {
         this.form.custId = val.custId
-        this.queryContact.custId = val.custId
+        this.queryCustomerContact.custId = val.custId
         this.form.custName = val.custName
         this.customerInfo = val
       },
@@ -461,16 +424,15 @@
           this.getDicts('sys_product_line'),
           this.getDicts('sys_yes_no'),
           this.getDicts('proj_purchasing_way'),
-        ]).then(([nboSource, salesModel, productLine, yesOrNo, purchasingWay]) => {
+        ]).then(([nboSource, salesModel, productLine, yesOrNo, purchasing]) => {
           this.nboSourceOptions = nboSource.data.values || []
           this.salesModelOptions = salesModel.data.values || []
           this.productLineOptions = productLine.data.values || []
           this.yesOrNoOptions = yesOrNo.data.values || []
-          this.purchasingWayOptions = purchasingWay.data.values || []
+          this.purchasingWayOptions = purchasing.data.values || []
         })
       },
       nextStep() {
-        console.log(typeof this.form.nboBudget)
         if (this.activeSteps === 1) {
           this.$refs['form'].validate(async (valid) => {
             if (valid) {
@@ -494,12 +456,12 @@
       handleSelectCustomer() {
         this.$refs.selectCustomer.open()
       },
-      handleSelectContact() {
-        if (!this.queryContact.custId) {
+      handleSelectCustomerContact() {
+        if (!this.queryCustomerContact.custId) {
           this.$message.warning('请先选择客户')
           return
         }
-        this.$refs.selectContact.open()
+        this.$refs.selectCustomerContact.open()
       },
       handleSelectSale() {
         this.$refs.selectSales.open()
@@ -507,17 +469,17 @@
       handleSelectDistributor() {
         this.$refs.selectDistributor.open()
       },
+      handleSelectDistributorContact() {
+        this.$refs.selectDistributorContact.open()
+      },
       handleSelectProduct() {
         this.$refs.selectProduct.open()
       },
-      handleSelectFollowUser() {
-        this.$refs.selectFollowUser.open()
-      },
       handleSelectCustomerBid() {
         if (!this.isBid) {
           return
         }
-        if (!this.queryContact.custId) {
+        if (!this.queryCustomerContact.custId) {
           this.$message.warning('请先选择客户')
           return
         }
@@ -525,7 +487,7 @@
       },
       selectCustomer(val) {
         if (val && val.length > 0) {
-          this.queryContact.custId = val[0].id
+          this.queryCustomerContact.custId = val[0].id
           this.customerInfo = {
             custId: val[0].id,
             custName: val[0].custName,
@@ -541,12 +503,24 @@
           this.form.nboName = this.form.custName + productLineName
         }
       },
-      selectContact(val) {
+      selectCustomerContact(val) {
         if (val && val.length > 0) {
           this.form.contactId = val[0].id
           this.form.contactName = val.map((item) => item.cuctName).join()
           this.form.contactPostion = val.map((item) => item.postion).join()
-          this.form.contactTelephone = val.map((item) => item.telephone).join()
+          this.form.contactTelephone = val
+            .map((item) => {
+              if (item.telephone !== '' && item.wechat !== '') {
+                return item.telephone + '/' + item.wechat
+              }
+              if (item.telephone !== '') {
+                return item.telephone
+              }
+              if (item.wechat !== '') {
+                return item.wechat
+              }
+            })
+            .join()
         }
       },
       selectSales(val) {
@@ -557,12 +531,39 @@
       },
       selectDistributor(val) {
         if (val && val.length > 0) {
+          this.form.dealerSalesId = undefined
+          this.form.dealerSalesName = undefined
+          this.form.dealerSalesContact = undefined
+
+          this.queryDistContact = {
+            distId: val[0].id,
+          }
+          this.distInfo = {
+            distId: val[0].id,
+            distName: val[0].distName,
+          }
           this.form.distributorId = val[0].id
           this.form.distributorName = val.map((item) => item.distName).join()
         }
       },
-      selectFollowUser(val) {
-        this.form.followUserName = val.map((item) => item.nickName).join()
+      selectDistributorContact(val) {
+        if (val && val.length > 0) {
+          this.form.dealerSalesId = val[0].id
+          this.form.dealerSalesName = val.map((item) => item.name).join()
+          this.form.dealerSalesContact = val
+            .map((item) => {
+              if (item.phone !== '' && item.wechat !== '') {
+                return item.phone + '/' + item.wechat
+              }
+              if (item.phone !== '') {
+                return item.phone
+              }
+              if (item.wechat !== '') {
+                return item.wechat
+              }
+            })
+            .join()
+        }
       },
       selectProduct(data) {
         let projData = data.map((item) => ({
@@ -578,7 +579,6 @@
         this.productData = this.removeDuplicateObj(this.productData)
       },
       selectCustomerBid(val) {
-        console.log(val)
         if (val && val.length > 0) {
           this.form.bidId = val[0].id
           this.form.bidInfo = val[0].title
@@ -608,10 +608,18 @@
           this.productData = data
         }
       },
-      showEdit(row) {
+      showEdit(row, bid) {
         this.activeSteps = 1
         this.productData = []
-        if (!row) {
+        if (bid) {
+          this.canSelectBid = false
+          this.isBid = true
+          this.selectCustomer([{ id: bid.custId, custName: bid.cuctName }])
+          this.selectCustomerBid([bid])
+        } else {
+          this.canSelectBid = true
+        }
+        if (!row.id) {
           this.title = '添加'
           if (this.roleKeys.includes('SalesEngineer') || this.roleKeys.includes('ProductLineManager')) {
             this.form.saleId = this.userId
@@ -624,17 +632,18 @@
           if (this.form.bidId) {
             this.isBid = true
           }
-          this.queryContact.custId = this.form.custId
-          this.customerInfo = {
-            custId: this.form.custId,
-            custName: this.form.custName,
-          }
+          this.queryCustomerContact.custId = this.form.custId
+          this.customerInfo = { custId: this.form.custId, custName: this.form.custName }
+          this.queryDistContact = { distId: this.form.distributorId }
+          this.distInfo = { distId: this.form.distributorId, distName: this.form.distributorName }
           this.getProductData(row.id)
         }
+        this.$nextTick(() => this.$refs['form'].clearValidate())
         this.dialogFormVisible = true
       },
       close() {
         this.$refs['form'].resetFields()
+        this.$refs['form'].clearValidate()
         this.form = this.$options.data().form
         this.dialogFormVisible = false
         this.loading = false
@@ -647,6 +656,7 @@
             if (this.form.id) {
               const [err, res] = await to(businessApi.doEdit(this.form))
               if (err) {
+                this.loading = false
                 this.$baseMessage(res.msg, 'error')
               } else {
                 this.$baseMessage(res.msg, 'success')
@@ -654,6 +664,7 @@
             } else {
               const [err, res] = await to(businessApi.doAdd(this.form))
               if (err) {
+                this.loading = false
                 this.$baseMessage(res.msg, 'error')
               } else {
                 this.$baseMessage(res.msg, 'success')

+ 323 - 196
src/views/proj/business/components/BusinessGradation.vue

@@ -8,7 +8,7 @@
       @click="handleClick('up')">
       升级
     </el-button>
-    <!--未在审批中 且级别为 A、B 可J降级-->
+    <!--未在审批中 且级别为 A、B 可降级-->
     <el-button
       v-permissions="['proj:business:downgrade']"
       :disabled="!['10', '20'].includes(businessInfo.nboType) || businessInfo.approStatus === '20'"
@@ -16,8 +16,15 @@
       @click="handleClick('down')">
       降级
     </el-button>
+
     <el-dialog append-to-body :title="title" :visible.sync="dialogFormVisible" width="60%" @close="close">
-      <el-form ref="form" label-position="top" :model="form" :rules="rules" style="margin-top: -20px">
+      <el-form
+        v-if="type === 'up'"
+        ref="form"
+        label-position="top"
+        :model="form"
+        :rules="rules"
+        style="margin-top: -20px">
         <el-form-item label="项目类别" prop="nboType">
           <el-select v-model="form.nboType" placeholder="请选择项目类别" style="width: 100%">
             <el-option
@@ -35,55 +42,77 @@
             <!--            <el-option v-if="type === 'down'" label="储备" value="50" />-->
           </el-select>
         </el-form-item>
-        <!--   C-B     项目预算 经销商/代理商 技术支持时间 技术支持人员 技术支持内容 总部对接人 项目预算期限 资金来源 产品/方案满足情况-->
-        <el-row v-if="type === 'up' && form.nboType !== '30'" :gutter="20">
+        <!--   C-B     必填项:项目类别、项目预算、渠道销售人员、渠道销售电话、微信、预计出货金额(不填)、添加产品、上传报价单  -->
+        <el-row v-if="form.nboType !== '30'" :gutter="20">
           <el-col :span="8">
             <el-form-item label="项目预算" prop="nboBudget">
               <amount-input v-model.trim="form.nboBudget" placeholder="请输入金额" />
             </el-form-item>
           </el-col>
+          <div v-if="businessInfo.salesModel !== '10'">
+            <el-col :span="8">
+              <el-form-item label="渠道销售人员" prop="dealerSalesName">
+                <el-input
+                  v-model="form.dealerSalesName"
+                  readonly
+                  suffix-icon="el-icon-search"
+                  @focus="handleSelectDistributorContact" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="渠道销售电话/微信" prop="dealerSalesContact">
+                <el-input v-model="form.dealerSalesContact" />
+              </el-form-item>
+            </el-col>
+          </div>
           <el-col :span="8">
-            <el-form-item label="经销商/代理商" prop="distributorName">
-              <el-input
-                v-model="form.distributorName"
-                readonly
-                suffix-icon="el-icon-search"
-                @focus="handleSelectDistributor" />
+            <el-form-item
+              label="报价单"
+              prop="quotationFile"
+              :required="form.nboType === '10' || form.nboType === '20'">
+              <el-upload
+                :action="uploadFileUrl"
+                :file-list="quotationFileList"
+                :limit="1"
+                :on-success="setQuotationFile">
+                <el-button size="mini" type="primary">点击上传</el-button>
+              </el-upload>
             </el-form-item>
           </el-col>
-          <el-col :span="8">
-            <el-form-item label="总部对接人" prop="parentReceiver">
-              <el-input v-model="form.parentReceiver" />
-            </el-form-item>
+          <el-col :span="24">
+            <div style="float: right; margin-bottom: 10px">
+              <span style="margin-right: 10px; color: red">预计出货金额:{{ formatPrice(form.estTransPrice) }}</span>
+              <el-button size="mini" type="primary" @click="handleSelectProduct">添加产品</el-button>
+            </div>
+
+            <product-table
+              ref="productTable"
+              :product-data="productData"
+              @changeProductData="changeProductData"
+              @delProductData="delProductData" />
           </el-col>
         </el-row>
-        <el-row v-if="!(type === 'up' && form.nboType === '30')" :gutter="20">
+        <!--    B-A    必填项:采购方式、资金来源、计划采购时间、客户决策人、客户决策部分、客户联系人姓名、客户联系人电话/微信、是否采纳我司技术参数(是/否)、竞争公司、客户倾向厂家  -->
+        <el-row v-if="form.nboType === '10'" :gutter="20">
           <el-col :span="8">
-            <el-form-item label="技术支持人员" prop="technicalSupportName" :required="type === 'up'">
-              <el-input v-model="form.technicalSupportName" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="技术支持内容" prop="technicalSupportContent" :required="type === 'up'">
-              <el-input v-model="form.technicalSupportContent" />
+            <el-form-item label="采购方式" prop="purchasingWay" :required="type === 'up' && form.nboType === '10'">
+              <el-select v-model="form.purchasingWay" placeholder="请选择" style="width: 100%">
+                <el-option v-for="item in purchasingWayOptions" :key="item.key" :label="item.value" :value="item.key" />
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="技术支持时间" prop="technicalSupportTime" :required="type === 'up'">
-              <el-date-picker
-                v-model="form.technicalSupportTime"
-                placeholder="选择日期"
-                style="width: 100%"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss" />
+            <el-form-item label="资金来源" prop="capitalSource">
+              <el-input v-model="form.capitalSource" />
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row v-if="type === 'up' && form.nboType !== '30'" :gutter="20">
           <el-col :span="8">
-            <el-form-item label="项目预算期限" prop="nboBudgetTime">
+            <el-form-item
+              label="计划采购时间"
+              prop="planPurchaseTime"
+              :required="type === 'up' && form.nboType === '10'">
               <el-date-picker
-                v-model="form.nboBudgetTime"
+                v-model="form.planPurchaseTime"
                 placeholder="选择日期"
                 style="width: 100%"
                 type="datetime"
@@ -91,58 +120,37 @@
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="资金来源" prop="capitalSource">
-              <el-input v-model="form.capitalSource" />
+            <el-form-item label="客户决策人" prop="makerName">
+              <el-input v-model="form.makerName" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="产品/方案满足情况" prop="productSatisfaction">
-              <el-input v-model="form.productSatisfaction" />
+            <el-form-item label="客户决策部门" prop="makerDept">
+              <el-input v-model="form.makerDept" />
             </el-form-item>
           </el-col>
-        </el-row>
-        <!--    B-A    采购方式	采购时间	是否采纳大数技术参数(上传附件)	决策部门	决策人员	经销商与客户历史成交信息	经销商销售人员	维护部门及人员-->
-        <el-row v-if="type === 'up' && form.nboType === '10'" :gutter="20">
           <el-col :span="8">
-            <el-form-item label="采购方式" prop="purchasingWay" :required="type === 'up' && form.nboType === '10'">
-              <el-select v-model="form.purchasingWay" placeholder="请选择" style="width: 100%">
-                <el-option v-for="item in purchasingWayOptions" :key="item.key" :label="item.value" :value="item.key" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="采购时间" prop="purchasingTime" :required="type === 'up' && form.nboType === '10'">
-              <el-date-picker
-                v-model="form.purchasingTime"
-                placeholder="选择日期"
-                style="width: 100%"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="决策人员" prop="makerName">
-              <el-input v-model="form.makerName" readonly suffix-icon="el-icon-search" @focus="handleSelectContact" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="8">
-            <el-form-item label="决策部门" prop="makerDept">
-              <el-input v-model="form.makerDept" readonly />
+            <el-form-item label="客户联系人" prop="contactName">
+              <el-input
+                v-model="form.contactName"
+                readonly
+                suffix-icon="el-icon-search"
+                @focus="handleSelectCustomerContact" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="经销商与客户历史成交信息" prop="historicalTransactionInfo">
-              <el-input v-model="form.historicalTransactionInfo" />
+            <el-form-item label="客户联系人电话/微信" prop="contactTelephone">
+              <el-input v-model="form.contactTelephone" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="经销商销售人员" prop="dealerSalesName">
-              <el-input v-model="form.dealerSalesName" />
+            <el-form-item label="竞争公司" prop="competitor">
+              <el-input v-model="form.competitor" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="维护部门及人员" prop="accendant">
-              <el-input v-model="form.accendant" />
+            <el-form-item label="客户倾向厂家" prop="customerIntentionFactory">
+              <el-input v-model="form.customerIntentionFactory" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -168,7 +176,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row v-if="type === 'up' && form.nboType === '30'">
+        <el-row v-if="form.nboType === '30'">
           <el-form-item label="转化原因" prop="projConversionReason">
             <el-input
               v-model="form.projConversionReason"
@@ -180,22 +188,8 @@
           </el-form-item>
         </el-row>
         <el-row v-else>
-          <el-col :span="8">
-            <el-form-item
-              label="报价单"
-              prop="quotationFile"
-              :required="form.nboType === '10' || form.nboType === '20'">
-              <el-upload
-                :action="uploadFileUrl"
-                :file-list="quotationFileList"
-                :limit="1"
-                :on-success="setQuotationFile">
-                <el-button size="mini" type="primary">点击上传</el-button>
-              </el-upload>
-            </el-form-item>
-          </el-col>
-          <el-col :span="16">
-            <el-form-item :label="title + '原因'" prop="remark" :required="type === 'down'">
+          <el-col :span="24">
+            <el-form-item label="升级原因" prop="remark">
               <el-input
                 v-model="form.remark"
                 maxlength="300"
@@ -207,20 +201,60 @@
           </el-col>
         </el-row>
       </el-form>
+      <el-form
+        v-if="type === 'down'"
+        ref="form"
+        label-position="top"
+        :model="form"
+        :rules="rules"
+        style="margin-top: -20px">
+        <el-form-item label="项目类别" prop="nboType">
+          <el-select v-model="form.nboType" placeholder="请选择项目类别" style="width: 100%">
+            <el-option
+              :disabled="
+                (type === 'up' && businessInfo.nboType === '10') ||
+                (type === 'down' && ['10', '20'].includes(businessInfo.nboType))
+              "
+              label="A"
+              value="10" />
+            <el-option :disabled="businessInfo.nboType === '20'" label="B" value="20" />
+            <el-option
+              :disabled="type === 'up' && ['10', '20', '30'].includes(businessInfo.nboType)"
+              label="C"
+              value="30" />
+            <!--            <el-option v-if="type === 'down'" label="储备" value="50" />-->
+          </el-select>
+        </el-form-item>
+        <el-form-item label="降级原因" prop="remark" required>
+          <el-input
+            v-model="form.remark"
+            maxlength="300"
+            placeholder="请输入备注原因"
+            rows="3"
+            show-word-limit
+            type="textarea" />
+        </el-form-item>
+      </el-form>
       <template #footer>
         <el-button @click="close">取 消</el-button>
         <el-button :loading="loading" type="primary" @click="save">确 定</el-button>
       </template>
     </el-dialog>
 
-    <!-- 选择客户决策人弹窗 -->
-    <select-contact
-      ref="selectContact"
+    <!-- 选择客户联系人弹窗 -->
+    <select-customer-contact
+      ref="selectCustomerContact"
       :default-customer="customerInfo"
-      :query-params="queryContact"
-      @save="selectContact" />
-    <!-- 选择经销商弹窗 -->
-    <select-distributor ref="selectDistributor" @save="selectDistributor" />
+      :query-params="queryCustomerContact"
+      @save="selectCustomerContact" />
+    <!-- 选择渠道销售人员弹窗 -->
+    <select-distributor-contact
+      ref="selectDistributorContact"
+      :default-dist="distInfo"
+      :query-params="queryDistContact"
+      @save="selectDistributorContact" />
+    <!-- 选择产品弹窗 -->
+    <select-product ref="selectProduct" multiple @save="selectProduct" />
   </div>
 </template>
 
@@ -228,15 +262,20 @@
   import to from 'await-to-js'
   import businessApi from '@/api/proj/business'
   import AmountInput from '@/components/currency/index.vue'
-  import SelectContact from '@/components/select/SelectCustomerContact'
-  import SelectDistributor from '@/components/select/SelectDistributor'
+  import SelectCustomerContact from '@/components/select/SelectCustomerContact'
+  import SelectDistributorContact from '@/components/select/SelectDistributorContact'
+  import ProductTable from '@/views/proj/business/components/ProductTable.vue'
+  import SelectProduct from '@/components/select/SelectProduct'
+  import {nextTick} from "vue";
 
   export default {
     name: 'BusinessGradation',
     components: {
+      SelectProduct,
+      ProductTable,
       AmountInput,
-      SelectContact,
-      SelectDistributor,
+      SelectCustomerContact,
+      SelectDistributorContact,
     },
     props: {
       // 项目Id
@@ -251,14 +290,6 @@
       },
     },
     data() {
-      const validateTechnicalSupport = (rule, value, callback) => {
-        if (!value && this.type === 'up') callback(new Error('不能为空'))
-        else callback()
-      }
-      const validateUpgradeA = (rule, value, callback) => {
-        if (!value && this.type === 'up' && this.form.nboType === '10') callback(new Error('不能为空'))
-        else callback()
-      }
       const validateDowngrade = (rule, value, callback) => {
         if (!value && this.type === 'down') callback(new Error('不能为空'))
         else callback()
@@ -271,78 +302,72 @@
         if (this.form.isAdoptDashoo === '10' && !value) callback(new Error())
         else callback()
       }
-      const validateQuotationFile = (rule, value, callback) => {
-        if ((this.form.nboType === '10' || this.form.nboType === '20') && !value) callback(new Error())
-        else callback()
-      }
       return {
         title: '项目',
         type: '',
         loading: false,
         form: {
           id: undefined,
-          distributorId: undefined,
-          distributorName: undefined,
-          custId: undefined,
-          custName: undefined,
+          nboType: undefined,
+          // C => B
+          nboBudget: undefined,
+          dealerSalesId: undefined,
+          dealerSalesName: undefined,
+          dealerSalesContact: undefined,
+          estTransPrice: undefined,
+          quotationFile: undefined,
+          products: [],
+          // B => A
+          purchasingWay: undefined,
+          capitalSource: undefined,
+          planPurchaseTime: undefined,
+          contactId: undefined,
+          contactName: undefined,
+          contactTelephone: undefined,
+          contactWechat: undefined,
           makerId: undefined,
           makerName: undefined,
           makerDept: undefined,
           makerPost: undefined,
           makerTelephone: undefined,
-          nboType: undefined,
-          nboBudget: undefined,
-          technicalSupportName: undefined,
-          technicalSupportContent: undefined,
-          technicalSupportTime: undefined,
-          parentReceiver: undefined,
-          nboBudgetTime: undefined,
-          capitalSource: undefined,
-          productSatisfaction: undefined,
-          purchasingWay: undefined,
-          purchasingTime: undefined,
+          customerIntentionFactory: undefined,
+          competitor: undefined,
           isAdoptDashoo: undefined,
-          historicalTransactionInfo: undefined,
-          dealerSalesId: undefined,
-          dealerSalesName: undefined,
-          accendant: undefined,
+          dashooParamFile: undefined,
           projConversionReason: undefined,
           remark: undefined,
-          dashooParamFile: undefined,
-          quotationFile: undefined,
         },
         rules: {
           nboType: [{ required: true, trigger: ['blur', 'change'], message: '请选择项目类别' }],
+          // C => B
           nboBudget: [
             { required: true, trigger: ['blur', 'change'], message: '请输入项目预算' },
-            {
-              validator: validateNboBudget,
-              trigger: ['blur', 'change'],
-              message: '项目预算应大于0',
-            },
-          ],
-          // distributorName: [{ required: true, trigger: ['blur', 'change'], message: '请选择经销商/代理商' }],
-          technicalSupportName: [
-            { validator: validateTechnicalSupport, trigger: ['blur', 'change'], message: '请输入技术支持人员' },
-          ],
-          technicalSupportContent: [
-            { validator: validateTechnicalSupport, trigger: ['blur', 'change'], message: '请输入技术支持内容' },
+            { validator: validateNboBudget, trigger: ['blur', 'change'], message: '项目预算应大于0' },
           ],
-          technicalSupportTime: [
-            { validator: validateTechnicalSupport, trigger: ['blur', 'change'], message: '请选择技术支持时间' },
-          ],
-
-          purchasingTime: [{ validator: validateUpgradeA, trigger: ['blur', 'change'], message: '请选择采购时间' }],
-          purchasingWay: [{ validator: validateUpgradeA, trigger: ['blur', 'change'], message: '请选择采购方式' }],
-          isAdoptDashoo: [{ validator: validateUpgradeA, trigger: ['blur', 'change'], message: '请选择是或否' }],
+          dealerSalesId: [{ required: true, trigger: ['blur', 'change'], message: '请选择渠道销售' }],
+          dealerSalesName: [{ required: true, trigger: ['blur', 'change'], message: '请选择项渠道销售人员' }],
+          dealerSalesContact: [{ required: true, trigger: ['blur', 'change'], message: '请输入渠道销售电话/微信' }],
+          estTransPrice: [{ required: true, trigger: ['blur', 'change'], message: '请选择预计出货金额' }],
+          quotationFile: [{ required: true, trigger: ['blur', 'change'], message: '请选择报价单' }],
+          products: [{ required: true, trigger: ['blur', 'change'], message: '请选择产品' }],
+          // B => A
+          purchasingWay: [{ required: true, trigger: ['blur', 'change'], message: '请选择采购方式' }],
+          capitalSource: [{ required: true, trigger: ['blur', 'change'], message: '请输入资金来源' }],
+          planPurchaseTime: [{ required: true, trigger: ['blur', 'change'], message: '请选择计划采购时间' }],
+          contactId: [{ required: true, trigger: ['blur', 'change'], message: '请选择客户联系人' }],
+          contactName: [{ required: true, trigger: ['blur', 'change'], message: '请选择客户联系人姓名' }],
+          contactTelephone: [{ required: true, trigger: ['blur', 'change'], message: '请输入客户联系人电话/微信' }],
+          makerId: [{ required: true, trigger: ['blur', 'change'], message: '请选择客户决策人' }],
+          makerName: [{ required: true, trigger: ['blur', 'change'], message: '请选择客户决策人姓名' }],
+          makerDept: [{ required: true, trigger: ['blur', 'change'], message: '请选择客户决策部门' }],
+          customerIntentionFactory: [{ required: true, trigger: ['blur', 'change'], message: '请输入客户倾向厂家' }],
+          competitor: [{ required: true, trigger: ['blur', 'change'], message: '请输入竞争公司' }],
+          isAdoptDashoo: [{ required: true, trigger: ['blur', 'change'], message: '请选择是或否' }],
           dashooParamFile: [{ validator: validateAdoptDashoo, trigger: ['blur', 'change'], message: '请选择上传文件' }],
-          quotationFile: [{ validator: validateQuotationFile, trigger: ['blur', 'change'], message: '请选择上传文件' }],
-
-          remark: [{ validator: validateDowngrade, trigger: ['blur', 'change'], message: '请输入原因' }],
           projConversionReason: [{ required: true, trigger: ['blur', 'change'], message: '请输入转化原因' }],
+          remark: [{ validator: validateDowngrade, trigger: ['blur', 'change'], message: '请输入原因' }],
         },
         dialogFormVisible: false,
-        yesOrNoOptions: [],
         purchasingWayOptions: [],
         // 大数参数文件
         dashooParamFileList: [],
@@ -358,8 +383,11 @@
           videoSize: 104857600,
           videoType: '.mp4',
         },
-        queryContact: {},
+        queryCustomerContact: {},
         customerInfo: {},
+        queryDistContact: {},
+        distInfo: {},
+        productData: [],
       }
     },
     mounted() {
@@ -368,10 +396,63 @@
       })
     },
     methods: {
+      selectProduct(data) {
+        let projData = data.map((item) => ({
+          prodId: item.id,
+          prodCode: item.prodCode,
+          prodName: item.prodName,
+          prodClass: item.prodClass,
+          guidPrice: item.guidPrice,
+          prodPrice: item.marketPrice,
+          prodNum: 1,
+        }))
+        this.productData.push(...projData)
+        this.productData = this.removeDuplicateObj(this.productData)
+        this.getEstTransPrice()
+      },
+      // 数组对象去重
+      removeDuplicateObj(arr) {
+        let newArrId = []
+        let newArrObj = []
+        arr.forEach((item) => {
+          if (!newArrId.includes(item.prodId)) {
+            newArrId.push(item.prodId)
+            newArrObj.push(item)
+          }
+        })
+        return newArrObj
+      },
+      handleSelectProduct() {
+        this.$refs.selectProduct.open()
+      },
+      // 修改产品列表数据
+      changeProductData(data) {
+        this.productData = this.productData.map((item) => {
+          return item.prodId === data.prodId ? data : item
+        })
+        this.getEstTransPrice()
+      },
+      delProductData(data) {
+        this.productData = this.productData.filter((item) => item.prodId !== data.prodId)
+        this.getEstTransPrice()
+      },
+      getEstTransPrice() {
+        this.form.estTransPrice = 0
+        for (let item of this.productData) {
+          console.log(item, '--------------------')
+          this.form.estTransPrice += parseFloat(item.prodNum) * parseFloat(item.prodPrice)
+        }
+      },
+      async getProductData(busId) {
+        const { data } = await businessApi.getProductByBusinessId({ id: busId })
+        if (data) {
+          this.productData = data
+        }
+      },
       // 上传文件
       setDashooParamFile(res) {
         // 如果上传成功
-        if (res.Code == 200) {
+        if (res.Code === 200) {
           this.form.dashooParamFile = res.Data
         } else {
           this.$message.error('上传文件失败')
@@ -379,95 +460,137 @@
       },
       setQuotationFile(res) {
         // 如果上传成功
-        if (res.Code == 200) {
+        if (res.Code === 200) {
           this.form.quotationFile = res.Data
         } else {
           this.$message.error('上传文件失败')
         }
       },
-      handleSelectContact() {
-        if (!this.queryContact.custId) {
+      handleSelectCustomerContact() {
+        if (!this.queryCustomerContact.custId) {
           this.$message.warning('请先选择客户')
           return
         }
-        this.$refs.selectContact.open()
+        this.$refs.selectCustomerContact.open()
       },
-      selectContact(val) {
+      selectCustomerContact(val) {
         if (val && val.length > 0) {
-          this.form.makerId = val[0].id
-          this.form.makerName = val.map((item) => item.cuctName)
-          this.form.makerDept = val.map((item) => item.makerDept)
-          this.form.makerPost = val.map((item) => item.postion)
-          this.form.makerTelephone = val.map((item) => item.telephone)
+          this.form.contactId = val[0].id
+          this.form.contactName = val.map((item) => item.cuctName).join()
+          this.form.contactPostion = val.map((item) => item.postion).join()
+          this.form.contactTelephone = val.map((item) => {
+              if (item.telephone !== '' && item.wechat !== '') {
+                return item.telephone + '/' + item.wechat
+              }
+              if (item.telephone !== '') {
+                return item.telephone
+              }
+              if (item.wechat !== '') {
+                return item.wechat
+              }
+            }).join()
         }
       },
-      handleSelectDistributor() {
-        this.$refs.selectDistributor.open()
+      handleSelectDistributorContact() {
+        this.$refs.selectDistributorContact.open()
       },
-      selectDistributor(val) {
+      selectDistributorContact(val) {
         if (val && val.length > 0) {
-          this.form.distributorId = val[0].id
-          this.form.distributorName = val.map((item) => item.distName).join()
+          this.form.dealerSalesId = val[0].id
+          this.form.dealerSalesName = val.map((item) => item.name).join()
+          this.form.dealerSalesContact = val
+            .map((item) => {
+              if (item.phone !== '' && item.wechat !== '') {
+                return item.phone + '/' + item.wechat
+              }
+              if (item.phone !== '') {
+                return item.phone
+              }
+              if (item.wechat !== '') {
+                return item.wechat
+              }
+            })
+            .join()
         }
       },
       // 业务调级(升级、降级)
       handleClick(type) {
+        this.form.id = this.busId
+        this.form = Object.assign(this.form, this.businessInfo)
         if (type === 'up') {
           this.title = '升级'
+          if (this.form.nboType === '50') {
+            this.form.nboType = '30'
+          }
+          if (this.form.nboType === '30') {
+            this.form.nboType = '20'
+          }
+          if (this.form.nboType === '20') {
+            this.form.nboType = '10'
+          }
         }
         if (type === 'down') {
           this.title = '降级'
+          if (this.form.nboType === '30') {
+            this.form.nboType = '50'
+          }
+          if (this.form.nboType === '20') {
+            this.form.nboType = '30'
+          }
+          if (this.form.nboType === '10') {
+            this.form.nboType = '20'
+          }
         }
         this.type = type
-        this.form.id = this.busId
-        this.form = Object.assign(this.form, this.businessInfo)
-        this.form.nboType = undefined
         this.form.isAdoptDashoo = '20'
         this.customerInfo = { custId: this.form.custId, custName: this.form.custName }
-        this.queryContact = { custId: this.form.custId, isDecision: '10' }
+        this.queryCustomerContact = { custId: this.form.custId, isDecision: '10' }
+        this.distInfo = { distId: this.form.distributorId, distName: this.form.distributorName }
+        this.queryDistContact = { distId: this.form.distributorId }
+        this.productData = this.form.products || []
+        if (this.form.quotationFileList) {
+          this.quotationFileList = this.form.quotationFileList.map((item) => {
+            this.form.quotationFile = item.fileUrl
+            return { name: item.fileName, url: item.fileUrl }
+          })
+        }
         this.dialogFormVisible = true
+        this.$nextTick(() => this.$refs['form'].clearValidate())
       },
       open(row) {
         this.form.id = row.id
         this.form = Object.assign(this.form, row)
         this.dialogFormVisible = true
         this.loading = false
+        this.$refs['form'].clearValidate()
       },
       close() {
         this.$refs['form'].resetFields()
+        this.$refs['form'].clearValidate()
         this.form = this.$options.data().form
+        this.productData = []
+        this.quotationFileList = []
+        this.dashooParamFileList = []
         this.dialogFormVisible = false
         this.loading = false
       },
       save() {
+        this.form.products = this.productData
         this.$refs['form'].validate(async (valid) => {
           if (valid) {
             this.$baseConfirm('你确定要对当前项目' + this.title + '吗', null, async () => {
               this.loading = true
+              let err, res
               if (this.type === 'up') {
-                // if (this.form.nboType === '10' || this.form.nboType === '20') {
-                //   const [err, res] = await to(businessApi.BusinessUpgradeAorB(this.form))
-                //   if (err) {
-                //     this.$baseMessage(res.msg, 'error')
-                //   } else {
-                //     this.$baseMessage(res.msg, 'success')
-                //   }
-                // } else {
-                const [err, res] = await to(businessApi.businessUpgrade(this.form))
-                if (err) {
-                  this.$baseMessage(res.msg, 'error')
-                } else {
-                  this.$baseMessage(res.msg, 'success')
-                }
-                // }
+                ;[err, res] = await to(businessApi.businessUpgrade(this.form))
               }
               if (this.type === 'down') {
-                const [err, res] = await to(businessApi.businessDowngrade(this.form))
-                if (err) {
-                  this.$baseMessage(res.msg, 'error')
-                } else {
-                  this.$baseMessage(res.msg, 'success')
-                }
+                ;[err, res] = await to(businessApi.businessDowngrade(this.form))
+              }
+              if (err) {
+                this.$baseMessage(res.msg, 'error')
+              } else {
+                this.$baseMessage(res.msg, 'success')
               }
               this.loading = false
               this.$emit('fetch-data')
@@ -483,4 +606,8 @@
   .el-form-item--small.el-form-item {
     margin-bottom: 10px;
   }
+
+  .el-col-8 {
+    height: 75px;
+  }
 </style>

+ 94 - 99
src/views/proj/business/detail.vue

@@ -9,7 +9,7 @@
             <span>
               <el-button @click="handleFollow">添加跟进</el-button>
               <!--升级、降级-->
-              <business-gradation :bus-id="id" :business-info="details" @fetch-data="init" />
+              <business-gradation :bus-id="id" :business-info="details" @fetch-data="init"/>
               <el-button
                 v-permissions="['proj:business:transfer']"
                 :disabled="details.approStatus === '20'"
@@ -28,7 +28,7 @@
           </h3>
         </div>
         <header>
-          <el-descriptions :colon="false" :column="7" direction="vertical">
+          <el-descriptions :colon="false" :column="8" direction="vertical">
             <!--            <el-descriptions-item content-class-name="my-content" label="项目编码" label-class-name="my-label">-->
             <!--              {{ details.nboCode }}-->
             <!--            </el-descriptions-item>-->
@@ -55,115 +55,89 @@
             <el-descriptions-item content-class-name="my-content" label="最新跟进时间" label-class-name="my-label">
               {{ parseTime(details.finalFollowTime, '{y}-{m}-{d}') }}
             </el-descriptions-item>
+            <el-descriptions-item content-class-name="my-content" label="跟进状态" label-class-name="my-label">
+              {{ formatFollowStatus(details) }}
+            </el-descriptions-item>
           </el-descriptions>
         </header>
         <el-tabs v-model="activeName" v-loading="detailsFlag" @tab-click="handleClick">
           <el-tab-pane label="详细信息" name="details">
+            <h3 style="margin-bottom: 10px">渠道信息</h3>
             <el-descriptions
               border
               :column="2"
               :content-style="{ width: '25%', 'word-break': 'break-all' }"
               :label-style="{ width: '25%' }"
               size="small">
-              <el-descriptions-item label="项目名称">
-                {{ details.nboName }}
-              </el-descriptions-item>
-              <el-descriptions-item label="客户名称">
-                {{ details.custName }}
-              </el-descriptions-item>
-              <el-descriptions-item label="预计成交价格">¥{{ details.estTransPrice }}</el-descriptions-item>
-              <el-descriptions-item label="预计成交日期">
-                {{ parseTime(details.estTransTime, '{y}-{m}-{d}') }}
-              </el-descriptions-item>
-              <el-descriptions-item label="主要联系人">
-                {{ details.contactName }}
-              </el-descriptions-item>
-              <el-descriptions-item label="联系人电话">
-                {{ details.contactTelephone }}
-              </el-descriptions-item>
               <el-descriptions-item label="销售模式">
                 {{ selectDictLabel(salesModelOptions, details.salesModel) }}
               </el-descriptions-item>
-              <el-descriptions-item label="经销商/代理商">
+              <el-descriptions-item label="渠道名称">
                 {{ details.distributorName }}
               </el-descriptions-item>
-              <el-descriptions-item label="下次联系时间">
-                {{ parseTime(details.nextFollowTime, '{y}-{m}-{d}') }}
-              </el-descriptions-item>
-              <el-descriptions-item label="最新跟进时间">
-                {{ parseTime(details.finalFollowTime, '{y}-{m}-{d}') }}
-              </el-descriptions-item>
-              <el-descriptions-item label="计划采购时间">
-                {{ parseTime(details.planPurchaseTime, '{y}-{m}-{d}') }}
-              </el-descriptions-item>
-              <el-descriptions-item label="风险情况">
-                {{ details.riskProfile }}
-              </el-descriptions-item>
-              <el-descriptions-item label="困难点">
-                {{ details.difficulty }}
-              </el-descriptions-item>
-              <el-descriptions-item label="竞争公司">
-                {{ details.competitor }}
-              </el-descriptions-item>
-              <el-descriptions-item label="介入情况">
-                {{ details.intervention }}
-              </el-descriptions-item>
-
-              <!--  C-B  -->
-              <el-descriptions-item label="技术支持时间">
-                {{ parseTime(details.technicalSupportTime, '{y}-{m}-{d}') }}
-              </el-descriptions-item>
-              <el-descriptions-item label="技术支持人员">
-                {{ details.technicalSupportName }}
+              <el-descriptions-item label="渠道销售名称">
+                {{ details.dealerSalesName }}
               </el-descriptions-item>
-              <el-descriptions-item label="技术支持内容">
-                {{ details.technicalSupportContent }}
+              <el-descriptions-item label="渠道销售电话/微信">
+                {{ details.dealerSalesContact }}
               </el-descriptions-item>
-              <el-descriptions-item label="总部对接人">
-                {{ details.parentReceiver }}
+            </el-descriptions>
+            <h3 style="margin: 10px 0">项目信息</h3>
+            <el-descriptions
+              border
+              :column="2"
+              :content-style="{ width: '25%', 'word-break': 'break-all' }"
+              :label-style="{ width: '25%' }"
+              size="small">
+              <el-descriptions-item label="项目来源">
+                {{ selectDictLabel(nboSourceOptions, details.nboSource) }}
               </el-descriptions-item>
-              <el-descriptions-item label="项目预算期限">
-                {{ parseTime(details.nboBudgetTime, '{y}-{m}-{d}') }}
+              <el-descriptions-item label="采购方式">
+                {{ selectDictLabel(purchasingWayOptions, details.purchasingWay) }}
               </el-descriptions-item>
               <el-descriptions-item label="资金来源">
                 {{ details.capitalSource }}
               </el-descriptions-item>
-              <el-descriptions-item label="产品/方案满足情况">
-                {{ details.productSatisfaction }}
-              </el-descriptions-item>
-
-              <!--  B-A  -->
-              <el-descriptions-item label="采购方式">
-                {{ selectDictLabel(purchasingWayOptions, details.purchasingWay) }}
-              </el-descriptions-item>
-              <el-descriptions-item label="采购时间">
-                {{ parseTime(details.purchasingTime, '{y}-{m}-{d}') }}
+              <el-descriptions-item label="计划采购时间">
+                {{ parseTime(details.planPurchaseTime, '{y}-{m}-{d}') }}
               </el-descriptions-item>
-              <el-descriptions-item label="决策人">
+              <el-descriptions-item label="客户决策人">
                 {{ details.makerName }}
               </el-descriptions-item>
-              <el-descriptions-item label="决策部门">
+              <el-descriptions-item label="客户决策部门">
                 {{ details.makerDept }}
               </el-descriptions-item>
-              <el-descriptions-item label="经销商销售人员">
-                {{ details.dealerSalesName }}
+              <el-descriptions-item label="客户联系人姓名">
+                {{ details.contactName }}
               </el-descriptions-item>
-              <el-descriptions-item label="维护部门及人员">
-                {{ details.accendant }}
+              <el-descriptions-item label="客户联系人电话/微信">
+                {{ details.contactTelephone }}
               </el-descriptions-item>
               <el-descriptions-item label="是否采纳大数技术参数">
                 {{ selectDictLabel(yesOrNoOptions, details.isAdoptDashoo) }}
               </el-descriptions-item>
-              <el-descriptions-item label="创建人">
-                {{ details.createdName }}
+              <el-descriptions-item label="" />
+              <el-descriptions-item label="竞争公司">
+                {{ details.competitor }}
               </el-descriptions-item>
-              <el-descriptions-item label="创建时间">
-                {{ details.createdTime }}
+              <el-descriptions-item label="客户倾向厂家">
+                {{ details.customerIntentionFactory }}
               </el-descriptions-item>
-              <el-descriptions-item label="更新时间">
-                {{ details.updatedTime }}
+            </el-descriptions>
+            <h3  style="margin: 10px 0">其他信息</h3>
+            <el-descriptions
+              border
+              :column="2"
+              :content-style="{ width: '25%', 'word-break': 'break-all' }"
+              :label-style="{ width: '25%' }"
+              size="small">
+              <el-descriptions-item label="项目创建时间">
+                {{ parseTime(details.createdTime, '{y}-{m}-{d} {h}:{i}') }}
               </el-descriptions-item>
-              <el-descriptions-item label="备注" :span="24">
+              <el-descriptions-item label="项目跟进次数">
+                {{ details.followCount }}
+              </el-descriptions-item>
+              <el-descriptions-item label="备注信息" :span="24">
                 {{ details.remark }}
               </el-descriptions-item>
             </el-descriptions>
@@ -199,16 +173,16 @@
           </el-tab-pane>
           <el-tab-pane label="归属记录" name="belong">
             <el-table v-loading="belongLoading" border :data="belongs" height="calc(100% - 42px)">
-              <el-table-column align="center" label="归属销售" prop="opnContent.saleName" show-overflow-tooltip />
-              <el-table-column align="center" label="原来归属" prop="opnContent.origSaleName" show-overflow-tooltip />
+              <el-table-column align="center" label="归属销售" prop="opnContent.saleName" show-overflow-tooltip/>
+              <el-table-column align="center" label="原来归属" prop="opnContent.origSaleName" show-overflow-tooltip/>
               <el-table-column align="center" label="操作方式" prop="opnType">
                 <template slot-scope="scope">
                   <el-tag v-if="scope.row.opnType == 30">转移</el-tag>
                 </template>
               </el-table-column>
-              <el-table-column align="center" label="操作人" prop="createdName" show-overflow-tooltip />
-              <el-table-column align="center" label="操作时间" prop="opnDate" show-overflow-tooltip />
-              <el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip />
+              <el-table-column align="center" label="操作人" prop="createdName" show-overflow-tooltip/>
+              <el-table-column align="center" label="操作时间" prop="opnDate" show-overflow-tooltip/>
+              <el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip/>
             </el-table>
           </el-tab-pane>
         </el-tabs>
@@ -219,21 +193,21 @@
           <!--          <el-button @click="handleDelete">删除</el-button>-->
           <el-button @click="back">返回</el-button>
         </div>
-        <details-records :dynamics-list="dynamicsList" />
+        <details-records :dynamics-list="dynamicsList"/>
       </div>
     </div>
     <!-- 编辑 -->
-    <edit ref="edit" @fetch-data="init" />
+    <edit ref="edit" @fetch-data="init"/>
     <!-- 添加跟进记录 -->
-    <follow-add ref="follow-add" @fetch-data="init" />
+    <follow-add ref="follow-add" @fetch-data="init"/>
     <!-- 转移 -->
-    <transfer ref="transfer" @fetch-data="init" />
+    <transfer ref="transfer" @fetch-data="init"/>
     <!-- 转储备项目 -->
-    <to-reserve ref="toReserve" @fetch-data="init" />
+    <to-reserve ref="toReserve" @fetch-data="init"/>
     <!-- 创建工单 -->
-    <work-order-edit ref="work-order-edit" :business-info="details" />
+    <work-order-edit ref="work-order-edit" :business-info="details"/>
     <!-- 合同 -->
-    <contract-edit ref="contract" :business-data="[details]" />
+    <contract-edit ref="contract" :business-data="[details]"/>
   </div>
 </template>
 
@@ -279,7 +253,7 @@
     data() {
       return {
         id: undefined,
-        details: { nboType: '' },
+        details: {nboType: ''},
         productData: [],
         abstract: {},
         activeName: 'details',
@@ -314,11 +288,12 @@
       this.id = parseInt(this.$route.query.id)
       this.init()
     },
-    mounted() {},
+    mounted() {
+    },
     methods: {
       init() {
         Promise.all([
-          businessApi.getEntityById({ id: this.id }),
+          businessApi.getEntityById({id: this.id}),
           this.getDicts('proj_nbo_type'),
           this.getDicts('proj_nbo_source'),
           this.getDicts('proj_sales_model'),
@@ -340,7 +315,7 @@
         })
       },
       async getRecord() {
-        const [err, res] = await to(businessApi.getBusinessDynamics({ busId: this.id }))
+        const [err, res] = await to(businessApi.getBusinessDynamics({busId: this.id}))
         if (err) return
         if (res.data.list) {
           let obj = res.data.list
@@ -352,7 +327,7 @@
 
           this.dynamicsList = records
           // console.log(this.dynamicsList)
-          await this.handleClick({ name: this.activeName })
+          await this.handleClick({name: this.activeName})
         }
       },
       async handleClick(tab) {
@@ -372,8 +347,8 @@
           // 获取项目转移记录
           this.belongLoading = true
           const {
-            data: { list, total },
-          } = await businessApi.getBusinessDynamicsList({ busId: this.id, opnType: '30' })
+            data: {list, total},
+          } = await businessApi.getBusinessDynamicsList({busId: this.id, opnType: '30'})
           this.belongs = list ? list : []
           this.belongTotal = total
           this.belongLoading = false
@@ -384,7 +359,7 @@
         }
       },
       async getProductData(busId) {
-        const { data } = await businessApi.getProductByBusinessId({ id: busId })
+        const {data} = await businessApi.getProductByBusinessId({id: busId})
         if (data) {
           this.productData = data
         }
@@ -418,7 +393,7 @@
       // 删除
       handleDelete() {
         this.$baseConfirm('你确定要删除当前项目吗', null, async () => {
-          const { msg } = await businessApi.doDelete({ ids: [this.id] })
+          const {msg} = await businessApi.doDelete({ids: [this.id]})
           this.$baseMessage(msg, 'success')
           this.back()
         })
@@ -454,6 +429,24 @@
           },
         })
       },
+      formatFollowStatus(detail) {
+        // 跟进超期判断依据: A类一周 B类两周 C类一个月
+        let followTime = detail.finalFollowTime
+        if (!followTime) {
+          followTime = detail.createdTime
+        }
+        let overdueTime = new Date(followTime)
+        if (detail.nboType === '10') {
+          overdueTime = overdueTime.setDate(overdueTime.getDate() + 7)
+        } else if (detail.nboType === '20') {
+          overdueTime = overdueTime.setDate(overdueTime.getDate() + 14)
+        } else if (detail.nboType === '30') {
+          overdueTime = overdueTime.setMonth(overdueTime.getMonth() + 1)
+        } else {
+          return '正常'
+        }
+        return new Date() < overdueTime ? '正常' : '超期'
+      },
       back() {
         // this.$router.go(-1)
         this.$router.push({
@@ -471,6 +464,7 @@
   }
 
   $base: '.details';
+
   #{$base} {
     height: calc(100vh - 60px - 12px * 2 - 40px);
     display: flex;
@@ -735,7 +729,7 @@
             display: flex;
             justify-content: space-between;
 
-            span:first-child {
+              span:first-child {
               font-weight: bold;
               color: #333;
             }
@@ -771,7 +765,8 @@
     height: 190px;
   }
 
-  .height-enter, .height-leave-to /* .fade-leave-active below version 2.1.8 */ {
+  .height-enter, .height-leave-to /* .fade-leave-active below version 2.1.8 */
+  {
     height: 0;
   }
 

+ 1 - 1
src/views/proj/business/index.vue

@@ -551,7 +551,7 @@
       },
       handleEdit(row) {
         if (row.id) {
-          this.$refs['add'].showEdit(row)
+          this.$refs['edit'].showEdit(row)
         } else {
           this.$refs['add'].showEdit(row)
         }