Kaynağa Gözat

提交修改~

zhengjinyi 1 yıl önce
ebeveyn
işleme
861c0f93a4

+ 3 - 3
jsconfig.json

@@ -1,9 +1,9 @@
-{ 
+{
   "compilerOptions": {
   "compilerOptions": {
     "baseUrl": "./",
     "baseUrl": "./",
     "paths": {
     "paths": {
-        "@/*": ["src/*"]
+      "@/*": ["src/*"]
     }
     }
   },
   },
   "exclude": ["node_modules", "dist"]
   "exclude": ["node_modules", "dist"]
-}
+}

Dosya farkı çok büyük olduğundan ihmal edildi
+ 24619 - 1
package-lock.json


+ 1 - 1
package.json

@@ -21,7 +21,7 @@
     "core-js": "3.6.5",
     "core-js": "3.6.5",
     "driver.js": "0.9.5",
     "driver.js": "0.9.5",
     "dropzone": "5.5.1",
     "dropzone": "5.5.1",
-    "echarts": "4.2.1",
+    "echarts": "^4.2.1",
     "element-ui": "2.13.2",
     "element-ui": "2.13.2",
     "file-saver": "2.0.1",
     "file-saver": "2.0.1",
     "fuse.js": "3.4.4",
     "fuse.js": "3.4.4",

Dosya farkı çok büyük olduğundan ihmal edildi
+ 1971 - 7
pnpm-lock.yaml


+ 32 - 0
src/api/user/customer/customer.js

@@ -391,3 +391,35 @@ export function getPageShopKeyword(params) {
     params
     params
   })
   })
 }
 }
+/**
+ * 游客备注
+ * @param {*} informationId 游客I都
+ * @param {*} pageNum 页码
+ * @param {*} pageSize 条数
+ * @returns
+ */
+export function getInformationNoteList(params) {
+  return request({
+    url: '/user/customer/getInformationNoteList',
+    method: 'get',
+    params
+  })
+}
+/**
+ * 保存游客备注
+ * @param {*} id 备注Id
+ * @param {*} informationId 游客Id
+ * @param {*} note 备注
+ * @param {*} appImage 小程序广告图
+ * @param {*} jumpLink 跳转链接
+ * @param {*} status 状态
+ * @param {*} addTime 添加时间
+ * @returns
+ */
+export function saveInformation(data) {
+  return request({
+    url: '/user/customer/saveInformation',
+    method: 'post',
+    data: data
+  })
+}

+ 14 - 18
src/components/Tinymce/index.vue

@@ -1,9 +1,6 @@
 <template>
 <template>
-  <div :class="{fullscreen:fullscreen}" class="tinymce-container" :style="{width:containerWidth}">
-    <textarea :id="tinymceId" class="tinymce-textarea" />
-    <div class="editor-custom-btn-container">
-      <editorImage color="#1890ff" class="editor-upload-btn" @successCBK="imageSuccessCBK" />
-    </div>
+  <div :class="{ fullscreen: fullscreen }" class="tinymce-container" :style="{ width: containerWidth }">
+    <textarea :id="tinymceId" class="tinymce-textarea"></textarea>
   </div>
   </div>
 </template>
 </template>
 
 
@@ -12,7 +9,7 @@
  * docs:
  * docs:
  * https://panjiachen.github.io/vue-element-admin-site/feature/component/rich-editor.html#tinymce
  * https://panjiachen.github.io/vue-element-admin-site/feature/component/rich-editor.html#tinymce
  */
  */
-import editorImage from './components/EditorImage'
+
 import plugins from './plugins'
 import plugins from './plugins'
 import toolbar from './toolbar'
 import toolbar from './toolbar'
 import load from './dynamicLoadScript'
 import load from './dynamicLoadScript'
