Browse Source

feature(项目): 添加条件过滤,项目降级修改,页面字段样式优化

ZZH-wl 2 years ago
parent
commit
a6ad76516c

+ 33 - 10
src/components/select/SelectCustomer.vue

@@ -46,6 +46,12 @@
           <span v-if="item.prop === 'custStatus'">
             {{ row.custStatus == 10 ? '正常' : '异常' }}
           </span>
+          <span v-else-if="item.prop === 'custIndustry'">
+            {{ selectDictLabel(industryOptions, row.custIndustry) }}
+          </span>
+          <span v-else-if="item.prop === 'followUpDate'">
+            {{ parseTime(row.followUpDate, '{y}-{m}-{d} {h}:{i}') }}
+          </span>
           <span v-else-if="item.prop === 'createdTime'">
             {{ parseTime(row.createdTime, '{y}-{m}-{d} {h}:{i}') }}
           </span>
@@ -122,21 +128,30 @@
             prop: 'abbrName',
           },
           {
-            label: '所在地区',
-            width: 'auto',
-            prop: 'custLocation',
+            label: '所在省',
+            width: '120px',
+            prop: 'custProvince',
+            sortable: false,
+            disableCheck: false,
           },
           {
-            label: '客户行业',
-            width: 'auto',
-            prop: 'custIndustry',
+            label: '所在市',
+            width: '100px',
+            prop: 'custCity',
+            sortable: false,
+            disableCheck: false,
           },
           {
-            label: '客户级别',
+            label: '客户类型',
             width: 'auto',
-            prop: 'custLevel',
+            prop: 'custIndustry',
           },
           // {
+          //   label: '客户级别',
+          //   width: 'auto',
+          //   prop: 'custLevel',
+          // },
+          // {
           //   label: '客户状态',
           //   width: 'auto',
           //   prop: 'custStatus',
@@ -148,7 +163,7 @@
           },
           {
             label: '创建时间',
-            width: 'auto',
+            width: '150px',
             prop: 'createdTime',
             // sortable: true,
           },
@@ -158,6 +173,7 @@
         layout: 'total, sizes, prev, pager, next, jumper',
         total: 0,
         selectRows: [],
+        industryOptions: [], //客户类型
       }
     },
     computed: {
@@ -166,9 +182,16 @@
       },
     },
     mounted() {
-      // this.fetchData()
+      this.getOptions()
     },
     methods: {
+      getOptions() {
+        Promise.all([this.getDicts('cust_idy')])
+          .then(([industry]) => {
+            this.industryOptions = industry.data.values || []
+          })
+          .catch((err) => console.log(err))
+      },
       open() {
         this.innerVisible = true
         this.fetchData()

+ 1 - 1
src/views/customer/detail.vue

@@ -220,7 +220,7 @@
                   {{ getStatus(scope.row.approStatus) }}
                 </template>
               </el-table-column>
-              <!--              <el-table-column align="center" label="项目别" prop="nboType" width="80px" />-->
+              <!--              <el-table-column align="center" label="项目别" prop="nboType" width="80px" />-->
               <!--              <el-table-column align="center" label="产品线" prop="productLine" width="120px" />-->
               <el-table-column align="center" label="经销商/代理商" prop="distributorName" width="200px" />
               <el-table-column align="center" label="项目预算(万元)" prop="nboBudget" width="120px" />

+ 4 - 1
src/views/proj/business/components/BusinessEdit.vue

@@ -347,7 +347,10 @@
         }
       },
       changeSalesModel() {
-        this.distributorName = undefined
+        if (this.form.salesModel === '10') {
+          this.form.distributorId = undefined
+          this.form.distributorName = undefined
+        }
       },
       changeProductLine() {
         this.form.nboName = this.form.custName + this.selectDictLabel(this.productLineOptions, this.form.productLine)

+ 9 - 5
src/views/proj/business/components/BusinessGradation.vue

@@ -18,7 +18,7 @@
     </el-button>
     <el-dialog append-to-body :title="title" :visible.sync="dialogFormVisible" width="60%" @close="close">
       <el-form ref="form" :model="form" :rules="rules" style="margin-top: -20px">
-        <el-form-item label="项目别" prop="nboType">
+        <el-form-item label="项目别" prop="nboType">
           <el-select v-model="form.nboType" placeholder="请选择项目类别" style="width: 100%">
             <el-option
               :disabled="
@@ -32,7 +32,7 @@
               :disabled="type === 'up' && ['10', '20', '30'].includes(businessInfo.nboType)"
               label="C"
               value="30" />
-            <el-option v-if="type === 'down' && businessInfo.nboType === '10'" label="储备" value="50" />
+            <el-option v-if="type === 'down'" label="储备" value="50" />
           </el-select>
         </el-form-item>
         <!--   C-B     项目预算 经销商/代理商 技术支持时间 技术支持人员 技术支持内容 总部对接人 项目预算期限 资金来源 产品/方案满足情况-->
@@ -160,7 +160,7 @@
             show-word-limit
             type="textarea" />
         </el-form-item>
-        <el-form-item v-else :label="title + '原因'" prop="remark">
+        <el-form-item v-else :label="title + '原因'" prop="remark" :required="type === 'down'">
           <el-input
             v-model="form.remark"
             maxlength="300"
@@ -221,6 +221,10 @@
         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()
+      }
       return {
         title: '项目',
         type: '',
@@ -254,7 +258,7 @@
           remark: undefined,
         },
         rules: {
-          nboType: [{ required: true, trigger: ['blur', 'change'], message: '请选择项目别' }],
+          nboType: [{ required: true, trigger: ['blur', 'change'], message: '请选择项目别' }],
           nboBudget: [{ required: true, trigger: ['blur', 'change'], message: '请输入项目预算' }],
           // distributorName: [{ required: true, trigger: ['blur', 'change'], message: '请选择经销商/代理商' }],
           technicalSupportName: [
@@ -271,7 +275,7 @@
           purchasingWay: [{ validator: validateUpgradeA, trigger: ['blur', 'change'], message: '请选择采购方式' }],
           isAdoptDashoo: [{ validator: validateUpgradeA, trigger: ['blur', 'change'], message: '请选择是或否' }],
 
-          // remark: [{ required: true, trigger: ['blur', 'change'], message: '请输入原因' }],
+          remark: [{ validator: validateDowngrade, trigger: ['blur', 'change'], message: '请输入原因' }],
           projConversionReason: [{ required: true, trigger: ['blur', 'change'], message: '请输入转化原因' }],
         },
         dialogFormVisible: false,

+ 11 - 2
src/views/proj/business/detail.vue

@@ -37,7 +37,7 @@
             <el-descriptions-item content-class-name="my-content" label="销售工程师" label-class-name="my-label">
               {{ details.saleName }}
             </el-descriptions-item>
-            <el-descriptions-item content-class-name="my-content" label="项目别" label-class-name="my-label">
+            <el-descriptions-item content-class-name="my-content" label="项目别" label-class-name="my-label">
               {{ selectDictLabel(nboTypeOptions, details.nboType) }}
             </el-descriptions-item>
             <el-descriptions-item content-class-name="my-content" label="产品线" label-class-name="my-label">
@@ -53,7 +53,12 @@
         </header>
         <el-tabs v-model="activeName" @tab-click="handleClick">
           <el-tab-pane label="详细信息" name="details">
-            <el-descriptions border :column="2" size="small">
+            <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>
@@ -372,6 +377,10 @@
 </script>
 
 <style lang="scss" scoped>
+  ::v-deep .el-tabs__content {
+    overflow: auto;
+  }
+
   $base: '.details';
   #{$base} {
     height: calc(100vh - 60px - 12px * 2 - 40px);

+ 52 - 14
src/views/proj/business/index.vue

@@ -25,7 +25,7 @@
               @keyup.enter.native="queryData" />
           </el-form-item>
 
-          <el-form-item prop="nboType">
+          <el-form-item v-show="activeName === 'all'" prop="nboType">
             <el-select v-model="queryForm.nboType" clearable placeholder="项目类别">
               <el-option v-for="dict in nboTypeOptions" :key="dict.key" :label="dict.value" :value="dict.key" />
             </el-select>
@@ -34,11 +34,36 @@
             <el-input
               v-model="queryForm.saleName"
               clearable
-              placeholder="归属人员"
+              placeholder="销售工程师"
               size="small"
               @keyup.enter.native="queryData" />
           </el-form-item>
-
+          <el-form-item prop="productLine">
+            <el-select v-model="queryForm.productLine" clearable placeholder="产品线">
+              <el-option v-for="item in productLineOptions" :key="item.key" :label="item.value" :value="item.key" />
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="nboSource">
+            <el-select v-model="queryForm.nboSource" clearable placeholder="项目来源">
+              <el-option v-for="dict in nboSourceOptions" :key="dict.key" :label="dict.value" :value="dict.key" />
+            </el-select>
+          </el-form-item>
+          <el-form-item prop="distributorName">
+            <el-input
+              v-model="queryForm.distributorName"
+              clearable
+              placeholder="经销商/代理商"
+              size="small"
+              @keyup.enter.native="queryData" />
+          </el-form-item>
+          <el-form-item prop="filingTime">
+            <el-date-picker
+              v-model="queryForm.filingTime"
+              end-placeholder="结束"
+              start-placeholder="备案日期开始"
+              type="daterange"
+              value-format="yyyy-MM-dd" />
+          </el-form-item>
           <el-form-item>
             <el-button icon="el-icon-search" type="primary" @click="queryData">查询</el-button>
             <el-button icon="el-icon-refresh" type="primary" @click="resetQuery">重置</el-button>
@@ -177,7 +202,21 @@
     data() {
       return {
         activeName: 'all',
-        height: this.$baseTableHeight(3),
+        height: this.$baseTableHeight(4),
+        queryForm: {
+          pageNum: 1,
+          pageSize: 10,
+          nboName: undefined,
+          custName: undefined,
+          nboType: undefined,
+          saleName: undefined,
+          productLine: undefined,
+          nboSource: undefined,
+          distributorName: undefined,
+          filingTime: undefined,
+          beginTime: undefined,
+          endTime: undefined,
+        },
         checkList: [],
         columns: [
           {
@@ -243,7 +282,7 @@
             width: '120px',
           },
           {
-            label: '项目别',
+            label: '项目别',
             prop: 'nboType',
             width: '80px',
           },
@@ -299,7 +338,7 @@
           '销售模式',
           '经销商/代理商',
           '产品线',
-          '项目别',
+          '项目别',
           '项目预算(万元)',
           '大项目',
           '最新跟进时间',
@@ -354,14 +393,6 @@
         layout: 'total, sizes, prev, pager, next, jumper',
         total: 0,
         selectRows: '',
-        queryForm: {
-          pageNum: 1,
-          pageSize: 10,
-          nboName: undefined,
-          custName: undefined,
-          nboType: undefined,
-          saleName: undefined,
-        },
         yesOrNoOptions: [],
         nboTypeOptions: [],
         nboSourceOptions: [],
@@ -518,6 +549,13 @@
         this.selectRows = val
       },
       async fetchData() {
+        if (this.queryForm.filingTime && this.queryForm.filingTime.length === 2) {
+          this.queryForm.beginTime = this.queryForm.filingTime[0] + ' 00:00:00'
+          this.queryForm.endTime = this.queryForm.filingTime[1] + ' 23:59:59'
+        } else {
+          this.queryForm.beginTime = undefined
+          this.queryForm.endTime = undefined
+        }
         this.listLoading = true
         const { data } = await businessApi.getList(this.queryForm)
         const { list, total } = data