Explorar o código

feature(优化):
1、选择控件添加查询按钮
2、金额不显示小数
3、时间不显示时分秒
4、销售工程师不允许修改
5、公告用户选择问题
6、报表管理修改
7、样式调整

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

+ 4 - 0
src/api/index/index.js

@@ -26,6 +26,10 @@ export default {
   getReportList(query) {
     return micro_request.postRequest(basePath, 'Report', 'GetList', query)
   },
+  // 角色可选指标
+  getRoleReportList(query) {
+    return micro_request.postRequest(basePath, 'RoleReport', 'GetList', query)
+  },
   // 数值指标
   getHomeNumReportData(query) {
     return micro_request.postRequest(basePath, 'Home', 'GetHomeNumReportData', query)

+ 4 - 4
src/api/proj/business.js

@@ -19,11 +19,11 @@ export default {
     return micro_request.postRequest(basePath, 'Business', 'DeleteByIds', query)
   },
   // 项目升级
-  // businessUpgrade(query) {
-  //   return micro_request.postRequest(basePath, 'Business', 'BusinessUpgrade', query)
-  // },
   businessUpgrade(query) {
-    return micro_request.postFormDataRequest(basePath, 'BusinessHandler', 'BusinessUpgrade', query)
+    return micro_request.postRequest(basePath, 'Business', 'BusinessUpgrade', query)
+  },
+  businessUpgradeA(query) {
+    return micro_request.postFormDataRequest(basePath, 'BusinessHandler', 'BusinessUpgradeA', query)
   },
   // 项目降级
   businessDowngrade(query) {

+ 24 - 0
src/api/work/type.js

@@ -0,0 +1,24 @@
+import micro_request from '@/utils/micro_request'
+
+const basePath = process.env.VUE_APP_ParentPath
+export default {
+  getList(query) {
+    return micro_request.postRequest(basePath, 'WorkOrderType', 'GetList', query)
+  },
+  //详情
+  getDetail(query) {
+    return micro_request.postRequest(basePath, 'WorkOrderType', 'GetEntityById', query)
+  },
+  doAdd(query) {
+    return micro_request.postRequest(basePath, 'WorkOrderType', 'Create', query)
+  },
+  doEdit(query) {
+    return micro_request.postRequest(basePath, 'WorkOrderType', 'UpdateById', query)
+  },
+  doDelete(query) {
+    return micro_request.postRequest(basePath, 'WorkOrderType', 'DeleteByIds', query)
+  },
+  syncDingTalkForm(query) {
+    return micro_request.postRequest(basePath, 'WorkOrderType', 'SyncDingTalkForm', query)
+  },
+}

+ 68 - 33
src/components/select/SelectBusiness.vue

@@ -23,6 +23,8 @@
           style="width: 30%; margin-right: 10px"
           suffix-icon="el-icon-search"
           @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="全部客户" />-->
@@ -46,20 +48,32 @@
           <span v-if="item.prop === 'estTransPrice'">
             {{ formatPrice(row.estTransPrice) }}
           </span>
+          <span v-else-if="item.prop === 'nboSource'">
+            {{ selectDictLabel(nboSourceOptions, row.nboSource) }}
+          </span>
+          <span v-else-if="item.prop === 'salesModel'">
+            {{ selectDictLabel(salesModelOptions, row.salesModel) }}
+          </span>
           <span v-else-if="item.prop === 'approStatus'">
             {{ selectDictLabel(approStatusOptions, row.approStatus) }}
           </span>
           <span v-else-if="item.prop === 'nboStatus'">
             {{ selectDictLabel(nboStatusOptions, row.nboStatus) }}
           </span>
+          <span v-else-if="item.prop === 'nboType'">
+            {{ selectDictLabel(nboTypeOptions, row.nboType) }}
+          </span>
           <span v-else-if="item.prop === 'nboPhase'">
             {{ selectDictLabel(nboPhaseOptions, row.nboPhase) }}
           </span>
+          <span v-else-if="item.prop === 'productLine'">
+            {{ selectDictLabel(productLineOptions, row.productLine) }}
+          </span>
           <span v-else-if="item.prop === 'finalFollowTime'">
-            {{ parseTime(row.finalFollowTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.finalFollowTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else-if="item.prop === 'nextFollowTime'">
-            {{ parseTime(row.nextFollowTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.nextFollowTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else>{{ row[item.prop] }}</span>
         </template>
@@ -120,46 +134,61 @@
         columns: [
           {
             label: '项目标题',
-            width: 'auto',
+            width: '220px',
             prop: 'nboName',
-            sortable: true,
+            // sortable: true,
             disableCheck: true,
           },
           {
             label: '关联客户',
-            width: 'auto',
+            width: '220px',
             prop: 'custName',
           },
           {
-            label: '审批状态',
-            width: 'auto',
-            prop: 'approStatus',
-          },
-          {
-            label: '项目状态',
-            width: 'auto',
-            prop: 'nboPhase',
+            label: '销售工程师',
+            width: '100px',
+            prop: 'saleName',
           },
+          // {
+          //   label: '审批状态',
+          //   width: 'auto',
+          //   prop: 'approStatus',
+          // },
+          // {
+          //   label: '项目状态',
+          //   width: 'auto',
+          //   prop: 'nboPhase',
+          // },
           {
             label: '项目类别',
             width: 'auto',
             prop: 'nboType',
           },
+          {
+            label: '项目来源',
+            prop: 'nboSource',
+            width: '140px',
+          },
+          {
+            label: '销售模式',
+            prop: 'salesModel',
+            width: '80px',
+          },
           {
             label: '项目金额',
-            width: 'auto',
+            width: '120px',
             prop: 'estTransPrice',
           },
           {
             label: '最后跟进时间',
-            width: 'auto',
+            width: '150px',
             prop: 'finalFollowTime',
           },
-          {
-            label: '下次跟进时间',
-            width: 'auto',
-            prop: 'nextFollowTime',
-          },
+          // {
+          //   label: '下次跟进时间',
+          //   width: 'auto',
+          //   prop: 'nextFollowTime',
+          // },
         ],
         list: [],
         listLoading: true,
@@ -170,6 +199,9 @@
         nboPhaseOptions: [],
         nboStatusOptions: [],
         approStatusOptions: [],
+        salesModelOptions: [],
+        nboSourceOptions: [],
+        productLineOptions: [],
       }
     },
     computed: {
@@ -178,21 +210,24 @@
       },
     },
     mounted() {
-      this.getDicts('proj_nbo_type').then((response) => {
-        this.nboTypeOptions = response.data.values || []
-      })
-      this.getDicts('proj_nbo_phase').then((response) => {
-        this.nboPhaseOptions = response.data.values || []
-      })
-      this.getDicts('proj_nbo_status').then((response) => {
-        this.nboStatusOptions = response.data.values || []
-      })
-      this.getDicts('proj_appro_status').then((response) => {
-        this.approStatusOptions = response.data.values || []
-      })
-      // this.fetchData()
+      this.getOptions()
     },
     methods: {
+      getOptions() {
+        Promise.all([
+          this.getDicts('proj_nbo_type'),
+          this.getDicts('proj_nbo_source'),
+          this.getDicts('proj_sales_model'),
+          this.getDicts('sys_product_line'),
+        ])
+          .then(([nboType, nboSource, salesModel, productLine]) => {
+            this.nboTypeOptions = nboType.data.values || []
+            this.nboSourceOptions = nboSource.data.values || []
+            this.salesModelOptions = salesModel.data.values || []
+            this.productLineOptions = productLine.data.values || []
+          })
+          .catch((err) => console.log(err))
+      },
       open() {
         this.innerVisible = true
         this.fetchData()

+ 2 - 0
src/components/select/SelectBusinessContact.vue

@@ -9,6 +9,8 @@
           style="width: 30%; margin-right: 10px"
           suffix-icon="el-icon-search"
           @keyup.enter.native="fetchData" />
+        <el-button icon="el-icon-search" type="primary" @click="fetchData">查询</el-button>
+
         <table-tool :check-list.sync="checkList" :columns="columns" style="float: right" />
       </el-col>
     </el-row>

+ 6 - 4
src/components/select/SelectCustomer.vue

@@ -23,6 +23,8 @@
           style="width: 30%; margin-right: 10px"
           suffix-icon="el-icon-search"
           @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="全部客户" />-->
@@ -50,10 +52,10 @@
             {{ selectDictLabel(industryOptions, row.custIndustry) }}
           </span>
           <span v-else-if="item.prop === 'followUpDate'">
-            {{ parseTime(row.followUpDate, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.followUpDate, '{y}-{m}-{d}') }}
           </span>
           <span v-else-if="item.prop === 'createdTime'">
-            {{ parseTime(row.createdTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.createdTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else>{{ row[item.prop] }}</span>
         </template>
@@ -117,14 +119,14 @@
         columns: [
           {
             label: '客户名称',
-            width: 'auto',
+            width: '220px',
             prop: 'custName',
             // sortable: true,
             disableCheck: true,
           },
           {
             label: '助记名',
-            width: 'auto',
+            width: '120px',
             prop: 'abbrName',
           },
           {

+ 2 - 0
src/components/select/SelectCustomerContact.vue

@@ -23,6 +23,8 @@
           style="width: 30%; margin-right: 10px"
           suffix-icon="el-icon-search"
           @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="全部客户" />-->

+ 8 - 6
src/components/select/SelectDistributor.vue

@@ -23,6 +23,8 @@
           style="width: 30%; margin-right: 10px"
           suffix-icon="el-icon-search"
           @keyup.enter.native="fetchData" />
+        <el-button icon="el-icon-search" type="primary" @click="fetchData">查询</el-button>
+
         <table-tool :check-list.sync="checkList" :columns="columns" style="float: right" />
       </el-col>
     </el-row>
@@ -39,7 +41,7 @@
         :width="item.width">
         <template #default="{ row }">
           <span v-if="item.prop === 'createdTime'">
-            {{ parseTime(row.createdTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.createdTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else>{{ row[item.prop] }}</span>
         </template>
@@ -99,14 +101,14 @@
         columns: [
           {
             label: '经销商名称',
-            width: 'auto',
+            width: '220px',
             prop: 'distName',
             // sortable: true,
             disableCheck: true,
           },
           {
             label: '助记名',
-            width: 'auto',
+            width: '120px',
             prop: 'abbrName',
           },
           {
@@ -121,7 +123,7 @@
           },
           {
             label: '业务范围',
-            width: 'auto',
+            width: '120px',
             prop: 'businessScope',
           },
           {
@@ -131,7 +133,7 @@
           },
           {
             label: '负责人电话',
-            width: 'auto',
+            width: '110px',
             prop: 'distBossPhone',
           },
           {
@@ -141,7 +143,7 @@
           },
           {
             label: '创建时间',
-            width: 'auto',
+            width: '150px',
             prop: 'createdTime',
             // sortable: true,
           },

+ 24 - 11
src/components/select/SelectProduct.vue

@@ -23,6 +23,8 @@
           style="width: 30%; margin-right: 10px"
           suffix-icon="el-icon-search"
           @keyup.enter.native="fetchData" />
+        <el-button icon="el-icon-search" type="primary" @click="fetchData">查询</el-button>
+
         <table-tool :check-list.sync="checkList" :columns="columns" style="float: right" />
       </el-col>
     </el-row>
@@ -39,7 +41,10 @@
         :width="item.width">
         <template #default="{ row }">
           <span v-if="item.prop === 'createdTime'">
-            {{ parseTime(row.createdTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.createdTime, '{y}-{m}-{d}') }}
+          </span>
+          <span v-else-if="item.prop === 'prodClass'">
+            {{ selectDictLabel(productLineOptions, row.prodClass) }}
           </span>
           <span v-else>{{ row[item.prop] }}</span>
         </template>
@@ -100,49 +105,49 @@
         columns: [
           {
             label: '产品名称',
-            width: 'auto',
+            width: '320px',
             prop: 'prodName',
             // sortable: true,
             disableCheck: true,
           },
           {
             label: '产品类别',
-            width: 'auto',
+            width: '160px',
             prop: 'prodClass',
           },
           {
             label: '产品型号',
-            width: 'auto',
+            width: '180px',
             prop: 'prodCode',
           },
           {
             label: '签约代理价',
-            width: 'auto',
+            width: '100px',
             prop: 'agentPrice',
           },
           {
             label: '经销商价',
-            width: 'auto',
+            width: '100px',
             prop: 'distPrice',
           },
           {
             label: '建议成交价',
-            width: 'auto',
+            width: '100px',
             prop: 'guidPrice',
           },
           {
             label: '市场报价',
-            width: 'auto',
+            width: '100px',
             prop: 'marketPrice',
           },
           {
             label: '创建人',
-            width: 'auto',
+            width: '100px',
             prop: 'createdName',
           },
           {
             label: '创建时间',
-            width: 'auto',
+            width: '160px',
             prop: 'createdTime',
             // sortable: true,
           },
@@ -152,6 +157,7 @@
         layout: 'total, sizes, prev, pager, next, jumper',
         total: 0,
         selectRows: [],
+        productLineOptions: [],
       }
     },
     computed: {
@@ -160,9 +166,16 @@
       },
     },
     mounted() {
-      // this.fetchData()
+      this.getOptions()
     },
     methods: {
+      getOptions() {
+        Promise.all([this.getDicts('sys_product_line')])
+          .then(([productLine]) => {
+            this.productLineOptions = productLine.data.values || []
+          })
+          .catch((err) => console.log(err))
+      },
       open() {
         this.innerVisible = true
         this.fetchData()

+ 3 - 6
src/components/select/SelectUser.vue

@@ -3,12 +3,9 @@
     <el-row class="transfer">
       <el-col :span="12">
         <header>
-          <el-input
-            v-model="queryForm.keyWords"
-            clearable
-            placeholder="请输入关键字"
-            suffix-icon="el-icon-search"
-            @change="search" />
+          <el-input v-model="queryForm.keyWords" clearable placeholder="请输入关键字" @keyup.enter.native="search">
+            <el-button slot="append" icon="el-icon-search" @click="search" />
+          </el-input>
         </header>
         <el-dropdown @command="handleCommand">
           <span class="el-dropdown-link">

+ 1 - 1
src/utils/index.js

@@ -273,7 +273,7 @@ export function resetForm(refName) {
  */
 export function formatPrice(price, currency = 'CNY') {
   if (!price) price = 0
-  return price.toLocaleString('zh-CN', { style: 'currency', currency })
+  return price.toLocaleString('zh-CN', { style: 'currency', currency, maximumFractionDigits: 0 })
 }
 
 // 回显数据字典

+ 1 - 1
src/views/contract/components/DetailsEnclosure.vue

@@ -36,7 +36,7 @@
         show-overflow-tooltip>
         <template #default="{ row }">
           <span v-if="item.prop == 'createdTime'">
-            {{ parseTime(row.createdTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.createdTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else>{{ row[item.prop] }}</span>
         </template>

+ 1 - 1
src/views/contract/components/DetailsRecords.vue

@@ -21,7 +21,7 @@
           <vab-icon class="user-avatar" icon="account-circle-fill" />
           <div class="text">
             <p class="action">{{ item.opnPeople }} {{ item.opnType }}</p>
-            <p>{{ parseTime(item.opnDate, '{y}-{m}-{d} {h}:{i}') }}</p>
+            <p>{{ parseTime(item.opnDate, '{y}-{m}-{d}') }}</p>
             <p v-if="item.opnContent.custName">
               客户名称:
               <span>{{ item.opnContent.custName }}</span>

+ 1 - 1
src/views/contract/components/Edit.vue

@@ -74,7 +74,7 @@
           <el-form-item label="销售工程师" prop="inchargeName">
             <el-input
               v-model="editForm.inchargeName"
-              :disabled="editForm.id"
+              :disabled="editForm.id > 0"
               placeholder="请选择销售工程师"
               readonly
               suffix-icon="el-icon-search"

+ 1 - 1
src/views/contract/index.vue

@@ -128,7 +128,7 @@
           <span v-else>{{ row[item.prop] }}</span>
         </template>
       </el-table-column>
-      <el-table-column align="center" fixed="right" label="操作" width="90px">
+      <el-table-column align="center" fixed="right" label="操作" width="110px">
         <template slot-scope="scope">
           <el-button
             v-if="scope.row.approStatus == '10'"

+ 2 - 2
src/views/contract/invoice.vue

@@ -155,7 +155,7 @@
           },
           {
             label: '开票日期',
-            width: '120px',
+            width: '100px',
             prop: 'invoiceDate',
           },
           {
@@ -165,7 +165,7 @@
           },
           {
             label: '开票类型',
-            width: '80px',
+            width: '100px',
             prop: 'invoiceType',
           },
           {

+ 15 - 15
src/views/customer/components/Edit.vue

@@ -89,17 +89,17 @@
         </el-col>
       </el-row>
       <el-row :gutter="20">
-        <el-col :span="12">
-          <el-form-item label="下次联系时间" prop="followUpDate">
-            <el-date-picker
-              v-model="editForm.followUpDate"
-              format="yyyy-MM-dd HH:mm"
-              placeholder="选择下次联系时间"
-              style="width: 100%"
-              type="datetime"
-              value-format="yyyy-MM-dd HH:mm" />
-          </el-form-item>
-        </el-col>
+        <!--        <el-col :span="12">-->
+        <!--          <el-form-item label="下次联系时间" prop="followUpDate">-->
+        <!--            <el-date-picker-->
+        <!--              v-model="editForm.followUpDate"-->
+        <!--              format="yyyy-MM-dd HH:mm"-->
+        <!--              placeholder="选择下次联系时间"-->
+        <!--              style="width: 100%"-->
+        <!--              type="datetime"-->
+        <!--              value-format="yyyy-MM-dd HH:mm" />-->
+        <!--          </el-form-item>-->
+        <!--        </el-col>-->
         <!-- <el-col :span="12">
           <el-form-item label="开票抬头" prop="invoiceHeader">
             <el-input v-model="editForm.invoiceHeader" placeholder="请输入详细地址" />
@@ -158,7 +158,7 @@
           custAddress: '', // 详细地址
           invoiceHeader: '', // 开票抬头
           custStatus: '', // 客户状态(10正常20)
-          followUpDate: '', // 最后跟进时间
+          // followUpDate: '', // 最后跟进时间
           custIndustry: '', // 客户类型  (没数据)
           custLevel: '', // 客户级别  (没数据)
           custSource: '', //客户来源
@@ -228,7 +228,7 @@
         params.custCity = params.city.distName
         params.custRegionId = params.region.id
         params.custRegion = params.region.distName
-        if (!params.followUpDate) params.followUpDate = null
+        // if (!params.followUpDate) params.followUpDate = null
         const [err, res] = await to(api.createCustomer(params))
         if (err) return
         if (res.code == 200) this.$message.success(res.msg)
@@ -256,7 +256,7 @@
           params.custRegionId = params.region.id
           params.custRegion = params.region.distName
         }
-        if (!params.followUpDate) params.followUpDate = null
+        // if (!params.followUpDate) params.followUpDate = null
         const [err, res] = await to(api.updateCostomer(params))
         if (err) return
         if (res.code == 200) this.$message.success(res.msg)
@@ -284,7 +284,7 @@
           custAddress: '', // 详细地址
           invoiceHeader: '', // 开票抬头
           custStatus: '', // 客户状态(10正常20)
-          followUpDate: '', // 最后跟进时间
+          // followUpDate: '', // 最后跟进时间
           custIndustry: '', // 客户类型  (没数据)
           custLevel: '', // 客户级别  (没数据)
           custSource: '', //客户来源

+ 31 - 15
src/views/customer/detail.vue

@@ -45,7 +45,7 @@
               {{ detail.custStatus == 10 ? '正常' : '异常' }}
             </el-descriptions-item> -->
             <el-descriptions-item content-class-name="my-content" label="最后跟进时间" label-class-name="my-label">
-              {{ parseTime(detail.followUpDate, '{y}-{m}-{d} {h}:{i}') }}
+              {{ parseTime(detail.followUpDate, '{y}-{m}-{d}') }}
             </el-descriptions-item>
           </el-descriptions>
         </header>
@@ -60,7 +60,7 @@
               <el-descriptions-item label="客户级别">
                 {{ selectDictLabel(levelOptions, detail.custLevel) }}
               </el-descriptions-item>
-              <el-descriptions-item label="下次联系时间">
+              <el-descriptions-item label="最后跟进时间">
                 {{ detail.followUpDate }}
               </el-descriptions-item>
               <el-descriptions-item label="所在省">
@@ -82,7 +82,7 @@
                 {{ detail.createdTime }}
               </el-descriptions-item>
               <el-descriptions-item label="跟进次数">
-                {{ abstract.followContent }}
+                {{ abstract.followCount }}
               </el-descriptions-item>
               <el-descriptions-item label="未跟进时长">
                 {{ abstract.notFollowDay }}
@@ -214,7 +214,7 @@
           <el-tab-pane label="项目记录" name="item">
             <el-table border :data="items" height="calc(100% - 42px)">
               <el-table-column align="center" label="项目编号" prop="nboCode" width="120px" />
-              <el-table-column align="center" label="项目名称" prop="nboName" width="200px" />
+              <el-table-column align="center" label="项目名称" prop="nboName" show-overflow-tooltip width="200px" />
               <el-table-column align="center" label="审批状态" prop="approStatus" width="120px">
                 <template slot-scope="scope">
                   {{ getStatus(scope.row.approStatus) }}
@@ -222,8 +222,13 @@
               </el-table-column>
               <!--              <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" />
+              <el-table-column
+                align="center"
+                label="经销商/代理商"
+                prop="distributorName"
+                show-overflow-tooltip
+                width="200px" />
+              <el-table-column align="center" label="项目预算" prop="nboBudget" width="120px" />
               <el-table-column align="center" label="项目备案时间" prop="filingTime" width="160px" />
               <!--              <el-table-column align="center" label="项目来源" prop="nboSource" width="160px" />-->
               <!--              <el-table-column align="center" label="销售模式" prop="salesModel" width="160px" />-->
@@ -233,15 +238,24 @@
           </el-tab-pane>
           <el-tab-pane label="合同记录" name="contract">
             <el-table border :data="contracts" height="calc(100% - 42px)">
-              <el-table-column align="center" label="合同编号" prop="contractCode" width="320px" />
-              <el-table-column align="center" label="合同名称" prop="contractName" width="200px" />
-              <el-table-column align="center" label="项目名称" prop="nboName" width="320px" />
+              <el-table-column align="center" label="合同编号" prop="contractCode" width="140px" />
+              <el-table-column
+                align="center"
+                label="合同名称"
+                prop="contractName"
+                show-overflow-tooltip
+                width="240px" />
+              <el-table-column align="center" label="项目名称" prop="nboName" show-overflow-tooltip width="240px" />
               <el-table-column align="center" label="审批状态" prop="approStatus" width="120px">
                 <template slot-scope="scope">
                   {{ getStatus(scope.row.approStatus) }}
                 </template>
               </el-table-column>
-              <el-table-column align="center" label="合同类型" prop="contractType" width="120px" />
+              <el-table-column align="center" label="合同类型" prop="contractType" width="120px">
+                <template slot-scope="scope">
+                  {{ selectDictLabel(contractTypeOptions, scope.row.contractType) }}
+                </template>
+              </el-table-column>
               <el-table-column align="center" label="合同金额" prop="contractAmount" width="120px" />
               <el-table-column align="center" label="负责人" prop="inchargeName" width="120px" />
               <el-table-column align="center" label="公司签约人" prop="signatoryName" width="140px" />
@@ -320,10 +334,10 @@
               </vab-query-form-right-panel>
             </vab-query-form>
             <el-table border :data="invoiceHeaderList" height="calc(100% - 42px)">
-              <el-table-column align="center" label="客户名称" prop="cuctName" width="120px" />
-              <el-table-column align="center" label="公司名称" prop="companyName" width="120px" />
+              <el-table-column align="center" label="客户名称" prop="cuctName" width="220px" />
+              <el-table-column align="center" label="公司名称" prop="companyName" width="220px" />
               <el-table-column align="center" label="纳税人识别号" prop="taxNo" width="120px" />
-              <el-table-column align="center" label="地址" prop="address" width="120px" />
+              <el-table-column align="center" label="地址" prop="address" width="160px" />
               <el-table-column align="center" label="开户行及账号" prop="bankNo" width="120px" />
               <el-table-column align="center" label="备注" prop="remark" width="120px" />
               <el-table-column align="center" fixed="right" label="操作" width="90px">
@@ -469,6 +483,7 @@
         custInfo: {},
         levelOptions: [],
         industryOptions: [],
+        contractTypeOptions: [],
       }
     },
     computed: {
@@ -486,10 +501,11 @@
     },
     methods: {
       getOptions() {
-        Promise.all([this.getDicts('cust_level'), this.getDicts('cust_idy')])
-          .then(([level, industry]) => {
+        Promise.all([this.getDicts('cust_level'), this.getDicts('cust_idy'), this.getDicts('contract_type')])
+          .then(([level, industry, contractType]) => {
             this.levelOptions = level.data.values || []
             this.industryOptions = industry.data.values || []
+            this.contractTypeOptions = contractType.data.values || []
           })
           .catch((err) => console.log(err))
       },

+ 8 - 8
src/views/customer/list.vue

@@ -110,10 +110,10 @@
             {{ selectDictLabel(industryOptions, row.custIndustry) }}
           </span>
           <span v-else-if="item.prop === 'followUpDate'">
-            {{ parseTime(row.followUpDate, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.followUpDate, '{y}-{m}-{d}') }}
           </span>
           <span v-else-if="item.prop === 'createdTime'">
-            {{ parseTime(row.createdTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.createdTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else>{{ row[item.prop] }}</span>
         </template>
@@ -197,14 +197,14 @@
           },
           {
             label: '客户名称',
-            width: '160px',
+            width: '200px',
             prop: 'custName',
             sortable: false,
             disableCheck: true,
           },
           {
             label: '助记名',
-            width: '100px',
+            width: '120px',
             prop: 'abbrName',
             sortable: false,
             disableCheck: false,
@@ -246,28 +246,28 @@
           // },
           {
             label: '最后跟进时间',
-            width: '150px',
+            width: '100px',
             prop: 'followUpDate',
             sortable: false,
             disableCheck: false,
           },
           {
             label: '最后跟进人',
-            width: '120px',
+            width: '100px',
             prop: 'followUpMan',
             sortable: false,
             disableCheck: false,
           },
           {
             label: '所属销售',
-            width: '120px',
+            width: '100px',
             prop: 'salesName',
             sortable: false,
             disableCheck: false,
           },
           {
             label: '创建时间',
-            width: '150px',
+            width: '100px',
             prop: 'createdTime',
             sortable: false,
             disableCheck: false,

+ 6 - 6
src/views/customer/openSea.vue

@@ -84,10 +84,10 @@
             {{ selectDictLabel(industryOptions, row.custIndustry) }}
           </span>
           <span v-else-if="item.prop === 'followUpDate'">
-            {{ parseTime(row.followUpDate, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.followUpDate, '{y}-{m}-{d}') }}
           </span>
           <span v-else-if="item.prop === 'createdTime'">
-            {{ parseTime(row.createdTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.createdTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else>{{ row[item.prop] }}</span>
         </template>
@@ -207,14 +207,14 @@
           },
           {
             label: '客户名称',
-            width: '160px',
+            width: '200px',
             prop: 'custName',
             sortable: false,
             disableCheck: true,
           },
           {
             label: '助记名',
-            width: '100px',
+            width: '120px',
             prop: 'abbrName',
             sortable: false,
             disableCheck: false,
@@ -256,7 +256,7 @@
           // },
           {
             label: '最后跟进时间',
-            width: '150px',
+            width: '100px',
             prop: 'followUpDate',
             sortable: false,
             disableCheck: false,
@@ -277,7 +277,7 @@
           },
           {
             label: '创建时间',
-            width: '150px',
+            width: '100px',
             prop: 'createdTime',
             sortable: false,
             disableCheck: false,

+ 5 - 3
src/views/index/index.vue

@@ -147,7 +147,7 @@
             </p>
             <p class="time">
               <vab-icon icon="time-line" />
-              {{ parseTime(message.createdTime, '{y}-{m}-{d} {h}:{i}') }}
+              {{ parseTime(message.createdTime, '{y}-{m}-{d}') }}
             </p>
           </li>
         </ul>
@@ -388,6 +388,7 @@
         const chartBar = echarts.init(document.getElementById(id))
         const [err, res] = await to(indexApi.getHomeDataReportData({ id, Params: { searchType } }))
         if (err) return
+        console.log(res.data.data)
         const option = {
           grid: {
             bottom: 30,
@@ -416,7 +417,7 @@
             },
             {
               type: 'value',
-              name: '回款率(%)',
+              name: res.data.id == 20000 ? '签约完成率(%)' : '回款率(%)',
               min: 0,
               max: 100,
               alignTicks: true,
@@ -606,8 +607,9 @@
       },
       async getBoardOptions() {
         this.activeName = 'first'
-        const [err, res] = await to(indexApi.getReportList())
+        const [err, res] = await to(indexApi.getRoleReportList())
         if (err) return
+        console.log(res)
         const arr = res.data.list || []
         arr.forEach((item) => (item.checked = false))
         this.addLayout = arr.filter((item) => item.reportType == 20)

+ 1 - 1
src/views/plat/questionnaire/index.vue

@@ -57,7 +57,7 @@
       <el-table-column align="center" label="问题描述" prop="remark" show-overflow-tooltip />
       <el-table-column align="center" label="创建时间" prop="createdTime">
         <template #default="scope">
-          <span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d} {h}:{i}') }}</span>
+          <span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d}') }}</span>
         </template>
       </el-table-column>
       <el-table-column align="center" label="操作" show-overflow-tooltip width="125">

+ 2 - 2
src/views/proj/business/components/BusinessEdit.vue

@@ -56,7 +56,7 @@
           <el-form-item label="销售工程师" prop="saleName">
             <el-input
               v-model="form.saleName"
-              :disabled="form.id"
+              :disabled="form.id > 0"
               readonly
               suffix-icon="el-icon-search"
               @focus="handleSelectSale" />
@@ -478,7 +478,7 @@
           this.getProductData(row.id)
         }
         this.dialogFormVisible = true
-        if (this.roleKeys.includes('SalesEngineer')) {
+        if (this.roleKeys.includes('SalesEngineer') && !this.form.saleId) {
           this.form.saleId = this.userId
           this.form.saleName = this.nickName
         }

+ 8 - 4
src/views/proj/business/components/BusinessGradation.vue

@@ -157,7 +157,7 @@
             </el-form-item>
           </el-col>
           <el-col v-if="form.isAdoptDashoo === '10'" :span="8">
-            <el-form-item label="文件" prop="file" :required="form.isAdoptDashoo === '10'">
+            <el-form-item label="参数文件" prop="file" :required="form.isAdoptDashoo === '10'">
               <el-upload
                 ref="uploadRef"
                 action="#"
@@ -408,9 +408,13 @@
           if (valid) {
             this.$baseConfirm('你确定要对当前项目' + this.title + '吗', null, async () => {
               if (this.type === 'up') {
-                console.log(this.form)
-                const { msg } = await businessApi.businessUpgrade(this.form)
-                this.$baseMessage(msg, 'success')
+                if (this.form.nboType === '10' && this.form.isAdoptDashoo === '10') {
+                  const { msg } = await businessApi.businessUpgradeA(this.form)
+                  this.$baseMessage(msg, 'success')
+                } else {
+                  const { msg } = await businessApi.businessUpgrade(this.form)
+                  this.$baseMessage(msg, 'success')
+                }
               }
               if (this.type === 'down') {
                 const { msg } = await businessApi.businessDowngrade(this.form)

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

@@ -29,11 +29,11 @@
         </div>
         <header>
           <el-descriptions :colon="false" :column="7" direction="vertical">
-            <el-descriptions-item content-class-name="my-content" label="项目编码" label-class-name="my-label">
-              {{ details.nboCode }}
-            </el-descriptions-item>
+            <!--            <el-descriptions-item content-class-name="my-content" label="项目编码" label-class-name="my-label">-->
+            <!--              {{ details.nboCode }}-->
+            <!--            </el-descriptions-item>-->
             <el-descriptions-item content-class-name="my-content" label="客户名称" label-class-name="my-label">
-              {{ details.custName }}
+              <span class="link-button" @click="handleCustomerDetail(details)">{{ details.custName }}</span>
             </el-descriptions-item>
             <el-descriptions-item content-class-name="my-content" label="销售工程师" label-class-name="my-label">
               {{ details.saleName }}
@@ -45,10 +45,13 @@
               {{ selectDictLabel(productLineOptions, details.productLine) }}
             </el-descriptions-item>
             <el-descriptions-item content-class-name="my-content" label="项目预算" label-class-name="my-label">
-              ¥{{ details.nboBudget }}
+              {{ formatPrice(details.nboBudget) }}
+            </el-descriptions-item>
+            <el-descriptions-item content-class-name="my-content" label="出货金额" label-class-name="my-label">
+              {{ formatPrice(details.estTransPrice) }}
             </el-descriptions-item>
             <el-descriptions-item content-class-name="my-content" label="最新跟进时间" label-class-name="my-label">
-              {{ parseTime(details.finalFollowTime, '{y}-{m}-{d} {h}:{i}') }}
+              {{ parseTime(details.finalFollowTime, '{y}-{m}-{d}') }}
             </el-descriptions-item>
           </el-descriptions>
         </header>
@@ -83,10 +86,10 @@
                 {{ details.distributorName }}
               </el-descriptions-item>
               <el-descriptions-item label="下次联系时间">
-                {{ parseTime(details.nextFollowTime, '{y}-{m}-{d} {h}:{i}') }}
+                {{ parseTime(details.nextFollowTime, '{y}-{m}-{d}') }}
               </el-descriptions-item>
               <el-descriptions-item label="最新跟进时间">
-                {{ parseTime(details.finalFollowTime, '{y}-{m}-{d} {h}:{i}') }}
+                {{ parseTime(details.finalFollowTime, '{y}-{m}-{d}') }}
               </el-descriptions-item>
               <el-descriptions-item label="计划采购时间">
                 {{ parseTime(details.planPurchaseTime, '{y}-{m}-{d}') }}
@@ -106,7 +109,7 @@
 
               <!--  C-B  -->
               <el-descriptions-item label="技术支持时间">
-                {{ parseTime(details.technicalSupportTime, '{y}-{m}-{d} {h}:{i}') }}
+                {{ parseTime(details.technicalSupportTime, '{y}-{m}-{d}') }}
               </el-descriptions-item>
               <el-descriptions-item label="技术支持人员">
                 {{ details.technicalSupportName }}
@@ -118,7 +121,7 @@
                 {{ details.parentReceiver }}
               </el-descriptions-item>
               <el-descriptions-item label="项目预算期限">
-                {{ parseTime(details.nboBudgetTime, '{y}-{m}-{d} {h}:{i}') }}
+                {{ parseTime(details.nboBudgetTime, '{y}-{m}-{d}') }}
               </el-descriptions-item>
               <el-descriptions-item label="资金来源">
                 {{ details.capitalSource }}
@@ -132,7 +135,7 @@
                 {{ details.purchasingWay }}
               </el-descriptions-item>
               <el-descriptions-item label="采购时间">
-                {{ parseTime(details.purchasingTime, '{y}-{m}-{d} {h}:{i}') }}
+                {{ parseTime(details.purchasingTime, '{y}-{m}-{d}') }}
               </el-descriptions-item>
               <el-descriptions-item label="决策人员">
                 {{ details.makerName }}
@@ -175,6 +178,7 @@
               @fetch-data="getRecord" />
           </el-tab-pane>
           <el-tab-pane label="产品信息" name="product">
+            <h3 style="float: right; margin-right: 20px">预计出货金额: {{ formatPrice(details.estTransPrice) }}</h3>
             <product-table ref="productTable" is-look :product-data="productData" />
           </el-tab-pane>
           <el-tab-pane label="合同记录" name="contract">
@@ -403,6 +407,15 @@
       //     await this.init()
       //   })
       // },
+      // 跳转详情
+      handleCustomerDetail(row) {
+        this.$router.push({
+          name: 'CustomerDetail',
+          query: {
+            id: row.custId,
+          },
+        })
+      },
       back() {
         this.$router.go(-1)
       },

+ 22 - 15
src/views/proj/business/index.vue

@@ -146,19 +146,19 @@
             {{ formatPrice(row.contractAmount) }}
           </span>
           <span v-else-if="item.prop === 'filingTime'">
-            {{ parseTime(row.filingTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.filingTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else-if="item.prop === 'finalFollowTime'">
-            {{ parseTime(row.finalFollowTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.finalFollowTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else-if="item.prop === 'nextFollowTime'">
-            {{ parseTime(row.nextFollowTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.nextFollowTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else-if="item.prop === 'projClosingTime'">
-            {{ parseTime(row.projClosingTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.projClosingTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else-if="item.prop === 'projConversionTime'">
-            {{ parseTime(row.projConversionTime, '{y}-{m}-{d} {h}:{i}') }}
+            {{ parseTime(row.projConversionTime, '{y}-{m}-{d}') }}
           </span>
           <span v-else>{{ row[item.prop] }}</span>
         </template>
@@ -253,12 +253,12 @@
             label: '客户名称',
             prop: 'custName',
             width: 'auto',
-            minWidth: '180px',
+            minWidth: '200px',
           },
           {
             label: '项目备案时间',
             prop: 'filingTime',
-            width: '150px',
+            width: '110px',
           },
           {
             label: '项目来源',
@@ -273,13 +273,13 @@
           {
             label: '经销商/代理商',
             prop: 'distributorName',
-            minWidth: '160px',
+            minWidth: '180px',
             width: 'auto',
           },
           {
             label: '产品线',
             prop: 'productLine',
-            width: '120px',
+            width: '140px',
           },
           {
             label: '项目类别',
@@ -287,10 +287,15 @@
             width: '80px',
           },
           {
-            label: '项目预算(万元)',
+            label: '项目预算',
             prop: 'nboBudget',
             width: '120px',
           },
+          {
+            label: '出货金额',
+            prop: 'estTransPrice',
+            width: '120px',
+          },
           {
             label: '大项目',
             prop: 'isBig',
@@ -299,7 +304,7 @@
           {
             label: '最新跟进时间',
             prop: 'finalFollowTime',
-            width: '150px',
+            width: '110px',
           },
           {
             label: '最新跟进人',
@@ -309,7 +314,7 @@
           {
             label: '项目成交时间',
             prop: 'projClosingTime',
-            width: '150px',
+            width: '110px',
           },
           {
             label: '合同金额',
@@ -319,7 +324,7 @@
           {
             label: '项目转化时间',
             prop: 'projConversionTime',
-            width: '150px',
+            width: '110px',
           },
           {
             label: '转化原因',
@@ -339,7 +344,8 @@
           '经销商/代理商',
           '产品线',
           '项目类别',
-          '项目预算(万元)',
+          '项目预算',
+          '出货金额',
           '大项目',
           '最新跟进时间',
         ],
@@ -354,7 +360,8 @@
           '销售模式',
           '经销商/代理商',
           '产品线',
-          '项目预算(万元)',
+          '项目预算',
+          '出货金额',
           '大项目',
           '最新跟进时间',
           '最新跟进',

+ 1 - 1
src/views/system/notice/components/NoticeEdit.vue

@@ -122,7 +122,7 @@
         this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错
       },
       handleSelectUsers() {
-        this.$refs.selectSales.open()
+        this.$refs.selectUsers.open()
       },
       selectUsers(val) {
         if (val && val.length > 0) {

+ 11 - 16
src/views/system/report/components/ReportList.vue

@@ -7,7 +7,7 @@
  * @FilePath: \opms_frontend\src\views\system\report\components\ReportList.vue
 -->
 <template>
-  <el-dialog :title="title" :visible.sync="dialogFormVisible" width="700px" @close="close">
+  <el-dialog :title="title" :visible.sync="dialogFormVisible" @close="close">
     <el-table
       ref="RoleReportTable"
       v-loading="listLoading"
@@ -19,23 +19,18 @@
       <el-table-column align="center" label="角色Id" prop="id" show-overflow-tooltip />
       <el-table-column align="center" label="角色名称" prop="roleName" show-overflow-tooltip />
       <el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip />
-      <el-table-column align="center" label="创建时间" prop="createdTime">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.createdTime) }}</span>
-        </template>
-      </el-table-column>
       <template #empty>
         <el-image class="vab-data-empty" :src="require('@/assets/empty_images/data_empty.png')" />
       </template>
     </el-table>
-    <el-pagination
-      background
-      :current-page="queryForm.pageNum"
-      :layout="layout"
-      :page-size="queryForm.pageSize"
-      :total="total"
-      @current-change="handleCurrentChange"
-      @size-change="handleSizeChange" />
+    <!--    <el-pagination-->
+    <!--      background-->
+    <!--      :current-page="queryForm.pageNum"-->
+    <!--      :layout="layout"-->
+    <!--      :page-size="queryForm.pageSize"-->
+    <!--      :total="total"-->
+    <!--      @current-change="handleCurrentChange"-->
+    <!--      @size-change="handleSizeChange" />-->
   </el-dialog>
 </template>
 <script>
@@ -61,7 +56,7 @@
         rid: '',
         queryForm: {
           pageNum: 1,
-          pageSize: 10,
+          pageSize: 100,
           reportName: undefined,
           roleName: undefined,
           remark: undefined,
@@ -116,7 +111,7 @@
         this.listLoading = false
       },
       async getRoleList(rid) {
-        roleApi.getList({ status: '10' }).then(async (response) => {
+        roleApi.getList({ status: '10', pageSize: 100 }).then(async (response) => {
           this.list = response.data.list
           this.total = response.data.total
           this.listLoading = false

+ 3 - 1
src/views/system/report/index.vue

@@ -55,7 +55,9 @@
       </el-table-column>
       <el-table-column align="center" label="操作" show-overflow-tooltip width="125">
         <template #default="{ row }">
-          <el-button type="text" @click="handleApplication(row)">应用</el-button>
+          <el-button v-permissions="['system:report:application']" type="text" @click="handleApplication(row)">
+            应用
+          </el-button>
           <el-button v-permissions="['system:report:edit']" type="text" @click="handleEdit(row)">编辑</el-button>
           <el-button v-permissions="['system:report:delete']" type="text" @click="handleDelete(row)">删除</el-button>
         </template>