@@ -22,11 +19,10 @@ const tinymceCDN = 'https://cdn.jsdelivr.net/npm/tinymce-all-in-one@4.9.3/tinymc
 
 
 export default {
 export default {
   name: 'Tinymce',
   name: 'Tinymce',
-  components: { editorImage },
   props: {
   props: {
     id: {
     id: {
       type: String,
       type: String,
-      default: function() {
+      default() {
         return 'vue-tinymce-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '')
         return 'vue-tinymce-' + +new Date() + ((Math.random() * 1000).toFixed(0) + '')
       }
       }
     },
     },
@@ -63,17 +59,18 @@ export default {
       tinymceId: this.id,
       tinymceId: this.id,
       fullscreen: false,
       fullscreen: false,
       languageTypeList: {
       languageTypeList: {
-        'en': 'en',
-        'zh': 'zh_CN',
-        'es': 'es_MX',
-        'ja': 'ja'
+        en: 'en',
+        zh: 'zh_CN',
+        es: 'es_MX',
+        ja: 'ja'
       }
       }
     }
     }
   },
   },
   computed: {
   computed: {
     containerWidth() {
     containerWidth() {
       const width = this.width
       const width = this.width
-      if (/^[\d]+(\.[\d]+)?$/.test(width)) { // matches `100`, `'100'`
+      if (/^[\d]+(\.[\d]+)?$/.test(width)) {
+        // matches `100`, `'100'`
         return `${width}px`
         return `${width}px`
       }
       }
       return width
       return width
@@ -82,8 +79,7 @@ export default {
   watch: {
   watch: {
     value(val) {
     value(val) {
       if (!this.hasChange && this.hasInit) {
       if (!this.hasChange && this.hasInit) {
-        this.$nextTick(() =>
-          window.tinymce.get(this.tinymceId).setContent(val || ''))
+        this.$nextTick(() => window.tinymce.get(this.tinymceId).setContent(val || ''))
       }
       }
     }
     }
   },
   },
@@ -116,7 +112,7 @@ export default {
       const _this = this
       const _this = this
       window.tinymce.init({
       window.tinymce.init({
         selector: `#${this.tinymceId}`,
         selector: `#${this.tinymceId}`,
-        language: this.languageTypeList['en'],
+        language: this.languageTypeList['zh'],
         height: this.height,
         height: this.height,
         body_class: 'panel-body ',
         body_class: 'panel-body ',
         object_resizing: false,
         object_resizing: false,
@@ -133,7 +129,7 @@ export default {
         default_link_target: '_blank',
         default_link_target: '_blank',
         link_title: false,
         link_title: false,
         nonbreaking_force_tab: true, // inserting nonbreaking space &nbsp; need Nonbreaking Space Plugin
         nonbreaking_force_tab: true, // inserting nonbreaking space &nbsp; need Nonbreaking Space Plugin
-        init_instance_callback: editor => {
+        init_instance_callback: (editor) => {
           if (_this.value) {
           if (_this.value) {
             editor.setContent(_this.value)
             editor.setContent(_this.value)
           }
           }
@@ -204,7 +200,7 @@ export default {
       window.tinymce.get(this.tinymceId).getContent()
       window.tinymce.get(this.tinymceId).getContent()
     },
     },
     imageSuccessCBK(arr) {
     imageSuccessCBK(arr) {
-      arr.forEach(v => window.tinymce.get(this.tinymceId).insertContent(`<img class="wscnph" src="${v.url}" >`))
+      arr.forEach((v) => window.tinymce.get(this.tinymceId).insertContent(`<img class="wscnph" src="${v.url}" >`))
     }
     }
   }
   }
 }
 }

+ 35 - 0
src/router/modules/user.js

@@ -43,6 +43,41 @@ const userRouter = {
           meta: { title: '潜客统计列表' },
           meta: { title: '潜客统计列表' },
           hidden: true
           hidden: true
         },
         },
+        {
+          path: 'customer-remarks',
+          name: 'CustomerRemarks',
+          component: () => import('@/views/user/customer/customer-remarks'),
+          meta: { title: '潜客备注' },
+          hidden: true
+        },
+        {
+          path: 'customer-remarks-add',
+          name: 'CustomerRemarksAdd',
+          component: () => import('@/views/user/customer/customer-remarks-add '),
+          meta: { title: '添加备注' },
+          hidden: true
+        },
+        {
+          path: 'customer-ambition-list',
+          name: 'CustomerAmbitionList',
+          component: () => import('@/views/user/customer/customer-ambition-list'),
+          meta: { title: '意向客户数据' },
+          hidden: true
+        },
+        {
+          path: 'customer-ambition-edit',
+          name: 'CustomerAmbitionEdit',
+          component: () => import('@/views/user/customer/customer-ambition-edit'),
+          meta: { title: '添加/编辑' },
+          hidden: true
+        },
+        {
+          path: 'customer-ambition-sum',
+          name: 'CustomerAmbitionSum',
+          component: () => import('@/views/user/customer/customer-ambition-sum'),
+          meta: { title: '数据总结' },
+          hidden: true
+        },
         {
         {
           path: 'customer-article-list',
           path: 'customer-article-list',
           name: 'CustomerArticleList',
           name: 'CustomerArticleList',

+ 26 - 5
src/views/user/consult/detail.vue

@@ -67,7 +67,7 @@
         </div>
         </div>
         <div v-for="(item, index) in list" v-else :key="index" class="list-main">
         <div v-for="(item, index) in list" v-else :key="index" class="list-main">
           <div class="list-main-item">
           <div class="list-main-item">
-            <span class="list-time">{{ item.addTime }}</span>
+            <span class="list-times">{{ item.addTime }}</span>
             <el-row :gutter="24" class="box-row">
             <el-row :gutter="24" class="box-row">
               <el-col v-if="item.clubName" :span="6"><b>机构:</b> {{ item.clubName }}</el-col>
               <el-col v-if="item.clubName" :span="6"><b>机构:</b> {{ item.clubName }}</el-col>
               <el-col :span="6"><b>咨询人:</b> {{ item.questionMan }}</el-col>
               <el-col :span="6"><b>咨询人:</b> {{ item.questionMan }}</el-col>
@@ -184,7 +184,16 @@
               </el-col>
               </el-col>
               <el-col v-if="item.consultType" :span="12">
               <el-col v-if="item.consultType" :span="12">
                 <b>咨询类别:</b>
                 <b>咨询类别:</b>
-                <el-tag type="success" size="small"> {{ item.consultType }} </el-tag>
+                <el-tag
+                  v-for="(consultType, consultTypeIndex) in item.consultType.split(',')"
+                  :key="consultTypeIndex"
+                  style="margin: 0 1px"
+                  type="info"
+                  size="small"
+                  effect="dark"
+                >
+                  {{ consultType }}
+                </el-tag>
               </el-col>
               </el-col>
             </el-row>
             </el-row>
             <el-row :gutter="24" class="box-row">
             <el-row :gutter="24" class="box-row">
@@ -204,7 +213,16 @@
             <el-row v-if="item.remarks" :gutter="24" class="box-row">
             <el-row v-if="item.remarks" :gutter="24" class="box-row">
               <el-col :span="24">
               <el-col :span="24">
                 <b>标签词:</b>
                 <b>标签词:</b>
-                <el-tag type="success" size="small"> {{ item.remarks }} </el-tag>
+                <el-tag
+                  v-for="(remarks, remarksIndex) in item.remarks.split(',')"
+                  :key="remarksIndex"
+                  style="margin: 0 1px"
+                  type="success"
+                  size="small"
+                  effect="dark"
+                >
+                  {{ remarks }}
+                </el-tag>
               </el-col>
               </el-col>
             </el-row>
             </el-row>
             <el-row v-if="item.extra" :gutter="24" class="box-row">
             <el-row v-if="item.extra" :gutter="24" class="box-row">
@@ -303,12 +321,15 @@ export default {
     sourceActionsFilters(value) {
     sourceActionsFilters(value) {
       // 客户来源
       // 客户来源
       const map = {
       const map = {
-        0: '网站',
+        0: '搜素引擎',
         1: '小程序',
         1: '小程序',
         2: '公众号',
         2: '公众号',
         3: '小红书',
         3: '小红书',
         4: '微博',
         4: '微博',
         5: '搜狐',
         5: '搜狐',
+        7: '抖音',
+        8: '视频号',
+        9: '朋友推荐',
         6: '其他'
         6: '其他'
       }
       }
       return map[value]
       return map[value]
@@ -499,7 +520,7 @@ export default {
   left: -55px;
   left: -55px;
   top: 10px;
   top: 10px;
 }
 }
-.list-main-item .list-time {
+.list-main-item .list-times {
   display: inline-block;
   display: inline-block;
   font-size: 20px;
   font-size: 20px;
   color: #333333;
   color: #333333;

+ 116 - 56
src/views/user/consult/list.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="app-container" style="padding: 0 20px 20px 20px">
   <div class="app-container" style="padding: 0 20px 20px 20px">
     <!-- 顶部操作区域 -->
     <!-- 顶部操作区域 -->
-    <date-picker @prev-month="handlePrevMonth" @next-month="handleNextMonth" />
+    <!-- <date-picker @prev-month="handlePrevMonth" @next-month="handleNextMonth" /> -->
     <!-- 筛选项 -->
     <!-- 筛选项 -->
     <div class="filter-container">
     <div class="filter-container">
       <div class="filter-control">
       <div class="filter-control">
@@ -10,6 +10,7 @@
           v-model="listQuery.remarks"
           v-model="listQuery.remarks"
           placeholder="标签词"
           placeholder="标签词"
           clearable
           clearable
+          style="width: 150px"
           @keyup.enter.native="getList"
           @keyup.enter.native="getList"
           @clear="getList"
           @clear="getList"
         />
         />
@@ -26,14 +27,14 @@
       </div>
       </div>
       <div class="filter-control">
       <div class="filter-control">
         <span>咨询类别:</span>
         <span>咨询类别:</span>
-        <el-select v-model="listQuery.consult" clearable @change="getList">
+        <el-select v-model="listQuery.consult" clearable style="width: 120px" @change="getList">
           <el-option value="" label="请选择" />
           <el-option value="" label="请选择" />
           <el-option v-for="(item, index) in categoryList" :key="index" :label="item.className" :value="item.id" />
           <el-option v-for="(item, index) in categoryList" :key="index" :label="item.className" :value="item.id" />
         </el-select>
         </el-select>
       </div>
       </div>
       <div class="filter-control">
       <div class="filter-control">
         <span>是否注册:</span>
         <span>是否注册:</span>
-        <el-select v-model="listQuery.isRegister" clearable @change="getList">
+        <el-select v-model="listQuery.isRegister" clearable style="width: 120px" @change="getList">
           <el-option value="" label="请选择" />
           <el-option value="" label="请选择" />
           <el-option :value="1" label="未注册" />
           <el-option :value="1" label="未注册" />
           <el-option :value="2" label="已注册" />
           <el-option :value="2" label="已注册" />
@@ -41,31 +42,45 @@
       </div>
       </div>
       <div class="filter-control">
       <div class="filter-control">
         <span>新分配机构:</span>
         <span>新分配机构:</span>
-        <el-select v-model="listQuery.newDeal" clearable @change="getList">
+        <el-select v-model="listQuery.newDeal" clearable style="width: 120px" @change="getList">
           <el-option value="" label="请选择" />
           <el-option value="" label="请选择" />
           <el-option :value="1" label="是" />
           <el-option :value="1" label="是" />
           <el-option :value="2" label="否" />
           <el-option :value="2" label="否" />
         </el-select>
         </el-select>
       </div>
       </div>
+      <div class="filter-control">
+        <span>提交时间:</span>
+        <el-date-picker
+          v-model="time"
+          type="daterange"
+          unlink-panels
+          value-format="yyyy-MM-dd"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :picker-options="pickerOptions"
+          @change="handleDatePick"
+        />
+      </div>
       <div class="filter-control">
       <div class="filter-control">
         <el-button type="primary" @click="getList"> 查询 </el-button>
         <el-button type="primary" @click="getList"> 查询 </el-button>
       </div>
       </div>
     </div>
     </div>
     <div class="filter-container">
     <div class="filter-container">
       <span class="span-labels">
       <span class="span-labels">
-        当日咨询客户总数:
+        【查询时间内】咨询客户总数:
         <el-tag type="primary" size="small">
         <el-tag type="primary" size="small">
           {{ totalInfo.number }}
           {{ totalInfo.number }}
         </el-tag>
         </el-tag>
       </span>
       </span>
       <span class="span-labels">
       <span class="span-labels">
-        已注册客户:
+        已注册客户总数
         <el-tag type="primary" size="small">
         <el-tag type="primary" size="small">
           {{ totalInfo.registeredNumber }}
           {{ totalInfo.registeredNumber }}
         </el-tag>
         </el-tag>
       </span>
       </span>
       <span class="span-labels">
       <span class="span-labels">
-        未注册客户:
+        未注册客户总数
         <el-tag type="primary" size="small">
         <el-tag type="primary" size="small">
           {{ totalInfo.unRegisteredNumber }}
           {{ totalInfo.unRegisteredNumber }}
         </el-tag>
         </el-tag>
@@ -87,19 +102,19 @@
     <div class="filter-container">
     <div class="filter-container">
       <span class="span-labels">
       <span class="span-labels">
         <el-tag type="primary" size="small">{{ sellerTabsInfo.linkMan }}</el-tag>
         <el-tag type="primary" size="small">{{ sellerTabsInfo.linkMan }}</el-tag>
-        当日咨询客户总数:
+        【查询时间内】咨询客户总数:
         <el-tag type="primary" size="small">
         <el-tag type="primary" size="small">
           {{ sellerTabsInfo.registeredNumber + sellerTabsInfo.unregisteredNumber }}
           {{ sellerTabsInfo.registeredNumber + sellerTabsInfo.unregisteredNumber }}
         </el-tag>
         </el-tag>
       </span>
       </span>
       <span class="span-labels">
       <span class="span-labels">
-        已注册客户:
+        已注册客户总数
         <el-tag type="primary" size="small">
         <el-tag type="primary" size="small">
           {{ sellerTabsInfo.registeredNumber }}
           {{ sellerTabsInfo.registeredNumber }}
         </el-tag>
         </el-tag>
       </span>
       </span>
       <span class="span-labels">
       <span class="span-labels">
-        未注册客户:
+        未注册客户总数
         <el-tag type="primary" size="small">
         <el-tag type="primary" size="small">
           {{ sellerTabsInfo.unregisteredNumber }}
           {{ sellerTabsInfo.unregisteredNumber }}
         </el-tag>
         </el-tag>
@@ -117,7 +132,7 @@
         </div>
         </div>
         <div v-for="(item, index) in list" v-else :key="index" class="list-main">
         <div v-for="(item, index) in list" v-else :key="index" class="list-main">
           <div class="list-main-item consult-list">
           <div class="list-main-item consult-list">
-            <span class="list-time">{{ item.divisionTime }}</span>
+            <span class="list-time">{{ item.addTime }}</span>
             <el-row :gutter="24" class="box-row">
             <el-row :gutter="24" class="box-row">
               <el-col v-if="item.clubName" :span="6"><b>机构:</b> {{ item.clubName }}</el-col>
               <el-col v-if="item.clubName" :span="6"><b>机构:</b> {{ item.clubName }}</el-col>
               <el-col :span="6"><b>咨询人:</b> {{ item.questionMan }}</el-col>
               <el-col :span="6"><b>咨询人:</b> {{ item.questionMan }}</el-col>
@@ -224,7 +239,16 @@
               </el-col>
               </el-col>
               <el-col v-if="item.consultType" :span="12">
               <el-col v-if="item.consultType" :span="12">
                 <b>咨询类别:</b>
                 <b>咨询类别:</b>
-                <el-tag type="success" size="small"> {{ item.consultType }} </el-tag>
+                <el-tag
+                  v-for="(consultType, consultTypeIndex) in item.consultType.split(',')"
+                  :key="consultTypeIndex"
+                  style="margin: 0 1px"
+                  type="info"
+                  size="small"
+                  effect="dark"
+                >
+                  {{ consultType }}
+                </el-tag>
               </el-col>
               </el-col>
             </el-row>
             </el-row>
             <el-row :gutter="24" class="box-row">
             <el-row :gutter="24" class="box-row">
@@ -244,7 +268,16 @@
             <el-row v-if="item.remarks" :gutter="24" class="box-row">
             <el-row v-if="item.remarks" :gutter="24" class="box-row">
               <el-col :span="24">
               <el-col :span="24">
                 <b>标签词:</b>
                 <b>标签词:</b>
-                <el-tag type="success" size="small"> {{ item.remarks }} </el-tag>
+                <el-tag
+                  v-for="(remarks, remarksIndex) in item.remarks.split(',')"
+                  :key="remarksIndex"
+                  style="margin: 0 1px"
+                  type="success"
+                  size="small"
+                  effect="dark"
+                >
+                  {{ remarks }}
+                </el-tag>
               </el-col>
               </el-col>
             </el-row>
             </el-row>
             <el-row v-if="item.extra" :gutter="24" class="box-row">
             <el-row v-if="item.extra" :gutter="24" class="box-row">
@@ -307,12 +340,13 @@
 import { downloadWithUrl } from '@/utils'
 import { downloadWithUrl } from '@/utils'
 import openWindow from '@/utils/open-window'
 import openWindow from '@/utils/open-window'
 import { getClassName, getServiceList, getRemarksRegistList } from '@/api/user/consult/consult'
 import { getClassName, getServiceList, getRemarksRegistList } from '@/api/user/consult/consult'
-import DatePicker from './components/datePicker'
+// import DatePicker from './components/datePicker'
+import pickerOptions from '@/utils/time-picker.js'
 
 
 export default {
 export default {
   name: 'ConsultList',
   name: 'ConsultList',
   components: {
   components: {
-    DatePicker
+    // DatePicker
   },
   },
   filters: {
   filters: {
     followupFilters(value) {
     followupFilters(value) {
@@ -348,12 +382,15 @@ export default {
       // 客户来源
       // 客户来源
       console.log('value', value)
       console.log('value', value)
       const map = {
       const map = {
-        0: '网站',
+        0: '搜素引擎',
         1: '小程序',
         1: '小程序',
         2: '公众号',
         2: '公众号',
         3: '小红书',
         3: '小红书',
         4: '微博',
         4: '微博',
         5: '搜狐',
         5: '搜狐',
+        7: '抖音',
+        8: '视频号',
+        9: '朋友推荐',
         6: '其他'
         6: '其他'
       }
       }
       return map[value]
       return map[value]
@@ -361,6 +398,8 @@ export default {
   },
   },
   data() {
   data() {
     return {
     return {
+      time: '',
+      pickerOptions,
       isLoading: true,
       isLoading: true,
       listQuery: {
       listQuery: {
         remarks: '', // 标签词
         remarks: '', // 标签词
@@ -368,7 +407,8 @@ export default {
         clubName: '', // 机构名称
         clubName: '', // 机构名称
         newDeal: '', // 新分配机构状态 0 全部 1 是  2否
         newDeal: '', // 新分配机构状态 0 全部 1 是  2否
         isRegister: '', // 是否注册 0 全部 1 未注册 2已注册
         isRegister: '', // 是否注册 0 全部 1 未注册 2已注册
-        todayTime: '', // 时间
+        startTime: '', // 开始时间
+        endTime: '', // 结束时间
         serviceProviderId: '', // 协销Id
         serviceProviderId: '', // 协销Id
         pageNum: 1,
         pageNum: 1,
         pageSize: 20
         pageSize: 20
@@ -391,44 +431,20 @@ export default {
   methods: {
   methods: {
     initDate() {
     initDate() {
       // 初始化获取当前年月
       // 初始化获取当前年月
-      const date = new Date()
       this.getClassName()
       this.getClassName()
-      this.listQuery.todayTime = this.formattedDateFn(new Date(date - 86400000))
-      this.getServiceList(this.listQuery.todayTime)
-      console.log('todayTime', this.listQuery.todayTime)
-    },
-    formattedDateFn(dateString) {
-      // 创建一个Date对象,将字符串解析为日期和时间
-      const date = new Date(dateString)
-      // 使用toISOString()方法将Date对象转换为ISO格式的字符串
-      const isoString = date.toISOString()
-      // 从ISO格式字符串中提取日期部分
-      const dateOnly = isoString.substring(0, isoString.indexOf('T'))
-      // 将日期格式化为"YYYY-MM-DD"格式
-      const formattedDate = dateOnly.replace(/-/g, '-')
-      return formattedDate
-    },
-    handleNextMonth(value) {
-      // 加日期
-      this.listQuery.todayTime = value
-      this.getServiceList(this.listQuery.todayTime)
+      this.getServiceList(this.listQuery.startTime, this.listQuery.endTime)
       this.getList()
       this.getList()
-      console.log('todayTime', this.listQuery.todayTime)
     },
     },
-    handlePrevMonth(value) {
-      // 减日期
-      this.listQuery.todayTime = value
-      this.getServiceList(this.listQuery.todayTime)
-      this.getList()
-      console.log('todayTime', this.listQuery.todayTime)
-    },
-    handeleTabsClick(item, index) {
-      // 切换协销
-      console.log('item', item)
-      this.sellerTabsIndex = index
-      this.sellerTabsInfo = item
-      this.listQuery.serviceProviderId = item.serviceProviderId
-      this.listQuery.pageNum = 1
+    // 选择时间
+    handleDatePick() {
+      if (this.time && this.time.length > 0) {
+        this.listQuery.startTime = this.time[0]
+        this.listQuery.endTime = this.time[1]
+      } else {
+        this.listQuery.startTime = ''
+        this.listQuery.endTime = ''
+      }
+      this.getServiceList(this.listQuery.startTime, this.listQuery.endTime)
       this.getList()
       this.getList()
     },
     },
     // 获取行为记录列表
     // 获取行为记录列表
@@ -446,9 +462,10 @@ export default {
       }
       }
     },
     },
     // 获取当天协销咨询记录信息
     // 获取当天协销咨询记录信息
-    async getServiceList(accessDate) {
+    async getServiceList(startTime, endTime) {
       try {
       try {
-        const res = await getServiceList({ accessDate: accessDate })
+        this.sellerTabsIndex = 0
+        const res = await getServiceList({ startTime: startTime, endTime: endTime })
         this.serviceList = res.data.serviceList
         this.serviceList = res.data.serviceList
         this.totalInfo = { ...this.totalInfo, ...res.data }
         this.totalInfo = { ...this.totalInfo, ...res.data }
         this.sellerTabsInfo = this.serviceList[0]
         this.sellerTabsInfo = this.serviceList[0]
@@ -462,6 +479,13 @@ export default {
     async getRemarksRegistList() {
     async getRemarksRegistList() {
       try {
       try {
         this.isLoading = true
         this.isLoading = true
+        if (this.time && this.time.length > 0) {
+          this.listQuery.startTime = this.time[0]
+          this.listQuery.endTime = this.time[1]
+        } else {
+          this.listQuery.startTime = ''
+          this.listQuery.endTime = ''
+        }
         const res = await getRemarksRegistList(this.listQuery)
         const res = await getRemarksRegistList(this.listQuery)
         this.list = res.data.results
         this.list = res.data.results
         this.total = res.data.totalRecord
         this.total = res.data.totalRecord
@@ -498,6 +522,40 @@ export default {
         path: '/user/detail-list',
         path: '/user/detail-list',
         query: { ip: row.ip, accessDate: row.accessDate, userId: row.userId }
         query: { ip: row.ip, accessDate: row.accessDate, userId: row.userId }
       })
       })
+    },
+    formattedDateFn(dateString) {
+      // 创建一个Date对象,将字符串解析为日期和时间
+      const date = new Date(dateString)
+      // 使用toISOString()方法将Date对象转换为ISO格式的字符串
+      const isoString = date.toISOString()
+      // 从ISO格式字符串中提取日期部分
+      const dateOnly = isoString.substring(0, isoString.indexOf('T'))
+      // 将日期格式化为"YYYY-MM-DD"格式
+      const formattedDate = dateOnly.replace(/-/g, '-')
+      return formattedDate
+    },
+    handleNextMonth(value) {
+      // 加日期
+      this.listQuery.todayTime = value
+      this.getServiceList(this.listQuery.todayTime)
+      this.getList()
+      console.log('todayTime', this.listQuery.todayTime)
+    },
+    handlePrevMonth(value) {
+      // 减日期
+      this.listQuery.todayTime = value
+      this.getServiceList(this.listQuery.todayTime)
+      this.getList()
+      console.log('todayTime', this.listQuery.todayTime)
+    },
+    handeleTabsClick(item, index) {
+      // 切换协销
+      console.log('item', item)
+      this.sellerTabsIndex = index
+      this.sellerTabsInfo = item
+      this.listQuery.serviceProviderId = item.serviceProviderId
+      this.listQuery.pageNum = 1
+      this.getList()
     }
     }
   }
   }
 }
 }
@@ -589,9 +647,11 @@ export default {
   font-size: 20px;
   font-size: 20px;
   color: #333333;
   color: #333333;
   position: absolute;
   position: absolute;
-  top: 26px;
-  left: -110px;
+  top: 7px;
+  left: -164px;
   font-weight: bold;
   font-weight: bold;
+  width: 120px;
+  text-align: center;
 }
 }
 .box-row {
 .box-row {
   margin-bottom: 14px;
   margin-bottom: 14px;

+ 26 - 5
src/views/user/consult/unreg-detail.vue

@@ -49,7 +49,7 @@
         </div>
         </div>
         <div v-for="(item, index) in list" v-else :key="index" class="list-main">
         <div v-for="(item, index) in list" v-else :key="index" class="list-main">
           <div class="list-main-item unreg">
           <div class="list-main-item unreg">
-            <span class="list-time">{{ item.addTime }}</span>
+            <span class="list-times">{{ item.addTime }}</span>
             <el-row :gutter="24" class="box-row">
             <el-row :gutter="24" class="box-row">
               <el-col :span="6"><b>咨询人:</b> {{ item.questionMan }}</el-col>
               <el-col :span="6"><b>咨询人:</b> {{ item.questionMan }}</el-col>
               <el-col v-if="item.contractMobile" :span="12"><b>手机号:</b> {{ item.contractMobile }}</el-col>
               <el-col v-if="item.contractMobile" :span="12"><b>手机号:</b> {{ item.contractMobile }}</el-col>
@@ -155,7 +155,16 @@
               </el-col>
               </el-col>
               <el-col v-if="item.consultType" :span="12">
               <el-col v-if="item.consultType" :span="12">
                 <b>咨询类别:</b>
                 <b>咨询类别:</b>
-                <el-tag type="success" size="small"> {{ item.consultType }} </el-tag>
+                <el-tag
+                  v-for="(consultType, consultTypeIndex) in item.consultType.split(',')"
+                  :key="consultTypeIndex"
+                  style="margin: 0 1px"
+                  type="info"
+                  size="small"
+                  effect="dark"
+                >
+                  {{ consultType }}
+                </el-tag>
               </el-col>
               </el-col>
             </el-row>
             </el-row>
             <el-row :gutter="24" class="box-row">
             <el-row :gutter="24" class="box-row">
@@ -175,7 +184,16 @@
             <el-row v-if="item.remarks" :gutter="24" class="box-row">
             <el-row v-if="item.remarks" :gutter="24" class="box-row">
               <el-col :span="24">
               <el-col :span="24">
                 <b>标签词:</b>
                 <b>标签词:</b>
-                <el-tag type="success" size="small"> {{ item.remarks }} </el-tag>
+                <el-tag
+                  v-for="(remarks, remarksIndex) in item.remarks.split(',')"
+                  :key="remarksIndex"
+                  style="margin: 0 1px"
+                  type="success"
+                  size="small"
+                  effect="dark"
+                >
+                  {{ remarks }}
+                </el-tag>
               </el-col>
               </el-col>
             </el-row>
             </el-row>
             <el-row v-if="item.extra" :gutter="24" class="box-row">
             <el-row v-if="item.extra" :gutter="24" class="box-row">
@@ -274,12 +292,15 @@ export default {
     sourceActionsFilters(value) {
     sourceActionsFilters(value) {
       // 客户来源
       // 客户来源
       const map = {
       const map = {
-        0: '网站',
+        0: '搜素引擎',
         1: '小程序',
         1: '小程序',
         2: '公众号',
         2: '公众号',
         3: '小红书',
         3: '小红书',
         4: '微博',
         4: '微博',
         5: '搜狐',
         5: '搜狐',
+        7: '抖音',
+        8: '视频号',
+        9: '朋友推荐',
         6: '其他'
         6: '其他'
       }
       }
       return map[value]
       return map[value]
@@ -452,7 +473,7 @@ export default {
   left: -55px;
   left: -55px;
   top: 10px;
   top: 10px;
 }
 }
-.list-main-item.unreg .list-time {
+.list-main-item.unreg .list-times {
   display: inline-block;
   display: inline-block;
   font-size: 20px;
   font-size: 20px;
   color: #333333;
   color: #333333;

+ 211 - 0
src/views/user/customer/customer-ambition-edit.vue

@@ -0,0 +1,211 @@
+<template>
+  <div class="app-container" style="width: 520px; margin: 0 auto">
+    <el-form ref="bannerForm" :model="form" label-width="130px">
+      <el-row :gutter="24" class="box-row">
+        <el-col :span="14">
+          <el-form-item label="统计日期:" prop="startAddTime" style="width: 100%" :rules="rules.startAddTime">
+            <el-date-picker v-model="form.startAddTime" type="date" placeholder="选择开始日期" style="width: 100%" />
+          </el-form-item>
+        </el-col>
+        <el-col class="line" :span="1">-</el-col>
+        <el-col :span="8">
+          <el-form-item
+            label-position="false"
+            label-width="0px"
+            prop="endAddTime"
+            style="width: 100%"
+            :rules="rules.endAddTime"
+          >
+            <el-date-picker v-model="form.endAddTime" type="date" placeholder="选择开始日期" style="width: 100%" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <h1 style="font-size: 16px; font-weight: bold; line-height: 40px; padding-left: 20px">外部渠道阅读量</h1>
+      <el-form-item label="公众号阅读量:" prop="weChat" :rules="rules.weChat">
+        <el-input v-model="form.weChat" maxlength="15" style="width: 350px" />
+      </el-form-item>
+      <el-form-item label="小红书阅读量:" prop="redBook" :rules="rules.redBook">
+        <el-input v-model="form.redBook" maxlength="15" style="width: 350px" />
+      </el-form-item>
+      <el-form-item label="微博阅读量:" prop="microBlog" :rules="rules.microBlog">
+        <el-input v-model="form.microBlog" maxlength="15" style="width: 350px" />
+      </el-form-item>
+      <el-form-item label="其他渠道阅读量:" prop="other" :rules="rules.other">
+        <el-input v-model="form.other" maxlength="15" style="width: 350px" />
+      </el-form-item>
+      <h1 style="font-size: 16px; font-weight: bold; line-height: 40px; padding-left: 20px">采美用户意向人数</h1>
+      <el-form-item label="意向强烈:" prop="intense" :rules="rules.intense">
+        <el-input v-model="form.intense" maxlength="15" style="width: 350px" />
+      </el-form-item>
+      <el-form-item label="意向普通:" prop="ordinary" :rules="rules.ordinary">
+        <el-input v-model="form.ordinary" maxlength="15" style="width: 350px" />
+      </el-form-item>
+      <div class="el-dialog__footer" style="text-align: center">
+        <el-button type="primary" @click="onSubmit('bannerForm')"> 保存 </el-button>
+        <el-button plain @click="backToList"> 返回 </el-button>
+      </div>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { saveShopPopUp, getShopPopUp } from '@/api/user/customer/customer'
+
+export default {
+  name: 'CustomerPopupEdit',
+  data() {
+    const defaultForm = () => {
+      return {
+        id: '',
+        shopId: this.$route.query.shopId,
+        startAddTime: '', // 统计开始时间
+        endAddTime: '', // 统计结束时间
+        microBlog: '', // 微博
+        weChat: '', // 公众号
+        redBook: '', // 小红书
+        other: '', // 其他
+        intense: '', // 意向强烈
+        ordinary: '' // 意向普通
+      }
+    }
+    return {
+      form: defaultForm(),
+      loadImgLoading: false,
+      rules: {
+        startAddTime: [{ required: true, message: '请选择开始日期', trigger: 'blur' }],
+        endAddTime: [{ required: true, message: '请选择结束日期', trigger: 'blur' }],
+        weChat: [{ required: true, message: '请填写公众号阅读量', trigger: 'blur' }],
+        redBook: [{ required: true, message: '请填写小红书阅读量', trigger: 'blur' }],
+        microBlog: [{ required: true, message: '请填写微博阅读量', trigger: 'blur' }],
+        other: [{ required: true, message: '请填写其他渠道阅读量', trigger: 'blur' }],
+        intense: [{ required: true, message: '请填写意向强烈信息', trigger: 'blur' }],
+        ordinary: [{ required: true, message: '请填写意向普通信息', trigger: 'blur' }]
+      }
+    }
+  },
+  computed: {
+    getToken() {
+      return {
+        token: this.$store.getters.token
+      }
+    },
+    actionUrl() {
+      return process.env.VUE_APP_BASE_API + '/formData/MultiPictareaddData'
+    }
+  },
+  created() {
+    this.getShopPopUp({ shopId: this.$route.query.shopId })
+  },
+  methods: {
+    // 获取供应商弹窗详情
+    async getShopPopUp(params) {
+      try {
+        const res = await getShopPopUp(params)
+        this.form = { ...this.form, ...res.data }
+      } catch (error) {
+        console.log('error', error)
+      }
+    },
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.$confirm('是否提交保存信息', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            console.log('form', this.form)
+            this.saveShopPopUp(this.form)
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    async saveShopPopUp(params) {
+      // 保存
+      await saveShopPopUp(params)
+      this.$message.success('保存成功')
+      setTimeout(() => {
+        this.$router.push({ path: '/user/customer/list' })
+      }, 1000)
+    },
+    // 上传图标事件
+    handleSuccess(res, file) {
+      this.loadImgLoading = true
+      this.$nextTick(() => {
+        setTimeout(() => {
+          this.form.image = res.data
+        }, 1000 * 2)
+      })
+    },
+    // 对上传图片的大小、格式进行限制
+    beforeUpload(file) {
+      const isJPG = file.type === 'image/jpeg'
+      const isJPG2 = file.type === 'image/jpg'
+      const isPNG = file.type === 'image/png'
+      const isLt5M = file.size / 1024 / 1024 < 5
+      if (!isJPG && !isJPG2 && !isPNG) {
+        this.$message.error('只支持jpg或png格式图片')
+      }
+      if (!isLt5M) {
+        this.$message.error('请上传5MB以内的图片!')
+      }
+      return (isJPG || isJPG2 || isPNG) && isLt5M
+    },
+    reloadImage() {
+      this.loadImgLoading = true
+      setTimeout(() => {
+        this.temp.classifyImage = this.temp.classifyImage.split('?')[0] + '?r=' + Math.floor(Math.random() * 1000)
+      }, 1000 * 2)
+    },
+    loadSucess() {
+      this.loadImgLoading = false
+    },
+    backToList() {
+      this.$store.dispatch('tagsView/delView', this.$route).then(() => {
+        this.$nextTick(() => {
+          this.$router.replace({ path: '/user/customer/list' })
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style>
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  float: left;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 30px;
+  color: #999999;
+}
+.el-form-item__label {
+  text-align: right !important;
+}
+.el-upload__tip {
+  line-height: 20px;
+  color: red;
+  text-align: left;
+  position: absolute;
+  right: -50%;
+  bottom: 0;
+}
+.span_tip {
+  font-size: 12px;
+  color: red;
+  margin-left: 5px;
+}
+.filter-item-temp {
+  width: 100px;
+}
+</style>

+ 39 - 93
src/views/user/customer/customer-ambition-list.vue

@@ -3,59 +3,7 @@
     <!-- 顶部操作区域 -->
     <!-- 顶部操作区域 -->
     <div class="filter-container">
     <div class="filter-container">
       <div class="filter-control">
       <div class="filter-control">
-        <span>ID:</span>
-        <el-input
-          v-model="listQuery.reportId"
-          style="width: 120px"
-          placeholder="ID"
-          clearable
-          @input="(e) => (listQuery.reportId = checkedInput(e))"
-          @keyup.enter.native="getList"
-          @clear="getList"
-        />
-      </div>
-      <div class="filter-control">
-        <span>商品名称:</span>
-        <el-input
-          v-model="listQuery.productName"
-          placeholder="商品名称"
-          clearable
-          @keyup.enter.native="getList"
-          @clear="getList"
-        />
-      </div>
-      <div class="filter-control">
-        <span>机构名称:</span>
-        <el-input
-          v-model="listQuery.clubName"
-          placeholder="机构名称"
-          clearable
-          @keyup.enter.native="getList"
-          @clear="getList"
-        />
-      </div>
-      <div class="filter-control">
-        <span>报备人:</span>
-        <el-input
-          v-model="listQuery.reportName"
-          style="width: 120px"
-          placeholder="报备人"
-          clearable
-          @keyup.enter.native="getList"
-          @clear="getList"
-        />
-      </div>
-      <div class="filter-control">
-        <span>审核状态:</span>
-        <el-select v-model="listQuery.status" style="width: 120px" clearable @change="getList">
-          <el-option value="" label="请选择" />
-          <el-option :value="1" label="待审核" />
-          <el-option :value="2" label="审核通过" />
-          <el-option :value="3" label="审核未通过" />
-        </el-select>
-      </div>
-      <div class="filter-control">
-        <span>提交时间:</span>
+        <span>统计日期:</span>
         <el-date-picker
         <el-date-picker
           v-model="time"
           v-model="time"
           type="daterange"
           type="daterange"
@@ -70,45 +18,34 @@
       </div>
       </div>
       <div class="filter-control">
       <div class="filter-control">
         <el-button type="primary" @click="getList"> 查询 </el-button>
         <el-button type="primary" @click="getList"> 查询 </el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="handleAdds('add')"> 添加数据 </el-button>
       </div>
       </div>
     </div>
     </div>
     <!-- 列表 -->
     <!-- 列表 -->
     <el-table v-loading="isLoading" :data="list" border style="width: 100%" height="650">
     <el-table v-loading="isLoading" :data="list" border style="width: 100%" height="650">
-      <el-table-column prop="reportId" label="ID" align="center" width="50" />
-      <el-table-column prop="mainImage" label="商品图片" align="center" width="100">
-        <template v-if="row.mainImage" slot-scope="{ row }">
-          <el-popover placement="top-start" title="" width="180" trigger="hover">
-            <img :src="row.mainImage" alt="" style="width: 100px; height: 100px" />
-            <img slot="reference" :src="row.mainImage" alt="" style="width: 50px; height: 50px" />
-          </el-popover>
-        </template>
-      </el-table-column>
-      <el-table-column prop="productName" label="商品名称" align="center" width="200" />
-      <el-table-column prop="clubName" label="机构名称" align="center" width="180" />
-      <el-table-column prop="reportName" label="报备人" align="center" width="120" />
-      <el-table-column prop="reportText" label="报备事由" align="center" />
-      <el-table-column prop="addTime" label="创建时间" align="center" width="100">
+      <el-table-column prop="auditTime" label="统计日期" align="center">
         <template slot-scope="{ row }">
         <template slot-scope="{ row }">
-          {{ row.addTime ? row.addTime : '---' }}
-        </template>
-      </el-table-column>
-      <el-table-column prop="status" label="审核状态" align="center" width="100">
-        <template slot-scope="{ row }">
-          <el-tag v-if="row.status === 1" type="warning" size="small">待审核</el-tag>
-          <el-tag v-else-if="row.status === 2" type="success" size="small">已审核</el-tag>
-          <el-tag v-else type="danger" size="small">审核未通过</el-tag>
+          {{ row.auditTime ? row.auditTime : '---' }}
         </template>
         </template>
       </el-table-column>
       </el-table-column>
-      <el-table-column prop="auditName" label="审核人" align="center" width="120" />
-      <el-table-column prop="auditTime" label="审核时间" align="center" width="100">
+      <el-table-column prop="productName" label="公众号" align="center" width="120" />
+      <el-table-column prop="clubName" label="小红书" align="center" width="120" />
+      <el-table-column prop="clubName" label="微博" align="center" width="120" />
+      <el-table-column prop="clubName" label="其他渠道" align="center" width="120" />
+      <el-table-column prop="reportName" label="意向强烈" align="center" width="120" />
+      <el-table-column prop="reportName" label="意向普通" align="center" width="120" />
+      <el-table-column prop="addTime" label="添加时间" align="center" width="120">
         <template slot-scope="{ row }">
         <template slot-scope="{ row }">
-          {{ row.auditTime ? row.auditTime : '---' }}
+          {{ row.addTime ? row.addTime : '---' }}
         </template>
         </template>
       </el-table-column>
       </el-table-column>
       <el-table-column label="操作" align="center" width="220">
       <el-table-column label="操作" align="center" width="220">
         <template slot-scope="{ row }">
         <template slot-scope="{ row }">
-          <el-button type="primary" size="mini" style="margin: 2px" @click="handleExamine(row)"> 审核 </el-button>
-          <el-button type="primary" size="mini" style="margin: 2px" @click="handleRecordDetail(row)"> 查看 </el-button>
+          <el-button type="primary" size="mini" style="margin: 2px" @click="handleAdds('edit')"> 编辑 </el-button>
+          <el-button type="primary" size="mini" style="margin: 2px" @click="handleRecordDetail(row)">
+            生成链接
+          </el-button>
+          <el-button type="primary" size="mini" style="margin: 2px" @click="handlePathSum(row)"> 数据总结 </el-button>
           <el-button type="danger" size="mini" style="margin: 2px" @click="handleDelete(row)"> 删除 </el-button>
           <el-button type="danger" size="mini" style="margin: 2px" @click="handleDelete(row)"> 删除 </el-button>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
@@ -153,17 +90,6 @@
 <script>
 <script>
 import { getReportList, reportCount, deleteReport } from '@/api/user/consult/consult'
 import { getReportList, reportCount, deleteReport } from '@/api/user/consult/consult'
 import pickerOptions from '@/utils/time-picker.js'
 import pickerOptions from '@/utils/time-picker.js'
-const defaultListQuery = {
-  reportId: '', // 报备Id
-  productName: '', // 咨询商品名称
-  clubName: '', // 机构名称
-  reportName: '', // 报备人
-  status: '', // 状态 1.已审核 2.待审核 3.审核未通过
-  startAddTime: '', // 开始时间
-  endAddTime: '', // 结束时间
-  pageNum: 1,
-  pageSize: 20
-}
 export default {
 export default {
   name: 'ReportList',
   name: 'ReportList',
   filters: {},
   filters: {},
@@ -172,7 +98,13 @@ export default {
       isLoading: true,
       isLoading: true,
       pickerOptions,
       pickerOptions,
       time: '',
       time: '',
-      listQuery: Object.assign({}, defaultListQuery),
+      listQuery: {
+        shopId: this.$route.query.shopId,
+        startAddTime: '', // 开始时间
+        endAddTime: '', // 结束时间
+        pageNum: 1,
+        pageSize: 20
+      },
       list: [],
       list: [],
       total: 0,
       total: 0,
       dialogFormVisible: false,
       dialogFormVisible: false,
@@ -247,7 +179,7 @@ export default {
     },
     },
     async handleDelete(row) {
     async handleDelete(row) {
       try {
       try {
-        await this.$confirm('确定删除该报备吗?', {
+        await this.$confirm('确定删除这条数据吗?删除后意向客户将不再统计这条数据。', {
           confirmButtonText: '确定',
           confirmButtonText: '确定',
           cancelButtonText: '取消',
           cancelButtonText: '取消',
           type: 'warning'
           type: 'warning'
@@ -267,6 +199,20 @@ export default {
         console.log(error)
         console.log(error)
       }
       }
     },
     },
+    // 添加数据
+    handleAdds(type) {
+      this.$router.push({
+        path: '/user/customer/customer-ambition-edit',
+        query: { type: type, shopId: this.listQuery.shopId }
+      })
+    },
+    // 数据总结
+    handlePathSum(row) {
+      this.$router.push({
+        path: '/user/customer/customer-ambition-sum',
+        query: { type: row, shopId: this.listQuery.shopId }
+      })
+    },
     // 机构跳转
     // 机构跳转
     handleClubHrefLink(row) {
     handleClubHrefLink(row) {
       return (
       return (

+ 165 - 0
src/views/user/customer/customer-ambition-sum.vue

@@ -0,0 +1,165 @@
+<template>
+  <div class="app-container">
+    <el-form ref="bannerForm" :model="form" label-width="100px">
+      <el-form-item label="数据总结:" prop="content" :rules="rules.content">
+        <Tinymce ref="editor" v-model="form.content" :height="400" />
+      </el-form-item>
+    </el-form>
+    <div class="el-dialog__footer" style="text-align: center">
+      <el-button plain @click="backToList"> 返回 </el-button>
+      <el-button type="primary" @click="onSubmit('bannerForm')"> 保存 </el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { saveShopPopUp, getShopPopUp } from '@/api/user/customer/customer'
+import Tinymce from '@/components/Tinymce'
+export default {
+  name: 'CustomerPopupEdit',
+  components: { Tinymce },
+  data() {
+    const defaultForm = () => {
+      return {
+        id: '',
+        shopId: this.$route.query.shopId,
+        content: '', // 引导语1
+        guidingTwo: '', // 引导语2
+        addTime: ''
+      }
+    }
+    return {
+      form: defaultForm(),
+      loadImgLoading: false,
+      rules: {
+        content: [{ required: true, message: '请填写数据总结', trigger: 'blur' }],
+        guidingTwo: [{ required: true, message: '请填写引导语', trigger: 'blur' }]
+      }
+    }
+  },
+  computed: {
+    getToken() {
+      return {
+        token: this.$store.getters.token
+      }
+    },
+    actionUrl() {
+      return process.env.VUE_APP_BASE_API + '/formData/MultiPictareaddData'
+    }
+  },
+  created() {
+    this.getShopPopUp({ shopId: this.$route.query.shopId })
+  },
+  methods: {
+    // 获取供应商弹窗详情
+    async getShopPopUp(params) {
+      try {
+        const res = await getShopPopUp(params)
+        this.form = { ...this.form, ...res.data }
+      } catch (error) {
+        console.log('error', error)
+      }
+    },
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.$confirm('是否提交保存信息', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            console.log('form', this.form)
+            this.saveShopPopUp(this.form)
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    async saveShopPopUp(params) {
+      // 保存
+      await saveShopPopUp(params)
+      this.$message.success('保存成功')
+      setTimeout(() => {
+        this.$router.push({ path: '/user/customer/list' })
+      }, 1000)
+    },
+    // 上传图标事件
+    handleSuccess(res, file) {
+      this.loadImgLoading = true
+      this.$nextTick(() => {
+        setTimeout(() => {
+          this.form.image = res.data
+        }, 1000 * 2)
+      })
+    },
+    // 对上传图片的大小、格式进行限制
+    beforeUpload(file) {
+      const isJPG = file.type === 'image/jpeg'
+      const isJPG2 = file.type === 'image/jpg'
+      const isPNG = file.type === 'image/png'
+      const isLt5M = file.size / 1024 / 1024 < 5
+      if (!isJPG && !isJPG2 && !isPNG) {
+        this.$message.error('只支持jpg或png格式图片')
+      }
+      if (!isLt5M) {
+        this.$message.error('请上传5MB以内的图片!')
+      }
+      return (isJPG || isJPG2 || isPNG) && isLt5M
+    },
+    reloadImage() {
+      this.loadImgLoading = true
+      setTimeout(() => {
+        this.temp.classifyImage = this.temp.classifyImage.split('?')[0] + '?r=' + Math.floor(Math.random() * 1000)
+      }, 1000 * 2)
+    },
+    loadSucess() {
+      this.loadImgLoading = false
+    },
+    backToList() {
+      this.$store.dispatch('tagsView/delView', this.$route).then(() => {
+        this.$nextTick(() => {
+          this.$router.replace({ path: '/user/customer/list' })
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style>
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  float: left;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 30px;
+  color: #999999;
+}
+.el-form-item__label {
+  text-align: right !important;
+}
+.el-upload__tip {
+  line-height: 20px;
+  color: red;
+  text-align: left;
+  position: absolute;
+  right: -50%;
+  bottom: 0;
+}
+.span_tip {
+  font-size: 12px;
+  color: red;
+  margin-left: 5px;
+}
+.filter-item-temp {
+  width: 100px;
+}
+</style>

+ 300 - 0
src/views/user/customer/customer-remarks-add .vue

@@ -0,0 +1,300 @@
+<template>
+  <div class="app-container">
+    <el-card class="box-card" style="margin: 10px auto">
+      <div class="refund-item">
+        <el-form ref="dataForm" :model="params" :rules="rules" label-width="120px">
+          <el-row :gutter="24" class="box-row">
+            <el-form-item label="备注:" prop="remarks">
+              <el-input
+                v-model.trim="params.note"
+                type="textarea"
+                show-word-limit
+                placeholder="请输入备注文字,200字以内"
+                maxlength="200"
+                :autosize="{ minRows: 5, maxRows: 6 }"
+                style="width: 600px"
+              />
+            </el-form-item>
+            <el-form-item label="图片:" prop="logImage">
+              <div class="form-el-upload">
+                <el-upload
+                  :class="{ hide: hideImg }"
+                  :action="actionUrl"
+                  :headers="getToken"
+                  list-type="picture-card"
+                  :before-upload="beforeUploadImg"
+                  :on-remove="handleRemove"
+                  :on-success="handleSuccess"
+                  :limit="5"
+                >
+                  <div slot="tip" class="el-upload__tip">请上传jgp,jpeg,png格式的图片,每张不超过5M</div>
+                  <i class="el-icon-plus"></i>
+                </el-upload>
+              </div>
+            </el-form-item>
+            <el-form-item>
+              <div class="filter-container" style="text-align: left; margin-top: 20px">
+                <el-button type="primary" @click="handlerConfirm">保存</el-button>
+                <el-button plain @click="backToList">返回</el-button>
+              </div>
+            </el-form-item>
+          </el-row>
+        </el-form>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import { saveInformation } from '@/api/user/customer/customer'
+export default {
+  name: 'AddRemarks',
+  filters: {},
+  data() {
+    return {
+      params: {
+        images: [], // 备注图片
+        note: '',
+        informationId: ''
+      },
+      fileImageList: [], // 上传图片列表
+      fileUrl: process.env.VUE_APP_BASE_API + '/order/cmOrderRemark/upload/remark',
+      fileList: [], // 上传文件列表
+      rules: {
+        note: [
+          {
+            required: true,
+            message: '请输入备注信息',
+            trigger: 'blur'
+          }
+        ]
+      },
+      hideImg: false, // 上传图片隐藏
+      hideFile: false // 上传文件隐藏
+    }
+  },
+  computed: {
+    getToken() {
+      return {
+        token: this.$store.getters.token
+      }
+    },
+    actionUrl() {
+      return process.env.VUE_APP_BASE_API + '/formData/MultiPictareaddData'
+    }
+  },
+  created() {
+    this.params.informationId = this.$route.query.informationId * 1
+  },
+  methods: {
+    // 保存
+    handlerConfirm() {
+      this.$refs['dataForm'].validate((valid) => {
+        if (valid) {
+          this.saveInformation()
+        }
+      })
+    },
+    // 保存备注
+    async saveInformation() {
+      try {
+        await saveInformation(this.params)
+        this.$message.success('添加成功')
+        this.backToList()
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    isImage(file) {
+      return (
+        file.type === 'image/png' ||
+        file.type === 'image/jpeg' ||
+        file.type === 'image/jpg' ||
+        file.type === 'image/webp'
+      )
+    },
+    // 上传图片事件
+    handleSuccess(res, file, fileList) {
+      this.params.images.push(res.data)
+      this.handleChange()
+    },
+    // 上传文件
+    handleFileSuccess(res, file, fileList) {
+      this.params.ossFiles.push(res.data.ossFiles)
+      this.handleFileChange()
+    },
+    // 删除图片事件
+    handleRemove(file, fileList) {
+      this.params.images = fileList.map((e) => e.response.data)
+      this.handleChange()
+    },
+    // 删除文件
+    handlerFileRemove(file, fileList) {
+      this.params.ossFiles = fileList.map((e) => e.response.data.ossFiles)
+      this.handleFileChange()
+    },
+    // 文件限制
+    beforeUploadImg(file) {
+      const isUpload = file.size / 1024 / 1024 < 5
+      if (this.isImage(file)) {
+        if (isUpload) {
+          return true
+        } else {
+          this.$message.error('文件过大,请重新上传!')
+          return false
+        }
+      } else {
+        this.$message.error('请上传jgp,jpeg,png格式的图片!')
+        return false
+      }
+    },
+    beforeUploadFile(file) {
+      const whiteList = ['pdf', 'doc', 'docx', 'xlsx']
+      const isUpload = file.size / 1024 / 1024 < 5
+      if (whiteList.indexOf(file.name.substring(file.name.lastIndexOf('.') + 1)) === -1) {
+        this.$message.error('请上传 pdf、doc、docx、xlsx格式的文件!')
+        return false
+      }
+      if (isUpload) {
+        return true
+      } else {
+        this.$message.error('文件过大,请重新上传!')
+        return false
+      }
+    },
+    // 文件数量判断
+    handleChange(file, fileList) {
+      this.hideImg = this.params.images.length >= 5
+    },
+    // 文件数量判断
+    handleFileChange(file, fileList) {
+      this.hideFile = this.params.ossFiles.length >= 5
+    },
+    backToList() {
+      this.$store.dispatch('tagsView/delView', this.$route).then(() => {
+        this.$nextTick(() => {
+          this.$router.replace({
+            path: '/user/customer/customer-remarks',
+            query: {
+              id: this.params.informationId
+            }
+          })
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .el-upload-list {
+  display: inline-flex !important;
+}
+::v-deep .el-upload--picture-card {
+  width: 148px !important;
+  height: 148px !important;
+}
+::v-deep .el-upload__tip {
+  position: static !important;
+}
+
+::v-deep .hide .el-upload--picture-card {
+  display: none;
+}
+.fileUpload {
+  ::v-deep .el-upload-list {
+    flex-direction: column !important;
+  }
+}
+.app-title {
+  line-height: 36px;
+  font-size: 26px;
+  font-weight: bold;
+  color: #409eff;
+  text-align: center;
+  margin: 0;
+}
+.box-card {
+  margin-top: 20px;
+  font-size: 14px;
+}
+.box-row {
+  padding: 10px 0;
+}
+.box-row .dropdown {
+  margin-top: -10px;
+}
+.refund-item {
+  padding: 10px 0;
+}
+.order-item {
+  background: #f7f7f7;
+  margin-bottom: 20px;
+  padding: 10px 15px;
+  border-radius: 5px;
+}
+.product-row {
+  padding: 10px 0;
+  background: #ebeef5;
+  border-top: 1px dashed #dcdfe6;
+}
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 148px;
+  height: 148px;
+  line-height: 148px;
+  text-align: center;
+}
+.avatar {
+  width: 148px;
+  height: 148px;
+  display: block;
+}
+.avatar img {
+  width: 148px;
+  height: 148px;
+  display: block;
+}
+.el-form-item__label {
+  text-align: right !important;
+}
+.el-upload__tip {
+  line-height: 20px;
+  color: red;
+  text-align: left;
+  position: absolute;
+  right: -50%;
+  bottom: 0;
+}
+.span_tip {
+  font-size: 12px;
+  color: red;
+  margin-left: 5px;
+}
+.filter-item-temp {
+  width: 100px;
+}
+.op-item {
+  padding: 5px 0;
+}
+.el-span-warning {
+  color: #e6a23c;
+}
+.el-span-success {
+  color: #67c23a;
+}
+.el-span-danger {
+  color: #f56c6c;
+}
+</style>

+ 179 - 0
src/views/user/customer/customer-remarks.vue

@@ -0,0 +1,179 @@
+<template>
+  <div class="app-container">
+    <div class="remt" style="text-align: right">
+      <el-button type="primary" @click="handleAddRemarks">添加备注</el-button>
+    </div>
+    <div v-if="list">
+      <el-card v-for="item in list" :key="item.id" class="box-card" style="margin: 0 auto">
+        <div class="refund-item">
+          <el-form label-width="120px">
+            <el-form-item :label="item.noteUser">
+              <div class="order_time">
+                {{ item.addTime }}
+              </div>
+            </el-form-item>
+            <el-form-item label="备注内容:">
+              {{ item.note }}
+            </el-form-item>
+            <el-form-item label="图片:">
+              <template v-if="item.images.length > 0">
+                <el-image
+                  v-for="(img, index) in item.images"
+                  :key="index"
+                  :preview-src-list="[img]"
+                  style="width: 148px; height: 148px; margin-right: 20px"
+                  :src="img"
+                />
+              </template>
+              <template v-else> 无 </template>
+            </el-form-item>
+          </el-form>
+        </div>
+      </el-card>
+    </div>
+    <div v-else class="order_empty">
+      <span>暂无订单备注</span>
+      <el-button type="primary" @click="handleAddRemarks">添加备注</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getInformationNoteList } from '@/api/user/customer/customer'
+export default {
+  name: 'OrderRemarks',
+  filters: {},
+  data() {
+    return {
+      listQuery: {
+        informationId: 0,
+        pageNum: 1,
+        pageSize: 20
+      },
+      isLoading: false,
+      list: [] // 订单备注列表
+    }
+  },
+  computed: {},
+  created() {
+    this.listQuery.informationId = this.$route.query.id
+    this.getInformationNoteList()
+  },
+  methods: {
+    // 获取订单备注列表
+    async getInformationNoteList() {
+      try {
+        this.isLoading = false
+        const res = await getInformationNoteList(this.listQuery)
+        const data = res.data
+        this.list = data.results
+        console.log('list', this.list)
+        this.isLoading = true
+        console.log('isLoading', this.isLoading)
+      } catch (error) {
+        console.log('error', error)
+      }
+    },
+    handleAddRemarks() {
+      this.$router.push({
+        path: '/user/customer/customer-remarks-add',
+        query: { informationId: this.listQuery.informationId }
+      })
+    },
+    backToList() {
+      this.$store.dispatch('tagsView/delView', this.$route).then(() => {
+        this.$nextTick(() => {
+          this.$router.replace({
+            path: '/order/deliver',
+            query: {
+              orderId: this.orderId
+            }
+          })
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.order_empty {
+  width: 100%;
+  height: 40vh;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: column;
+}
+.order_empty span {
+  color: #409eff;
+  margin: 1vw;
+}
+.order_time {
+  font-weight: 700;
+}
+.order_text {
+  margin-right: 20px;
+}
+.goBack {
+  width: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+::v-deep .el-form-item__content {
+  margin-left: 130px !important;
+}
+.goBack {
+  margin: 3vw 0;
+  ::v-deep .el-button--medium {
+    width: 100px !important;
+  }
+}
+::v-deep .el-card {
+  margin: 20px auto !important;
+}
+.app-title {
+  line-height: 36px;
+  font-size: 26px;
+  font-weight: bold;
+  color: #409eff;
+  text-align: center;
+  margin: 0;
+}
+.box-card {
+  font-size: 14px;
+}
+.box-row {
+  padding: 10px 0;
+}
+.box-row .dropdown {
+  margin-top: -10px;
+}
+.refund-item {
+  padding: 10px 0;
+}
+.order-item {
+  background: #f7f7f7;
+  margin-bottom: 20px;
+  padding: 10px 15px;
+  border-radius: 5px;
+}
+.product-row {
+  padding: 10px 0;
+  background: #ebeef5;
+  border-top: 1px dashed #dcdfe6;
+}
+.op-item {
+  padding: 5px 0;
+}
+.el-span-warning {
+  color: #e6a23c;
+}
+.el-span-success {
+  color: #67c23a;
+}
+.el-span-danger {
+  color: #f56c6c;
+}
+</style>

+ 37 - 3
src/views/user/customer/customer-stat-list.vue

@@ -51,6 +51,7 @@
         <template slot-scope="{ row }">
         <template slot-scope="{ row }">
           <el-tag v-if="row.followUpStatus === 0" type="success" size="small">已跟进</el-tag>
           <el-tag v-if="row.followUpStatus === 0" type="success" size="small">已跟进</el-tag>
           <el-tag v-if="row.followUpStatus === 1" type="warning" size="small">未跟进</el-tag>
           <el-tag v-if="row.followUpStatus === 1" type="warning" size="small">未跟进</el-tag>
+          <span v-if="row.name">({{ row.name }})</span>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
       <el-table-column label="操作" align="center" width="200">
       <el-table-column label="操作" align="center" width="200">
@@ -58,6 +59,7 @@
           <el-button type="primary" size="mini" style="margin: 2px" @click="handleSitting(row)">
           <el-button type="primary" size="mini" style="margin: 2px" @click="handleSitting(row)">
             设置跟进状态
             设置跟进状态
           </el-button>
           </el-button>
+          <el-button type="danger" size="mini" style="margin: 2px" @click="handleAddRemaks(row)"> 备注 </el-button>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
     </el-table>
     </el-table>
@@ -73,11 +75,22 @@
     />
     />
     <!-- 设置跟进状态 -->
     <!-- 设置跟进状态 -->
     <el-dialog title="设置跟进状态" :visible.sync="dialogFormVisible" width="500px">
     <el-dialog title="设置跟进状态" :visible.sync="dialogFormVisible" width="500px">
-      <el-form ref="dataForm" :model="renewCustome" label-position="right">
-        <el-form-item prop="auditNote">
+      <el-form ref="dataForm" :model="renewCustome" label-position="top">
+        <el-form-item label="请设置跟进状态:" prop="followUpStatus" :rules="rules.followUpStatus">
           <el-radio v-model="renewCustome.followUpStatus" :label="0">已跟进</el-radio>
           <el-radio v-model="renewCustome.followUpStatus" :label="0">已跟进</el-radio>
           <el-radio v-model="renewCustome.followUpStatus" :label="1">未跟进</el-radio>
           <el-radio v-model="renewCustome.followUpStatus" :label="1">未跟进</el-radio>
         </el-form-item>
         </el-form-item>
+        <el-form-item label="请选择跟进人员:" prop="serviceProviderId" :rules="rules.serviceProviderId">
+          <el-select v-model="renewCustome.serviceProviderId">
+            <el-option value="" label="请选择" />
+            <el-option
+              v-for="item in sellerList"
+              :key="item.serviceProviderId"
+              :label="item.linkMan"
+              :value="item.serviceProviderId"
+            />
+          </el-select>
+        </el-form-item>
       </el-form>
       </el-form>
       <div slot="footer" class="dialog-footer">
       <div slot="footer" class="dialog-footer">
         <el-button @click="dialogFormVisible = false">取消</el-button>
         <el-button @click="dialogFormVisible = false">取消</el-button>
@@ -89,6 +102,7 @@
 
 
 <script>
 <script>
 import { getCmInformationList, renewFollowUpStatus } from '@/api/user/customer/customer'
 import { getCmInformationList, renewFollowUpStatus } from '@/api/user/customer/customer'
+import { getServiceList } from '@/api/library/keyword'
 export default {
 export default {
   name: 'CustomerStatList',
   name: 'CustomerStatList',
   filters: {},
   filters: {},
@@ -107,12 +121,15 @@ export default {
       list: [],
       list: [],
       total: 0,
       total: 0,
       dialogFormVisible: false,
       dialogFormVisible: false,
+      sellerList: [],
       renewCustome: {
       renewCustome: {
         id: '',
         id: '',
+        serviceProviderId: '',
         followUpStatus: ''
         followUpStatus: ''
       },
       },
       rules: {
       rules: {
-        status: [{ required: true, message: '请设置跟进状态', trigger: 'blur' }]
+        followUpStatus: [{ required: true, message: '请设置跟进状态', trigger: 'blur' }],
+        serviceProviderId: [{ required: true, message: '请选择跟进人员', trigger: 'blur' }]
       }
       }
     }
     }
   },
   },
@@ -154,6 +171,7 @@ export default {
     handleSitting(row) {
     handleSitting(row) {
       this.renewCustome.id = row.id
       this.renewCustome.id = row.id
       this.renewCustome.followUpStatus = row.followUpStatus
       this.renewCustome.followUpStatus = row.followUpStatus
+      this.getServiceList()
       this.dialogFormVisible = true
       this.dialogFormVisible = true
     },
     },
     // 调用跟进状态API
     // 调用跟进状态API
@@ -166,6 +184,22 @@ export default {
       } catch (error) {
       } catch (error) {
         console.log(error)
         console.log(error)
       }
       }
+    },
+    // 获取协销列表选项
+    async getServiceList() {
+      try {
+        const res = await getServiceList()
+        this.sellerList = res.data
+      } catch (error) {
+        console.log(error)
+      }
+    },
+    // 潜客备注
+    handleAddRemaks(row) {
+      this.$router.push({
+        path: '/user/customer/customer-remarks',
+        query: { id: row.id }
+      })
     }
     }
   }
   }
 }
 }

+ 9 - 0
src/views/user/customer/list.vue

@@ -52,6 +52,9 @@
       </el-table-column>
       </el-table-column>
       <el-table-column fixed="right" label="操作" align="center" width="400">
       <el-table-column fixed="right" label="操作" align="center" width="400">
         <template slot-scope="{ row }">
         <template slot-scope="{ row }">
+          <!-- <el-button type="primary" size="mini" style="margin: 4px" @click="handleRecordDetail(7, row)">
+            意向客户数据
+          </el-button> -->
           <el-button type="primary" size="mini" style="margin: 4px" @click="handleRecordDetail(1, row)">
           <el-button type="primary" size="mini" style="margin: 4px" @click="handleRecordDetail(1, row)">
             潜客统计列表
             潜客统计列表
           </el-button>
           </el-button>
@@ -238,6 +241,12 @@ export default {
           console.log('renewCustome', this.renewCustome)
           console.log('renewCustome', this.renewCustome)
           this.dialogFormVisible = true
           this.dialogFormVisible = true
           break
           break
+        case 7: // 意向客户数据
+          this.$router.push({
+            path: '/user/customer/customer-ambition-list',
+            query: { shopId: row.shopId }
+          })
+          break
       }
       }
     }
     }
   }
   }

+ 10 - 50
src/views/user/record/list.vue

@@ -206,6 +206,7 @@ import { downloadWithUrl } from '@/utils'
 import { fetchRecordList } from '@/api/user/record/record'
 import { fetchRecordList } from '@/api/user/record/record'
 import { fetchShopRelevanceList, searchBehaviorList } from '@/api/user/supplier/supplier'
 import { fetchShopRelevanceList, searchBehaviorList } from '@/api/user/supplier/supplier'
 import { export_json_to_excel } from '@/vendor/Export2Excel'
 import { export_json_to_excel } from '@/vendor/Export2Excel'
+import pickerOptions from '@/utils/time-picker.js'
 const defaultListQuery = {
 const defaultListQuery = {
   todayType: 0, // 0 今日数据 1 以往数据
   todayType: 0, // 0 今日数据 1 以往数据
   ip: '', // 访问人ID
   ip: '', // 访问人ID
@@ -244,60 +245,11 @@ export default {
     }
     }
   },
   },
   data() {
   data() {
-    const pickerOptions = {
-      shortcuts: [
-        {
-          text: '近1年',
-          onClick(picker) {
-            const end = new Date()
-            const start = new Date()
-            start.setTime(start.getTime() - 3600 * 1000 * 24 * 365)
-            picker.$emit('pick', [start, end])
-          }
-        },
-        {
-          text: '近半年',
-          onClick(picker) {
-            const end = new Date()
-            const start = new Date()
-            start.setTime(start.getTime() - 3600 * 1000 * 24 * 183)
-            picker.$emit('pick', [start, end])
-          }
-        },
-        {
-          text: '近1月',
-          onClick(picker) {
-            const end = new Date()
-            const start = new Date()
-            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
-            picker.$emit('pick', [start, end])
-          }
-        },
-        {
-          text: '近1周',
-          onClick(picker) {
-            const end = new Date()
-            const start = new Date()
-            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
-            picker.$emit('pick', [start, end])
-          }
-        },
-        {
-          text: '昨天',
-          onClick(picker) {
-            const end = new Date()
-            const start = new Date()
-            start.setTime(start.getTime() - 3600 * 1000 * 24)
-            picker.$emit('pick', [start, end])
-          }
-        }
-      ]
-    }
     return {
     return {
       activeName: 'first',
       activeName: 'first',
       isLoading: true,
       isLoading: true,
       pickerOptions,
       pickerOptions,
-      time: '',
+      time: [],
       listQuery: Object.assign({}, defaultListQuery),
       listQuery: Object.assign({}, defaultListQuery),
       shopListQuery: {
       shopListQuery: {
         shopName: '',
         shopName: '',
@@ -326,6 +278,14 @@ export default {
     }
     }
   },
   },
   created() {
   created() {
+    console.log('query', this.$route.query)
+    if (this.$route.query.type === 'second') {
+      this.activeName = 'second'
+      this.tabsCurrent = this.listQuery.todayType = 1
+      this.listQuery.corporateName = this.$route.query.corporateName
+      this.time.push(this.$route.query.startTime)
+      this.time.push(this.$route.query.endTime)
+    }
     this.getHeigth()
     this.getHeigth()
     this.getList()
     this.getList()
   },
   },

+ 33 - 14
src/views/wechat/components/menusList.vue

@@ -4,23 +4,36 @@
       <el-button class="filter-item" type="primary" icon="el-icon-edit" @click="handleCreate">添加一级菜单</el-button>
       <el-button class="filter-item" type="primary" icon="el-icon-edit" @click="handleCreate">添加一级菜单</el-button>
       <el-button class="filter-item" type="primary" icon="el-icon-upload2" @click="handlePush">发布菜单到微信公众号</el-button>
       <el-button class="filter-item" type="primary" icon="el-icon-upload2" @click="handlePush">发布菜单到微信公众号</el-button>
     </div>
     </div>
-    <el-table v-loading="listLoading" row-key="id" :data="list" default-expand-all :row-class-name="rowClassName" border fit highlight-current-row>
+    <el-table
+      v-loading="listLoading"
+      row-key="id"
+      :data="list"
+      default-expand-all
+      :row-class-name="rowClassName"
+      border
+      fit
+      highlight-current-row
+    >
       <el-table-column label="菜单名称" prop="name" align="center" />
       <el-table-column label="菜单名称" prop="name" align="center" />
       <el-table-column label="按钮类型" prop="type" align="center">
       <el-table-column label="按钮类型" prop="type" align="center">
-        <template slot-scope="{row}"><span v-text="showTypeText(row.type)" /></template>
+        <template slot-scope="{ row }">
+          <span v-text="showTypeText(row.type)"></span>
+        </template>
       </el-table-column>
       </el-table-column>
       <el-table-column label="排序" prop="sort" align="center" width="80">
       <el-table-column label="排序" prop="sort" align="center" width="80">
-        <template slot-scope="{row}">
+        <template slot-scope="{ row }">
           <el-input v-model="row.sort" maxlength="4" minlength="1" @blur="handleOnInputBlur(row)" />
           <el-input v-model="row.sort" maxlength="4" minlength="1" @blur="handleOnInputBlur(row)" />
         </template>
         </template>
       </el-table-column>
       </el-table-column>
       <el-table-column label="设置" align="center">
       <el-table-column label="设置" align="center">
-        <template slot-scope="{row}">
-          <el-button plain size="mini" :disabled="row.parentId | disableAddSub" @click="handleCreateNextLevel(row)">添加子菜单</el-button>
+        <template slot-scope="{ row }">
+          <el-button plain size="mini" :disabled="row.parentId | disableAddSub" @click="handleCreateNextLevel(row)">
+            添加子菜单
+          </el-button>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
       <el-table-column label="操作" align="center">
       <el-table-column label="操作" align="center">
-        <template slot-scope="{row}">
+        <template slot-scope="{ row }">
           <el-button size="mini" type="primary" @click="handleUpdate(row)">编辑</el-button>
           <el-button size="mini" type="primary" @click="handleUpdate(row)">编辑</el-button>
           <el-button size="mini" type="danger" @click="handleDelete(row)">删除</el-button>
           <el-button size="mini" type="danger" @click="handleDelete(row)">删除</el-button>
         </template>
         </template>
@@ -76,7 +89,7 @@ export default {
     this.getList()
     this.getList()
   },
   },
   methods: {
   methods: {
-    showTypeText: function(type) {
+    showTypeText(type) {
       if (type === 'view') return '跳转URL'
       if (type === 'view') return '跳转URL'
       if (type === 'miniprogram') return '跳转小程序'
       if (type === 'miniprogram') return '跳转小程序'
       if (type === 'media_id') return '下发媒体消息(图片、音频、视频)'
       if (type === 'media_id') return '下发媒体消息(图片、音频、视频)'
@@ -90,14 +103,14 @@ export default {
       if (type === 'pic_weixin') return '弹出微信相册发图器'
       if (type === 'pic_weixin') return '弹出微信相册发图器'
       if (type === 'location_select') return '弹出地理位置选择器'
       if (type === 'location_select') return '弹出地理位置选择器'
     },
     },
-    rowClassName: function(scope) {
+    rowClassName(scope) {
       if (scope.row.parentId === 1 || scope.row.parentId === 2) {
       if (scope.row.parentId === 1 || scope.row.parentId === 2) {
         return 'parent-row'
         return 'parent-row'
       }
       }
     },
     },
     getList() {
     getList() {
       this.listLoading = true
       this.listLoading = true
-      fetchList(this.listQuery).then(response => {
+      fetchList(this.listQuery).then((response) => {
         this.listLoading = false
         this.listLoading = false
         this.list = response.data
         this.list = response.data
         if (response.data[0]) {
         if (response.data[0]) {
@@ -110,10 +123,16 @@ export default {
       })
       })
     },
     },
     handleCreate() {
     handleCreate() {
-      this.$router.push({ path: `/wechat/${this.linkPath}/menus/add`, query: { parentId: this.listQuery.type, title: this.createTitle }})
+      this.$router.push({
+        path: `/wechat/${this.linkPath}/menus/add`,
+        query: { parentId: this.listQuery.type, title: this.createTitle }
+      })
     },
     },
     handleUpdate(row) {
     handleUpdate(row) {
-      this.$router.push({ path: `/wechat/${this.linkPath}/menus/edit`, query: { id: row.id, parentId: row.parentId, title: row.parentName }})
+      this.$router.push({
+        path: `/wechat/${this.linkPath}/menus/edit`,
+        query: { id: row.id, parentId: row.parentId, title: row.parentName }
+      })
     },
     },
     handleCreateNextLevel(row) {
     handleCreateNextLevel(row) {
       this.$router.push({ path: `/wechat/${this.linkPath}/menus/add`, query: { parentId: row.id, title: row.name }})
       this.$router.push({ path: `/wechat/${this.linkPath}/menus/add`, query: { parentId: row.id, title: row.name }})
@@ -124,7 +143,7 @@ export default {
         cancelButtonText: '取消',
         cancelButtonText: '取消',
         type: 'warning'
         type: 'warning'
       }).then(() => {
       }).then(() => {
-        deleteMenu(row.id).then(response => {
+        deleteMenu(row.id).then((response) => {
           this.$message({
           this.$message({
             message: '删除成功',
             message: '删除成功',
             type: 'success',
             type: 'success',
@@ -140,7 +159,7 @@ export default {
         cancelButtonText: '取消',
         cancelButtonText: '取消',
         type: 'warning'
         type: 'warning'
       }).then(() => {
       }).then(() => {
-        pushWechatMenu(this.listQuery.type).then(response => {
+        pushWechatMenu(this.listQuery.type).then((response) => {
           this.$message({
           this.$message({
             message: '删除成功',
             message: '删除成功',
             type: 'success',
             type: 'success',
@@ -152,7 +171,7 @@ export default {
     },
     },
     handleOnInputBlur(row) {
     handleOnInputBlur(row) {
       // 更新排序
       // 更新排序
-      updateMenu(row.id, { sort: row.sort }).then(response => {
+      updateMenu(row.id, { sort: row.sort }).then((response) => {
         this.$message({
         this.$message({
           message: '操作成功',
           message: '操作成功',
           type: 'success',
           type: 'success',

+ 21 - 16
src/views/wechat/components/replyForm.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div class="app-container">
   <div class="app-container">
-    <el-page-header :content="isEdit?'编辑回复配置':'添加回复配置'" @back="goBack" />
+    <el-page-header :content="isEdit ? '编辑回复配置' : '添加回复配置'" @back="goBack" />
     <el-card class="form-container" shadow="never">
     <el-card class="form-container" shadow="never">
       <el-form ref="weChatReplyFrom" :model="reply" label-width="150px">
       <el-form ref="weChatReplyFrom" :model="reply" label-width="150px">
         <el-form-item label="回复类型:" prop="msgType">
         <el-form-item label="回复类型:" prop="msgType">
@@ -38,20 +38,27 @@
     <el-dialog title="素材选择" :visible.sync="dialogTableVisible">
     <el-dialog title="素材选择" :visible.sync="dialogTableVisible">
       <el-table row-key="id" :data="textData">
       <el-table row-key="id" :data="textData">
         <el-table-column prop="title" label="标题">
         <el-table-column prop="title" label="标题">
-          <template slot-scope="{row}">
-            <el-radio v-model="reply.relateId" :label="row.id" @change="setReplyTitle(row.title)">{{ limitString(row.title, 8) }}</el-radio>
-          </template>>
+          <template slot-scope="{ row }">
+            <el-radio v-model="reply.relateId" :label="row.id" @change="setReplyTitle(row.title)">{{
+              limitString(row.title, 8)
+            }}</el-radio> </template>>
         </el-table-column>
         </el-table-column>
         <el-table-column prop="content" label="内容">
         <el-table-column prop="content" label="内容">
-          <template slot-scope="{row}">
+          <template slot-scope="{ row }">
             <el-tooltip :content="row.content" placement="top">
             <el-tooltip :content="row.content" placement="top">
-              <span v-text="limitString(row.content, 15)" />
+              <span v-text="limitString(row.content, 15)"></span>
             </el-tooltip>
             </el-tooltip>
           </template>
           </template>
         </el-table-column>
         </el-table-column>
         <el-table-column prop="updateTime" label="最后更新时间" width="100" />
         <el-table-column prop="updateTime" label="最后更新时间" width="100" />
       </el-table>
       </el-table>
-      <pagination v-show="textTotal>0" :total="textTotal" :page.sync="textQuery.pageNum" :limit.sync="textQuery.pageSize" @pagination="getTextData" />
+      <pagination
+        v-show="textTotal > 0"
+        :total="textTotal"
+        :page.sync="textQuery.pageNum"
+        :limit.sync="textQuery.pageSize"
+        @pagination="getTextData"
+      />
       <div class="dialog-footer">
       <div class="dialog-footer">
         <el-button @click="resetReplyTitle">取 消</el-button>
         <el-button @click="resetReplyTitle">取 消</el-button>
         <el-button type="primary" @click="dialogTableVisible = false">确 定</el-button>
         <el-button type="primary" @click="dialogTableVisible = false">确 定</el-button>
@@ -120,7 +127,7 @@ export default {
       if (this.$route.query.id) {
       if (this.$route.query.id) {
         this.reply.id = this.$route.query.id
         this.reply.id = this.$route.query.id
         this.isEdit = true
         this.isEdit = true
-        getReply(this.reply.id).then(response => {
+        getReply(this.reply.id).then((response) => {
           this.reply.keyword = response.data.keyword
           this.reply.keyword = response.data.keyword
           this.reply.responseType = response.data.responseType
           this.reply.responseType = response.data.responseType
           this.reply.msgType = response.data.msgType
           this.reply.msgType = response.data.msgType
@@ -135,7 +142,7 @@ export default {
       this.reply.type = this.type
       this.reply.type = this.type
     },
     },
     getTextData() {
     getTextData() {
-      fetchTextList(this.textQuery).then(response => {
+      fetchTextList(this.textQuery).then((response) => {
         this.textData = response.data.results
         this.textData = response.data.results
         this.textTotal = response.data.totalRecord
         this.textTotal = response.data.totalRecord
       })
       })
@@ -152,7 +159,7 @@ export default {
     resetReplyTitle() {
     resetReplyTitle() {
       if (this.$route.query.id) {
       if (this.$route.query.id) {
         this.reply.id = this.$route.query.id
         this.reply.id = this.$route.query.id
-        getReply(this.reply.id).then(response => {
+        getReply(this.reply.id).then((response) => {
           this.reply.title = response.data.title
           this.reply.title = response.data.title
           this.reply.relateId = response.data.relateId
           this.reply.relateId = response.data.relateId
         })
         })
@@ -168,7 +175,7 @@ export default {
       this.getFormData()
       this.getFormData()
     },
     },
     onSubmit(formName) {
     onSubmit(formName) {
-      this.$refs[formName].validate(valid => {
+      this.$refs[formName].validate((valid) => {
         console.log(this.reply)
         console.log(this.reply)
         if (valid) {
         if (valid) {
           this.$confirm('是否提交数据', '提示', {
           this.$confirm('是否提交数据', '提示', {
@@ -178,7 +185,7 @@ export default {
           }).then(() => {
           }).then(() => {
             const self = this
             const self = this
             if (this.isEdit) {
             if (this.isEdit) {
-              updateReply(this.$route.query.id, this.reply).then(response => {
+              updateReply(this.$route.query.id, this.reply).then((response) => {
                 this.$message({
                 this.$message({
                   message: '修改成功',
                   message: '修改成功',
                   type: 'success',
                   type: 'success',
@@ -187,7 +194,7 @@ export default {
                 self.goBack()
                 self.goBack()
               })
               })
             } else {
             } else {
-              createReply(this.reply).then(response => {
+              createReply(this.reply).then((response) => {
                 this.$refs[formName].resetFields()
                 this.$refs[formName].resetFields()
                 this.resetForm(formName)
                 this.resetForm(formName)
                 this.$message({
                 this.$message({
@@ -213,6 +220,4 @@ export default {
 }
 }
 </script>
 </script>
 
 
-<style scoped>
-
-</style>
+<style scoped></style>

+ 23 - 10
src/views/wechat/components/replyList.vue

@@ -22,22 +22,32 @@
     <el-table v-loading="listLoading" row-key="id" :data="list" border fit highlight-current-row>
     <el-table v-loading="listLoading" row-key="id" :data="list" border fit highlight-current-row>
       <el-table-column label="关键词" prop="keyword" align="center" />
       <el-table-column label="关键词" prop="keyword" align="center" />
       <el-table-column label="事件类型" prop="responseType" align="center">
       <el-table-column label="事件类型" prop="responseType" align="center">
-        <template slot-scope="{row}"><span v-text="showResponseTypeText(row.responseType)" /></template>
+        <template slot-scope="{ row }">
+          <span v-text="showResponseTypeText(row.responseType)"></span>
+        </template>
       </el-table-column>
       </el-table-column>
       <el-table-column label="回复类型" prop="msgType" align="center">
       <el-table-column label="回复类型" prop="msgType" align="center">
-        <template slot-scope="{row}"><span v-text="showMsgTypeText(row.msgType)" /></template>
+        <template slot-scope="{ row }">
+          <span v-text="showMsgTypeText(row.msgType)"></span>
+        </template>
       </el-table-column>
       </el-table-column>
       <el-table-column label="回复素材标题" prop="title" align="center" />
       <el-table-column label="回复素材标题" prop="title" align="center" />
       <el-table-column label="最后更新时间" prop="updateTime" align="center" />
       <el-table-column label="最后更新时间" prop="updateTime" align="center" />
       <el-table-column label="操作" align="center">
       <el-table-column label="操作" align="center">
-        <template slot-scope="{row}">
+        <template slot-scope="{ row }">
           <el-button size="mini" type="primary" @click="handleUpdate(row)">编辑</el-button>
           <el-button size="mini" type="primary" @click="handleUpdate(row)">编辑</el-button>
           <el-button size="mini" type="danger" @click="handleDelete(row)">删除</el-button>
           <el-button size="mini" type="danger" @click="handleDelete(row)">删除</el-button>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
     </el-table>
     </el-table>
 
 
-    <pagination v-show="total>0" :total="total" :page.sync="listQuery.pageNum" :limit.sync="listQuery.pageSize" @pagination="getList" />
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getList"
+    />
   </div>
   </div>
 </template>
 </template>
 
 
@@ -87,11 +97,11 @@ export default {
     this.getList()
     this.getList()
   },
   },
   methods: {
   methods: {
-    showResponseTypeText: function(type) {
+    showResponseTypeText(type) {
       if (type === 'text') return '文本素材'
       if (type === 'text') return '文本素材'
       if (type === 'news') return '图文素材'
       if (type === 'news') return '图文素材'
     },
     },
-    showMsgTypeText: function(type) {
+    showMsgTypeText(type) {
       if (type === 'input') return '文本输入'
       if (type === 'input') return '文本输入'
       if (type === 'click') return '点击事件'
       if (type === 'click') return '点击事件'
       if (type === 'subscribe') return '关注'
       if (type === 'subscribe') return '关注'
@@ -103,7 +113,7 @@ export default {
     },
     },
     getList() {
     getList() {
       this.listLoading = true
       this.listLoading = true
-      fetchList(this.listQuery).then(response => {
+      fetchList(this.listQuery).then((response) => {
         this.listLoading = false
         this.listLoading = false
         this.list = response.data.results
         this.list = response.data.results
         this.total = response.data.totalRecord
         this.total = response.data.totalRecord
@@ -117,7 +127,10 @@ export default {
       this.$router.push({ path: `/wechat/${this.linkPath}/reply/add` })
       this.$router.push({ path: `/wechat/${this.linkPath}/reply/add` })
     },
     },
     handleUpdate(row) {
     handleUpdate(row) {
-      this.$router.push({ path: `/wechat/${this.linkPath}/reply/edit`, query: { id: row.id }})
+      this.$router.push({
+        path: `/wechat/${this.linkPath}/reply/edit`,
+        query: { id: row.id }
+      })
     },
     },
     handleDelete(row) {
     handleDelete(row) {
       this.$confirm('是否要删除该回复配置', '提示', {
       this.$confirm('是否要删除该回复配置', '提示', {
@@ -125,7 +138,7 @@ export default {
         cancelButtonText: '取消',
         cancelButtonText: '取消',
         type: 'warning'
         type: 'warning'
       }).then(() => {
       }).then(() => {
-        deleteReply(row.id).then(response => {
+        deleteReply(row.id).then((response) => {
           this.$message({
           this.$message({
             message: '删除成功',
             message: '删除成功',
             type: 'success',
             type: 'success',
@@ -140,7 +153,7 @@ export default {
 </script>
 </script>
 
 
 <style scoped>
 <style scoped>
-.filter-item{
+.filter-item {
   width: 160px;
   width: 160px;
   margin-right: 20px;
   margin-right: 20px;
 }
 }

+ 17 - 8
src/views/wechat/components/textList.vue

@@ -8,22 +8,28 @@
     <el-table v-loading="listLoading" row-key="id" :data="list" border fit highlight-current-row>
     <el-table v-loading="listLoading" row-key="id" :data="list" border fit highlight-current-row>
       <el-table-column label="标题" prop="title" />
       <el-table-column label="标题" prop="title" />
       <el-table-column label="内容" prop="content">
       <el-table-column label="内容" prop="content">
-        <template slot-scope="{row}">
+        <template slot-scope="{ row }">
           <el-tooltip :content="row.content" placement="top">
           <el-tooltip :content="row.content" placement="top">
-            <span v-text="limitString(row.content, 20)" />
+            <span v-text="limitString(row.content, 20)"></span>
           </el-tooltip>
           </el-tooltip>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
       <el-table-column label="最后更新时间" prop="updateTime" align="center" />
       <el-table-column label="最后更新时间" prop="updateTime" align="center" />
       <el-table-column label="操作" align="center">
       <el-table-column label="操作" align="center">
-        <template slot-scope="{row}">
+        <template slot-scope="{ row }">
           <el-button size="mini" type="primary" @click="handleUpdate(row)">编辑</el-button>
           <el-button size="mini" type="primary" @click="handleUpdate(row)">编辑</el-button>
           <el-button size="mini" type="danger" @click="handleDelete(row)">删除</el-button>
           <el-button size="mini" type="danger" @click="handleDelete(row)">删除</el-button>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
     </el-table>
     </el-table>
 
 
-    <pagination v-show="total>0" :total="total" :page.sync="listQuery.pageNum" :limit.sync="listQuery.pageSize" @pagination="getList" />
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="listQuery.pageNum"
+      :limit.sync="listQuery.pageSize"
+      @pagination="getList"
+    />
   </div>
   </div>
 </template>
 </template>
 
 
@@ -76,7 +82,7 @@ export default {
     },
     },
     getList() {
     getList() {
       this.listLoading = true
       this.listLoading = true
-      fetchList(this.listQuery).then(response => {
+      fetchList(this.listQuery).then((response) => {
         this.listLoading = false
         this.listLoading = false
         this.list = response.data.results
         this.list = response.data.results
         this.total = response.data.totalRecord
         this.total = response.data.totalRecord
@@ -96,7 +102,10 @@ export default {
       this.$router.push({ path: `/wechat/${this.linkPath}/text/add` })
       this.$router.push({ path: `/wechat/${this.linkPath}/text/add` })
     },
     },
     handleUpdate(row) {
     handleUpdate(row) {
-      this.$router.push({ path: `/wechat/${this.linkPath}/text/edit`, query: { id: row.id }})
+      this.$router.push({
+        path: `/wechat/${this.linkPath}/text/edit`,
+        query: { id: row.id }
+      })
     },
     },
     handleDelete(row) {
     handleDelete(row) {
       this.$confirm('是否要删除该文本素材', '提示', {
       this.$confirm('是否要删除该文本素材', '提示', {
@@ -104,7 +113,7 @@ export default {
         cancelButtonText: '取消',
         cancelButtonText: '取消',
         type: 'warning'
         type: 'warning'
       }).then(() => {
       }).then(() => {
-        deleteText(row.id).then(response => {
+        deleteText(row.id).then((response) => {
           this.$message({
           this.$message({
             message: '删除成功',
             message: '删除成功',
             type: 'success',
             type: 'success',
@@ -119,7 +128,7 @@ export default {
 </script>
 </script>
 
 
 <style scoped>
 <style scoped>
-.filter-item{
+.filter-item {
   width: 160px;
   width: 160px;
   margin-right: 20px;
   margin-right: 20px;
 }
 }

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor