Browse Source

开发批量加好友接口,以及H5

liuxiaona 2 years ago
parent
commit
c592f7958c
40 changed files with 10413 additions and 185 deletions
  1. 23 4
      .idea/workspace.xml
  2. 15 0
      project/src/assets/config/interface_api.js
  3. 5 5
      project/src/components/assembly/screen/channel.vue
  4. 35 2
      project/src/components/marketingGuest/batchAddFriend/addFriend/dialogPublic.vue
  5. 61 25
      project/src/components/marketingGuest/batchAddFriend/addFriend/importRecord.vue
  6. 23 13
      project/src/components/marketingGuest/batchAddFriend/addFriend/importRecordDetial.vue
  7. 95 60
      project/src/components/marketingGuest/batchAddFriend/addFriend/index.vue
  8. 8 26
      project/src/components/marketingGuest/batchAddFriend/addFriend/setting.vue
  9. 86 49
      project/src/components/marketingGuest/batchAddFriend/dataPreview/index.vue
  10. 1 1
      project/src/router/allRouter.js
  11. 4 0
      qwh5/.browserslistrc
  12. 5 0
      qwh5/.editorconfig
  13. 18 0
      qwh5/.eslintrc.js
  14. 23 0
      qwh5/.gitignore
  15. 24 0
      qwh5/README.md
  16. 5 0
      qwh5/babel.config.js
  17. 1 0
      qwh5/h5Pack/css/app.85dd6470.css
  18. BIN
      qwh5/h5Pack/favicon.ico
  19. 1 0
      qwh5/h5Pack/index.html
  20. 2 0
      qwh5/h5Pack/js/about.76dda73f.js
  21. 1 0
      qwh5/h5Pack/js/about.76dda73f.js.map
  22. 2 0
      qwh5/h5Pack/js/app.5255912a.js
  23. 1 0
      qwh5/h5Pack/js/app.5255912a.js.map
  24. 20 0
      qwh5/h5Pack/js/chunk-vendors.ec43d46e.js
  25. 1 0
      qwh5/h5Pack/js/chunk-vendors.ec43d46e.js.map
  26. 9553 0
      qwh5/package-lock.json
  27. 38 0
      qwh5/package.json
  28. BIN
      qwh5/public/favicon.ico
  29. 17 0
      qwh5/public/index.html
  30. 26 0
      qwh5/src/App.vue
  31. BIN
      qwh5/src/assets/logo.png
  32. 65 0
      qwh5/src/components/HelloWorld.vue
  33. 8 0
      qwh5/src/main.ts
  34. 25 0
      qwh5/src/router/index.ts
  35. 6 0
      qwh5/src/shims-vue.d.ts
  36. 14 0
      qwh5/src/store/index.ts
  37. 5 0
      qwh5/src/views/AboutView.vue
  38. 149 0
      qwh5/src/views/HomeView.vue
  39. 41 0
      qwh5/tsconfig.json
  40. 6 0
      qwh5/vue.config.js

+ 23 - 4
.idea/workspace.xml

@@ -2,10 +2,15 @@
2 2
 <project version="4">
3 3
   <component name="ChangeListManager">
4 4
     <list default="true" id="f876064f-ad38-46e7-bf7d-9df623a9178f" name="Changes" comment="">
5
-      <change afterPath="$PROJECT_DIR$/project/src/components/H5/customerDetails.vue" afterDir="false" />
6
-      <change beforePath="$PROJECT_DIR$/project/config/index.js" beforeDir="false" afterPath="$PROJECT_DIR$/project/config/index.js" afterDir="false" />
7
-      <change beforePath="$PROJECT_DIR$/project/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/project/index.html" afterDir="false" />
5
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
8 6
       <change beforePath="$PROJECT_DIR$/project/src/assets/config/interface_api.js" beforeDir="false" afterPath="$PROJECT_DIR$/project/src/assets/config/interface_api.js" afterDir="false" />
7
+      <change beforePath="$PROJECT_DIR$/project/src/components/assembly/screen/channel.vue" beforeDir="false" afterPath="$PROJECT_DIR$/project/src/components/assembly/screen/channel.vue" afterDir="false" />
8
+      <change beforePath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/addFriend/dialogPublic.vue" beforeDir="false" afterPath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/addFriend/dialogPublic.vue" afterDir="false" />
9
+      <change beforePath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/addFriend/importRecord.vue" beforeDir="false" afterPath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/addFriend/importRecord.vue" afterDir="false" />
10
+      <change beforePath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/addFriend/importRecordDetial.vue" beforeDir="false" afterPath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/addFriend/importRecordDetial.vue" afterDir="false" />
11
+      <change beforePath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/addFriend/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/addFriend/index.vue" afterDir="false" />
12
+      <change beforePath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/addFriend/setting.vue" beforeDir="false" afterPath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/addFriend/setting.vue" afterDir="false" />
13
+      <change beforePath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/dataPreview/index.vue" beforeDir="false" afterPath="$PROJECT_DIR$/project/src/components/marketingGuest/batchAddFriend/dataPreview/index.vue" afterDir="false" />
9 14
       <change beforePath="$PROJECT_DIR$/project/src/router/allRouter.js" beforeDir="false" afterPath="$PROJECT_DIR$/project/src/router/allRouter.js" afterDir="false" />
10 15
     </list>
11 16
     <option name="SHOW_DIALOG" value="false" />
@@ -26,10 +31,23 @@
26 31
     <property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
27 32
     <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
28 33
     <property name="WebServerToolWindowFactoryState" value="false" />
29
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/project" />
34
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/qwh5" />
35
+    <property name="nodejs_package_manager_path" value="npm" />
30 36
     <property name="settings.editor.selected.configurable" value="editor.reader.mode" />
31 37
     <property name="vue.rearranger.settings.migration" value="true" />
32 38
   </component>
39
+  <component name="RunManager">
40
+    <configuration name="dev" type="js.build_tools.npm" nameIsGenerated="true">
41
+      <package-json value="$PROJECT_DIR$/project/package.json" />
42
+      <command value="run" />
43
+      <scripts>
44
+        <script value="dev" />
45
+      </scripts>
46
+      <node-interpreter value="project" />
47
+      <envs />
48
+      <method v="2" />
49
+    </configuration>
50
+  </component>
33 51
   <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
34 52
   <component name="TaskManager">
35 53
     <task active="true" id="Default" summary="Default task">
@@ -40,6 +58,7 @@
40 58
       <updated>1653986562930</updated>
41 59
       <workItem from="1653986566612" duration="2107000" />
42 60
       <workItem from="1654070934388" duration="14000" />
61
+      <workItem from="1654573024055" duration="14582000" />
43 62
     </task>
44 63
     <servers />
45 64
   </component>

+ 15 - 0
project/src/assets/config/interface_api.js

@@ -132,6 +132,21 @@ var api = {
132 132
   warn_ruleConfList: "/api/warn/ruleConfList",
133 133
   warn_ruleConfOperate: "/api/warn/ruleConfOperate",
134 134
 
135
+  editConfig: "/api/BatchAddCustomer/editConfig",
136
+  noticeUser: "/api/BatchAddCustomer/noticeUser",
137
+  batchAddCustomerImport: "/api/customer/batchAddCustomerImport",
138
+  batchAddCustomerImportConfirm: "/api/customer/batchAddCustomerImportConfirm",
139
+  customerListH5: "/api/task/customerList",
140
+  dataReportingH5: "/api/addCustomer/dataReporting",
141
+  batchAddCustomerDetailsList: "/api/customer/batchAddCustomerDetailsList",
142
+  batchAddCustomerRecordList: "/api/customer/batchAddCustomerRecordList",
143
+  batchAddCustomerRecordDetail: "/api/customer/batchAddCustomerRecordDetail",
144
+  batchAddCustomer_dataSummary: "/api/BatchAddCustomer/dataSummary",
145
+  batchAddCustomer_statistic: "/api/BatchAddCustomer/statistic",
146
+  batchAddCustomer_delete: "/api/customer/deleteDetail",
147
+  record_delete: "/api/customer/deleteRecord",
148
+  batchRemind: "/api/customer/batchRemind",
149
+
135 150
 
136 151
 };
137 152
 

+ 5 - 5
project/src/components/assembly/screen/channel.vue

@@ -127,11 +127,11 @@ export default {
127 127
       this.placeholderVal = '朋友圈类型'
128 128
     }else if (this.type == 'importRecordDetial_addStatus') {//批量加好友/导入详情/添加状态
129 129
       this.options = [
130
-        { key: 1, val: '全部' },
131
-        { key: 2, val: '待分配' },
132
-        { key: 3, val: '待添加' },
133
-        { key: 4, val: '待通过' },
134
-        { key: 5, val: '已添加' },
130
+        { key: 0, val: '全部' },
131
+        { key: 1, val: '待添加' },
132
+        { key: 2, val: '待通过' },
133
+        { key: 3, val: '已添加' },
134
+        { key: 4, val: '待分配' },
135 135
       ]
136 136
       this.placeholderVal = '添加状态'
137 137
     } else {

+ 35 - 2
project/src/components/marketingGuest/batchAddFriend/addFriend/dialogPublic.vue

@@ -1,5 +1,6 @@
1 1
 <template>
2 2
   <el-dialog
3
+    v-loading="loading"
3 4
     :title="dialogTitle"
4 5
     :visible.sync="dialogVisible"
5 6
     width="30%">
@@ -9,7 +10,7 @@
9 10
     </div>
10 11
     <span slot="footer" class="dialog-footer">
11 12
         <el-button size="mini" @click="dialogVisible = false">取 消</el-button>
12
-        <el-button size="mini" type="primary" @click="dialogVisible = false">确 定</el-button>
13
+        <el-button size="mini" type="primary" @click="save()">确 定</el-button>
13 14
       </span>
14 15
   </el-dialog>
15 16
 </template>
@@ -19,12 +20,44 @@ import selfCustomerservice from '@/components/assembly/screen/customerService.vu
19 20
 export default {
20 21
   name: "dialogPublic",
21 22
   components:{selfCustomerservice},
22
-  props:['dialogTitle','dialogMsg'],
23
+  props:['dialogTitle','dialogMsg','type','user_ids'],
23 24
   data(){
24 25
     return{
26
+      loading:false,
25 27
       dialogVisible:false,
26 28
       user_id_list:[]
27 29
     }
30
+  },
31
+  methods:{
32
+    save(){
33
+      if(this.type == 'addCustomer'){
34
+        this.addCustomer_notice()
35
+      }
36
+
37
+    },
38
+    addCustomer_notice(){
39
+      this.loading = true
40
+      this.$axios.post(this.URL.BASEURL + this.URL.noticeUser, {
41
+        user_ids:this.user_ids.join()
42
+      }).then((res) => {
43
+        var res = res.data
44
+        this.$message({
45
+          message: res.err,
46
+          type: "warning"
47
+        })
48
+        this.dialogVisible = false
49
+        this.loading = false
50
+        this.$parent.init(1)
51
+        this.$parent.clearuser_ids()
52
+        this.$loading(this.$loadingConfig).close();
53
+      }).catch((err) => {
54
+        this.loading = false
55
+        this.$message({
56
+          message: err,
57
+          type: "warning"
58
+        })
59
+      });
60
+    }
28 61
   }
29 62
 }
30 63
 </script>

+ 61 - 25
project/src/components/marketingGuest/batchAddFriend/addFriend/importRecord.vue

@@ -15,31 +15,55 @@
15 15
                 :data="tableData"
16 16
                 tooltip-effect="dark"
17 17
                 style="width: 100%">
18
-        <el-table-column prop="creator" label="名称" align="center" show-overflow-tooltip></el-table-column>
19
-        <el-table-column prop="send_time" min-width="120" label="上传时间" show-overflow-tooltip align="center"></el-table-column>
20
-        <el-table-column label="分配客服" show-overflow-tooltip align="center">
18
+        <el-table-column label="名称" align="center" show-overflow-tooltip>
21 19
           <template slot-scope="scope">
22
-            <div class="customerServiceTagBox">
23
-              <div class="customerServiceTag"><i class="el-icon-user-solid"></i> {{ scope.row.creator }}</div>
20
+            <div>{{scope.row.file_name ? scope.row.file_name : '-'}}</div>
21
+          </template>
22
+        </el-table-column>
23
+        <el-table-column min-width="120" label="上传时间" align="center">
24
+          <template slot-scope="scope">
25
+            <div>{{scope.row.import_time ? scope.row.import_time : '-'}}</div>
26
+          </template>
27
+        </el-table-column>
28
+        <el-table-column label="分配客服" align="center">
29
+          <template slot-scope="scope">
30
+            <template v-if="scope.row.user_list&&scope.row.user_list.length==0">-</template>
31
+            <div class="flex-align-center">
32
+              <div class="customerServiceTagBox" v-for="(item,idx) in scope.row.user_list" :key="idx+'kefu'">
33
+                <div class="customerServiceTag"><i class="el-icon-user-solid"></i> {{ item }}</div>
34
+              </div>
24 35
             </div>
25 36
           </template>
26 37
         </el-table-column>
27 38
         <el-table-column label="客户标签" align="center">
28
-          <div class="customerServiceTagBox biaoqian">
29
-            -
30
-            <!--          <div class="customerServiceTag" v-for="(item,index) in scope.row.tag_list" :key="index+'biaoqian'">{{item}}</div>-->
31
-          </div>
39
+          <template slot-scope="scope">
40
+            <template v-if="scope.row.tag_list&&scope.row.tag_list.length==0">-</template>
41
+            <div class="customerServiceTagBox biaoqian" v-else>
42
+              <div class="customerServiceTag" v-for="(item,index) in scope.row.tag_list" :key="index+'biaoqian'">{{item}}</div>
43
+            </div>
44
+          </template>
45
+        </el-table-column>
46
+        <el-table-column min-width="120" label="导入客户数" align="center">
47
+          <template slot-scope="scope">
48
+            <div>{{scope.row.total_count ? scope.row.total_count : '-'}}</div>
49
+          </template>
50
+        </el-table-column>
51
+        <el-table-column label="已添加客户数" align="center">
52
+          <template slot-scope="scope">
53
+            <div>{{scope.row.complete_count ? scope.row.complete_count : '-'}}</div>
54
+          </template>
55
+        </el-table-column>
56
+        <el-table-column label="添加完成率" align="center">
57
+          <template slot-scope="scope">
58
+            <div>{{scope.row.complete_rate ? scope.row.complete_rate : '-'}}</div>
59
+          </template>
32 60
         </el-table-column>
33
-        <el-table-column prop="send_time" min-width="120" label="导入客户数" show-overflow-tooltip align="center"></el-table-column>
34
-        <el-table-column prop="send_fail" label="已添加客户数" show-overflow-tooltip align="center"></el-table-column>
35
-
36
-        <el-table-column prop="estimated_user" label="添加完成率" show-overflow-tooltip align="center"></el-table-column>
37 61
         <el-table-column label="操作" align="center">
38 62
           <template slot-scope="scope">
39
-            <div>
40
-              <div class="c-00B38A pointer" @click="remindCustomer(scope.row.rule_id)">提醒</div>
41
-              <div class="c-00B38A pointer" @click="deleCustomer(scope.row.rule_id)">删除</div>
42
-              <div class="c-00B38A pointer" @click="goDetail(scope.row.rule_id)">详情</div>
63
+            <div style="display: flex;align-items: center;justify-content: center">
64
+              <div class="c-00B38A pointer" @click="remindCustomer(scope.row.id)">提醒</div>
65
+              <div class="c-00B38A pointer lMar10" @click="deleCustomer(scope.row.id)">删除</div>
66
+              <div class="c-00B38A pointer lMar10" @click="goDetail(scope.row.id)">详情</div>
43 67
             </div>
44 68
           </template>
45 69
         </el-table-column>
@@ -85,19 +109,32 @@ export default {
85 109
         this.dialogMsg = '确认后将会给所有未发送成员发送提醒通知,是否发送?'
86 110
       })
87 111
     },
88
-    deleCustomer(){
112
+    deleCustomer(id){
89 113
       this.$alert('删除后仅可删除本条记录,员工已收到的任务分配提醒无法撤回,是否确认删除?', '提示', {
90 114
         cancelButtonText: '取消',
91 115
         confirmButtonText: '确定',
92 116
       }).then(()=>{
93
-        this.$message({
94
-          type: 'success',
95
-          message: '删除成功!'
117
+        this.loading = true
118
+        this.$axios.post(this.URL.BASEURL + this.URL.record_delete, {
119
+          record_id:id
120
+        }).then((res) => {
121
+          var res = res.data
122
+          this.$message({
123
+            message: res.err,
124
+            type: "warning"
125
+          })
126
+          this.init(1)
127
+        }).catch((err) => {
128
+          this.loading = false
129
+          this.$message({
130
+            message: err,
131
+            type: "warning"
132
+          })
96 133
         });
97 134
       })
98 135
     },
99
-    goDetail(){
100
-      this.$router.push('/importRecordDetial')
136
+    goDetail(id){
137
+      this.$router.push('/importRecordDetial/'+id)
101 138
     },
102 139
     handleCurrentChange (val) {
103 140
       this.init(val)
@@ -105,9 +142,8 @@ export default {
105 142
     init (page, type) {
106 143
       this.page = page ? page : this.page;
107 144
       this.loading = true
108
-      this.$axios.get(this.URL.BASEURL + this.URL.massMsg_lists, {
145
+      this.$axios.get(this.URL.BASEURL + this.URL.batchAddCustomerRecordList, {
109 146
         params: {
110
-          creator_id: '',
111 147
           page: this.page,
112 148
           page_size: this.page_size
113 149
         }

+ 23 - 13
project/src/components/marketingGuest/batchAddFriend/addFriend/importRecordDetial.vue

@@ -28,16 +28,24 @@
28 28
                 :data="tableData"
29 29
                 tooltip-effect="dark"
30 30
                 style="width: 100%">
31
-        <el-table-column prop="creator" label="客户电话" align="center" show-overflow-tooltip></el-table-column>
32
-        <el-table-column prop="send_time" min-width="120" label="备注名" show-overflow-tooltip align="center"></el-table-column>
31
+        <el-table-column label="客户电话" align="center">
32
+          <template slot-scope="scope">
33
+            <div>{{scope.row.phone ? scope.row.phone : '-'}}</div>
34
+          </template>
35
+        </el-table-column>
36
+        <el-table-column min-width="120" label="备注名" align="center">
37
+          <template slot-scope="scope">
38
+            <div>{{scope.row.remark ? scope.row.remark : '-'}}</div>
39
+          </template>
40
+        </el-table-column>
33 41
         <el-table-column label="员工" show-overflow-tooltip align="center">
34 42
           <template slot-scope="scope">
35 43
             <div class="customerServiceTagBox">
36
-              <div class="customerServiceTag"><i class="el-icon-user-solid"></i> {{ scope.row.creator }}</div>
44
+              <div class="customerServiceTag"><i class="el-icon-user-solid"></i> {{ scope.row.user_name ? scope.row.user_name : '-' }}</div>
37 45
             </div>
38 46
           </template>
39 47
         </el-table-column>
40
-        <el-table-column show-overflow-tooltip align="center">
48
+        <el-table-column align="center">
41 49
           <template #header>
42 50
             添加状态
43 51
             <el-tooltip class="disinblock" placement="top" effect="light">
@@ -51,17 +59,16 @@
51 59
             </el-tooltip>
52 60
           </template>
53 61
           <template slot-scope="scope">
54
-            <span v-if="scope.row.enable==-2" class="c-F03F5C">已删除</span>
55
-            <span v-if="scope.row.enable==-1" class="c-666">发送失败</span>
56
-            <span v-if="scope.row.enable==0" class="c-F03F5C">禁用</span>
57
-            <span v-if="scope.row.enable==1" class="c-FFB055">待发送</span>
58
-            <span v-if="scope.row.enable==2" class="c-448AFF">正在发送中</span>
59
-            <span v-if="scope.row.enable==3" class="c-58BCA6">发送完成</span>
62
+            <span v-if="scope.row.add_status==1" class="c-FFB055">待添加</span>
63
+            <span v-else-if="scope.row.add_status==2" class="c-448AFF">待通过</span>
64
+            <span v-else-if="scope.row.add_status==3" class="c-58BCA6">已添加</span>
65
+            <span v-else-if="scope.row.add_status==4" class="c-F03F5C">待分配</span>
66
+            <span v-else>-</span>
60 67
           </template>
61 68
         </el-table-column>
62 69
         <el-table-column label="操作" align="center">
63 70
           <template slot-scope="scope">
64
-            <div :class="scope.row.enable==0 ? 'c-999 pointer-drop' : 'c-00B38A pointer'" @click="scope.row.enable!==0&&remindCustomer(scope.row.rule_id)">提醒添加</div>
71
+            <div :class="scope.row.add_status==3 ? 'c-999 pointer-drop' : 'c-00B38A pointer' " @click="scope.row.add_status!=3&&remindCustomer(scope.row.id)">提醒添加</div>
65 72
           </template>
66 73
         </el-table-column>
67 74
       </el-table>
@@ -119,9 +126,12 @@ export default {
119 126
     init (page, type) {
120 127
       this.page = page ? page : this.page;
121 128
       this.loading = true
122
-      this.$axios.get(this.URL.BASEURL + this.URL.massMsg_lists, {
129
+      console.log(this.$route.params.id);
130
+      this.$axios.get(this.URL.BASEURL + this.URL.batchAddCustomerRecordDetail, {
123 131
         params: {
124
-          creator_id: '',
132
+          record_id:this.$route.params.id,
133
+          add_status:this.addStatus==0?'':this.addStatus,
134
+          keyword:this.input_keyword,
125 135
           page: this.page,
126 136
           page_size: this.page_size
127 137
         }

+ 95 - 60
project/src/components/marketingGuest/batchAddFriend/addFriend/index.vue

@@ -1,7 +1,7 @@
1 1
 <template>
2 2
   <div>
3 3
     <div class="operatArea">
4
-      <el-radio-group v-model="status">
4
+      <el-radio-group v-model="status" @change="init(1)">
5 5
         <el-radio v-for="s in statusArrs" :label="s.label" :key="s.label">{{s.name}}</el-radio>
6 6
       </el-radio-group>
7 7
       <div class="btnArea">
@@ -11,8 +11,8 @@
11 11
         <el-button type="primary" plain size="small" @click="$refs.settingRef.dialogVisible = true">设置</el-button>
12 12
 
13 13
         <el-button v-if="status!==0" type="primary" plain size="small" @click="batchDele()">批量删除</el-button>
14
-        <el-button v-if="status==2 || status==3" type="primary" plain size="small" @click="batchRemind()">批量提醒</el-button>
15
-        <el-button v-if="status==1" type="primary" plain size="small" @click="batchAllot()">批量分配</el-button>
14
+        <el-button v-if="status==1 || status==2" type="primary" plain size="small" @click="batchRemind()">批量提醒</el-button>
15
+        <el-button v-if="status==4" type="primary" plain size="small" @click="batchAllot()">批量分配</el-button>
16 16
       </div>
17 17
     </div>
18 18
 
@@ -25,20 +25,30 @@
25 25
               @selection-change="handleSelectionChange"
26 26
               v-loading="loading">
27 27
       <el-table-column width="30px" type="selection" v-if="status!==0"></el-table-column>
28
-      <el-table-column prop="send_type" label="电话号码" align="center" show-overflow-tooltip></el-table-column>
28
+      <el-table-column label="电话号码" align="center" show-overflow-tooltip>
29
+        <template slot-scope="scope">
30
+          <div>{{scope.row.phone ? scope.row.phone : '-'}}</div>
31
+        </template>
32
+      </el-table-column>
29 33
       <el-table-column label="备注" align="center">
30 34
         <template slot-scope="scope">
31
-          <div>{{scope.row.send_type == 1 ? '立即发送':scope.row.send_type == 2?'定时发送':''}}</div>
35
+          <div>{{scope.row.remark ? scope.row.remark : '-'}}</div>
36
+        </template>
37
+      </el-table-column>
38
+      <el-table-column min-width="120" label="导入时间" show-overflow-tooltip align="center">
39
+        <template slot-scope="scope">
40
+          <div>{{scope.row.import_time ? scope.row.import_time : '-'}}</div>
32 41
         </template>
33 42
       </el-table-column>
34
-      <el-table-column prop="send_time" min-width="120" label="导入时间" show-overflow-tooltip align="center"></el-table-column>
35
-      <el-table-column label="客户标签" align="center">
36
-        <div class="customerServiceTagBox biaoqian">
37
-          -
38
-<!--          <div class="customerServiceTag" v-for="(item,index) in scope.row.tag_list" :key="index+'biaoqian'">{{item}}</div>-->
39
-        </div>
43
+      <el-table-column label="客户标签" align="center" show-overflow-tooltip>
44
+        <template slot-scope="scope">
45
+          <template v-if="scope.row.tag_list&&scope.row.tag_list.length==0">-</template>
46
+          <div class="customerServiceTagBox biaoqian" v-else>
47
+            <div class="customerServiceTag" v-for="(item,index) in scope.row.tag_list" :key="index+'biaoqian'">{{item}}</div>
48
+          </div>
49
+        </template>
40 50
       </el-table-column>
41
-      <el-table-column show-overflow-tooltip align="center">
51
+      <el-table-column align="center">
42 52
         <template #header>
43 53
           添加状态
44 54
           <el-tooltip class="disinblock" placement="top" effect="light">
@@ -52,32 +62,42 @@
52 62
           </el-tooltip>
53 63
         </template>
54 64
         <template slot-scope="scope">
55
-          <span v-if="scope.row.enable==-2" class="c-F03F5C">已删除</span>
56
-          <span v-if="scope.row.enable==-1" class="c-666">发送失败</span>
57
-          <span v-if="scope.row.enable==0" class="c-F03F5C">禁用</span>
58
-          <span v-if="scope.row.enable==1" class="c-FFB055">待发送</span>
59
-          <span v-if="scope.row.enable==2" class="c-448AFF">正在发送中</span>
60
-          <span v-if="scope.row.enable==3" class="c-58BCA6">发送完成</span>
65
+          <span v-if="scope.row.add_status==1" class="c-FFB055">待添加</span>
66
+          <span v-else-if="scope.row.add_status==2" class="c-448AFF">待通过</span>
67
+          <span v-else-if="scope.row.add_status==3" class="c-58BCA6">已添加</span>
68
+          <span v-else-if="scope.row.add_status==4" class="c-F03F5C">待分配</span>
69
+          <span v-else>-</span>
61 70
         </template>
62 71
       </el-table-column>
63
-      <el-table-column prop="send_time" min-width="120" label="添加时间" show-overflow-tooltip align="center"></el-table-column>
64
-      <el-table-column prop="send_fail" label="操作人" show-overflow-tooltip align="center"></el-table-column>
65
-      <el-table-column label="分配客服" show-overflow-tooltip align="center">
72
+      <el-table-column min-width="120" label="添加时间" align="center">
73
+        <template slot-scope="scope">
74
+          <div>{{scope.row.add_time ? scope.row.add_time : '-'}}</div>
75
+        </template>
76
+      </el-table-column>
77
+      <el-table-column label="操作人" align="center">
78
+        <template slot-scope="scope">
79
+          <div>{{scope.row.operator_name ? scope.row.operator_name : '-'}}</div>
80
+        </template>
81
+      </el-table-column>
82
+      <el-table-column label="分配客服" align="center">
66 83
         <template slot-scope="scope">
67 84
           <div class="customerServiceTagBox">
68
-            <div class="customerServiceTag"><i class="el-icon-user-solid"></i> {{ scope.row.creator }}</div>
85
+            <div class="customerServiceTag"><i class="el-icon-user-solid"></i> {{ scope.row.user_name ? scope.row.user_name : '-' }}</div>
69 86
           </div>
70 87
         </template>
71 88
       </el-table-column>
72
-      <el-table-column prop="estimated_user" label="分配次数" show-overflow-tooltip align="center"></el-table-column>
89
+      <el-table-column label="分配次数" align="center">
90
+        <template slot-scope="scope">
91
+          <div>{{scope.row.distribution_num ? scope.row.distribution_num : '-'}}</div>
92
+        </template>
93
+      </el-table-column>
73 94
       <el-table-column label="操作" align="center">
74 95
         <template slot-scope="scope">
75
-          <div>
76
-
77
-            <div class="c-00B38A pointer" @click="goDetail(scope.row.rule_id)">详情</div>
78
-            <div class="c-00B38A pointer" @click="allotCustomer(scope.row.rule_id)">分配</div>
79
-            <div class="c-00B38A pointer" @click="remindCustomer(scope.row.rule_id,scope.row.enable)">提醒</div>
80
-            <div class="c-00B38A pointer" @click="deleCustomer(scope.row.rule_id)">删除</div>
96
+          <div style="display: flex;align-items: center;justify-content: center;flex-wrap: wrap">
97
+            <div class="c-00B38A pointer" @click="goDetail(scope.row.id)">详情</div>
98
+            <div class="c-00B38A pointer lMar10" @click="deleCustomer(scope.row.id)">删除</div>
99
+            <div v-if="scope.row.add_status==4" class="lMar10" :class="scope.row.add_status==4 ? 'c-00B38A pointer' : 'c-999 pointer-drop' " @click="scope.row.add_status==4 && allotCustomer(scope.row.id)">分配</div>
100
+            <div v-if="scope.row.add_status==1||scope.row.add_status==2" class="c-00B38A pointer lMar10" @click="remindCustomer(scope.row.user_id,scope.row.add_status)">提醒</div>
81 101
           </div>
82 102
         </template>
83 103
       </el-table-column>
@@ -88,7 +108,7 @@
88 108
     </div>
89 109
 
90 110
 <!--    提醒分配等公共弹框-->
91
-    <dialogPublic ref="dialogPublic" :dialogTitle="dialogTitle" :dialogMsg="dialogMsg"></dialogPublic>
111
+    <dialogPublic ref="dialogPublic" :dialogTitle="dialogTitle" :dialogMsg="dialogMsg" type="addCustomer" :user_ids="user_ids"></dialogPublic>
92 112
     <!--    设置-->
93 113
     <setting ref="settingRef"></setting>
94 114
     <!--    导入客户-->
@@ -107,6 +127,7 @@ export default {
107 127
   components:{selfInput,importCustomer,setting, dialogPublic},
108 128
   data(){
109 129
     return {
130
+      test:10,
110 131
       loading:false,
111 132
       status:0,
112 133
       statusArrs:[
@@ -116,20 +137,20 @@ export default {
116 137
         },
117 138
         {
118 139
           name:'待分配',
119
-          label:1
140
+          label:4
120 141
         },
121 142
         {
122 143
           name:'待添加',
123
-          label:2
144
+          label:1
124 145
         },
125 146
         {
126 147
           name:'待通过',
127
-          label:3
148
+          label:2
128 149
         },
129 150
         {
130 151
           name:'已添加',
131
-          label:4
132
-        }
152
+          label:3
153
+        },
133 154
       ],
134 155
       input_keyword:'',
135 156
       tableData:[],
@@ -142,22 +163,31 @@ export default {
142 163
       dialogMsg:'',
143 164
       user_id_list:[],
144 165
       noChooseFlag:false,//是否选中电话号码,true,表示没有人
145
-      multipleChoosePhones: [],
166
+      time:[],
167
+      user_ids:[],//批量选中的人
168
+    }
169
+  },
170
+  watch:{
171
+    time(){
172
+      this.init(1)
146 173
     }
147 174
   },
148 175
   created () {
176
+    // Bus.$on('chooseStatus',(arg)=>{
177
+    //   console.log('zou created le ');
178
+    //   this.status = arg
179
+    //   this.test = arg
180
+    // })
149 181
     this.height = document.documentElement.clientHeight - 250 > 400 ? document.documentElement.clientHeight - 250 : 400
150
-    this.$nextTick(()=>{
151
-      Bus.$on('chooseStatus',(arg)=>{
152
-        this.status = arg
153
-      })
154
-    })
155 182
     this.init(1)
156 183
   },
157 184
   methods:{
185
+    clearuser_ids(){ //清空批量选中的人
186
+      this.user_ids = []
187
+    },
158 188
     noChooseCustomeTips(){//没有选择客户提示
159 189
       this.noChooseFlag = false
160
-      if( this.multipleChoosePhones&& this.multipleChoosePhones.length==0){
190
+      if( this.user_ids&& this.user_ids.length==0){
161 191
         this.$message({
162 192
           type: 'error',
163 193
           message: '请选择客户!'
@@ -165,11 +195,13 @@ export default {
165 195
         this.noChooseFlag = true
166 196
       }
167 197
     },
168
-    handleSelectionChange(val){
169
-      this.multipleChoosePhones = val
170
-      console.log(this.multipleChoosePhones);
198
+    handleSelectionChange(val){//列表选择人员
199
+      this.user_ids = []
200
+      val.forEach(item=>{
201
+        this.user_ids.push(item.user_id)
202
+      })
171 203
     },
172
-    batchDele(){
204
+    batchDele(){//批量删除
173 205
       this.noChooseCustomeTips()
174 206
       if(this.noChooseFlag){
175 207
         return
@@ -184,22 +216,22 @@ export default {
184 216
         });
185 217
       })
186 218
     },
187
-    batchRemind(){
219
+    batchRemind(){//批量提醒
188 220
       this.noChooseCustomeTips()
189 221
       if(this.noChooseFlag){
190 222
         return
191 223
       }
192
-      this.$alert('确认后将会给选择的成员发送提醒通知,是否发送?', '提示', {
224
+      this.$alert(`确认后将会给选择的${this.user_ids&&this.user_ids.length?this.user_ids.length:'-'}名成员发送提醒通知,是否发送?`, '提示', {
193 225
         cancelButtonText: '取消',
194 226
         confirmButtonText: '确定',
195 227
       }).then(()=>{
196
-        this.$message({
197
-          type: 'success',
198
-          message: '删除成功!'
199
-        });
228
+        this.$nextTick(()=>{
229
+          this.$loading(this.$loadingConfig)
230
+          this.$refs.dialogPublic.addCustomer_notice()
231
+        })
200 232
       })
201 233
     },
202
-    batchAllot(){
234
+    batchAllot(){//批量分配
203 235
       this.noChooseCustomeTips()
204 236
       if(this.noChooseFlag){
205 237
         return
@@ -214,7 +246,7 @@ export default {
214 246
     goDetail(){
215 247
 
216 248
     },
217
-    allotCustomer(){
249
+    allotCustomer(){//单个分配
218 250
       this.$nextTick(()=>{
219 251
         this.$refs.dialogPublic.dialogVisible = true
220 252
         this.dialogTitle = '分配'
@@ -223,14 +255,16 @@ export default {
223 255
       })
224 256
 
225 257
     },
226
-    remindCustomer(id,status){
258
+    remindCustomer(user_id,status){//单个提醒
227 259
       this.$nextTick(()=>{
228 260
         this.$refs.dialogPublic.dialogVisible = true
229 261
         this.dialogTitle = '提醒'
230 262
         this.dialogMsg = `如果员工长时间未${status == 1 ? '添加客户' : '通过好友申请可再次添加'},可通过企微助手再次提醒员工${status == 1 ? '添加' : '跟进'}客户,是否确认发送?`
263
+        this.user_ids = []
264
+        this.user_ids.push(user_id)
231 265
       })
232 266
     },
233
-    deleCustomer(){
267
+    deleCustomer(){//单个删除
234 268
       this.$alert('是否确定删除此客户', '提示', {
235 269
         cancelButtonText: '取消',
236 270
         confirmButtonText: '确定',
@@ -244,11 +278,12 @@ export default {
244 278
     init (page, type) {
245 279
       this.page = page ? page : this.page;
246 280
       this.loading = true
247
-      this.$axios.get(this.URL.BASEURL + this.URL.massMsg_lists, {
281
+      this.$axios.get(this.URL.BASEURL + this.URL.batchAddCustomerDetailsList, {
248 282
         params: {
249
-          creator_id: this.user_id_list,
250
-          send_time_start: this.add_date_start ? this.add_date_start + ' 00:00:00' : '',
251
-          send_time_end: this.add_date_end ? this.$day_format(this.$date_compatible(this.add_date_end + ' 24:00:00')) : '',
283
+          add_status:this.status==0?'':this.status,
284
+          keyword:this.input_keyword,
285
+          start_time: this.time[0],
286
+          end_time: this.time[1],
252 287
           page: this.page,
253 288
           page_size: this.page_size
254 289
         }

+ 8 - 26
project/src/components/marketingGuest/batchAddFriend/addFriend/setting.vue

@@ -31,14 +31,7 @@
31 31
                 </el-time-picker>
32 32
                 提醒管理员分配,
33 33
                 选择接收提醒管理员:
34
-                <el-select v-model="adminVal" filterable placeholder="请选择管理员" size="mini">
35
-                  <el-option
36
-                    v-for="item in options"
37
-                    :key="item.value"
38
-                    :label="item.label"
39
-                    :value="item.value">
40
-                  </el-option>
41
-                </el-select>
34
+                <self-customerservice title='选择成员' width="180px" :afferent_users='user_id_list' @customerDefine="(val)=>{user_id_list=val;}"></self-customerservice>
42 35
               </div>
43 36
             </template>
44 37
             <div class="splitLine"></div>
@@ -93,32 +86,20 @@
93 86
 </template>
94 87
 
95 88
 <script>
89
+import selfCustomerservice from '@/components/assembly/screen/customerService.vue'
96 90
 export default {
97 91
   name: "setting",
98 92
   props:['settingFlag'],
93
+  components:{
94
+    selfCustomerservice,
95
+  },
99 96
   data(){
100 97
     return{
98
+      user_id_list:[],
101 99
       dialogVisible:false,
102 100
       activeName:'first',
103 101
       noAllotVal:false,
104 102
       overDayVal:1,
105
-      options: [
106
-        {
107
-        value: '选项1',
108
-        label: '黄金糕'
109
-      }, {
110
-        value: '选项2',
111
-        label: '双皮奶'
112
-      }, {
113
-        value: '选项3',
114
-        label: '蚵仔煎'
115
-      }, {
116
-        value: '选项4',
117
-        label: '龙须面'
118
-      }, {
119
-        value: '选项5',
120
-        label: '北京烤鸭'
121
-      }],
122 103
       adminVal: '',
123 104
       nextDayTimeVal:'',
124 105
       noFollowUpVal:false,
@@ -142,7 +123,8 @@ export default {
142 123
         return
143 124
       }
144 125
 
145
-    }
126
+    },
127
+
146 128
   }
147 129
 }
148 130
 </script>

+ 86 - 49
project/src/components/marketingGuest/batchAddFriend/dataPreview/index.vue

@@ -1,11 +1,11 @@
1 1
 <template>
2 2
   <div style="padding-right: 15px">
3 3
     <date-picker title="" :quickFlag="true" :afferent_time="default_time" :clearFlag='false' @changeTime="changeTime"></date-picker>
4
-    <div class="dataPreview">
4
+    <div class="dataPreview" v-loading="dataLoading">
5 5
       <template v-for="item in overviewArrs">
6 6
         <div class="flex-align-center">
7 7
           <div class="box_item" >
8
-            <div class="num">{{item.num?item.num:'-'}}</div>
8
+            <div class="num">{{item.num || item.num==0?item.num:'-'}}</div>
9 9
             <div class="name">{{item.name?item.name:'-'}}</div>
10 10
             <div class="detial" @click="gooverviewDetial(item.id)" v-if="item.id!==5">详情</div>
11 11
           </div>
@@ -22,29 +22,56 @@
22 22
     </div>
23 23
 
24 24
     <!-- table -->
25
-    <el-table ref="multipleTable"
25
+    <el-table v-loading="loading" ref="multipleTable"
26 26
               :height='height'
27 27
               :data="tableData"
28 28
               tooltip-effect="dark"
29 29
               style="width: 100%">
30
-      <el-table-column prop="creator" label="成员" align="center" show-overflow-tooltip></el-table-column>
31
-      <el-table-column prop="send_time" min-width="120" label="分配客户数" show-overflow-tooltip align="center"></el-table-column>
32
-      <el-table-column prop="send_time" min-width="120" label="待添加客户数" show-overflow-tooltip align="center"></el-table-column>
33
-      <el-table-column prop="send_time" min-width="120" show-overflow-tooltip align="center">
30
+      <el-table-column label="成员" align="center" show-overflow-tooltip>
31
+        <template slot-scope="scope">
32
+          <div>{{scope.row.name ? scope.row.name : '-'}}</div>
33
+        </template>
34
+      </el-table-column>
35
+      <el-table-column min-width="120" label="分配客户数" show-overflow-tooltip align="center">
36
+        <template slot-scope="scope">
37
+          <div>{{scope.row.assign_count||scope.row.assign_count==0 ? scope.row.assign_count : '-'}}</div>
38
+        </template>
39
+      </el-table-column>
40
+      <el-table-column min-width="120" label="待添加客户数" show-overflow-tooltip align="center">
41
+        <template slot-scope="scope">
42
+          <div>{{scope.row.waiting_add_count||scope.row.waiting_add_count==0 ? scope.row.waiting_add_count : '-'}}</div>
43
+        </template>
44
+      </el-table-column>
45
+      <el-table-column min-width="120" show-overflow-tooltip align="center">
34 46
         <template #header>
35 47
           待通过客户数
36 48
           <el-tooltip class="disinblock" content="已发送好友申请,等待客户通过" placement="top">
37 49
             <i class="el-icon-question"></i>
38 50
           </el-tooltip>
39 51
         </template>
52
+        <template slot-scope="scope">
53
+          <div>{{scope.row.passed_count||scope.row.passed_count==0 ? scope.row.passed_count : '-'}}</div>
54
+        </template>
55
+      </el-table-column>
56
+      <el-table-column min-width="120" label="已添加客户数" show-overflow-tooltip align="center">
57
+        <template slot-scope="scope">
58
+          <div>{{scope.row.added_count||scope.row.added_count==0 ? scope.row.added_count : '-'}}</div>
59
+        </template>
60
+      </el-table-column>
61
+      <el-table-column min-width="120" label="回收客户数" show-overflow-tooltip align="center">
62
+        <template slot-scope="scope">
63
+          <div>{{scope.row.recycled_count||scope.row.recycled_count==0 ? scope.row.recycled_count : '-'}}</div>
64
+        </template>
65
+      </el-table-column>
66
+      <el-table-column min-width="120" label="添加完成率" show-overflow-tooltip align="center">
67
+        <template slot-scope="scope">
68
+          <div>{{scope.row.add_rate ? scope.row.add_rate : '-'}}</div>
69
+        </template>
40 70
       </el-table-column>
41
-      <el-table-column prop="send_time" min-width="120" label="已添加客户数" show-overflow-tooltip align="center"></el-table-column>
42
-      <el-table-column prop="send_time" min-width="120" label="回收客户数" show-overflow-tooltip align="center"></el-table-column>
43
-      <el-table-column prop="send_time" min-width="120" label="添加完成率" show-overflow-tooltip align="center"></el-table-column>
44 71
 
45 72
       <el-table-column label="操作" align="center">
46 73
         <template slot-scope="scope">
47
-          <div class="c-00B38A pointer" @click="goDetial(scope.row.rule_id)">详情</div>
74
+          <div class="c-00B38A pointer" @click="goDetial(scope.row.user_id)">详情</div>
48 75
         </template>
49 76
       </el-table-column>
50 77
     </el-table>
@@ -72,6 +99,7 @@ export default {
72 99
       default_time: [this.$getDay(-30, false), this.$getDay(0, false)],
73 100
       time: [],
74 101
       loading: false,
102
+      dataLoading: false,
75 103
       page: 1,
76 104
       pages: 0,
77 105
       total: 0,
@@ -82,48 +110,66 @@ export default {
82 110
           id:0,
83 111
           name:'导入总客户数',
84 112
           num:'',
85
-          key:'zong'
113
+          key:'import_count'
86 114
         },
87 115
         {
88
-          id:1,
116
+          id:4,
89 117
           name:'待分配客户数',
90 118
           num:'',
91
-          key:'daifenpei'
119
+          key:'assigned_count'
92 120
         },
93 121
         {
94
-          id:2,
122
+          id:1,
95 123
           name:'待添加客户数',
96 124
           num:'',
97
-          key:'daitianjia'
125
+          key:'waiting_add_count'
98 126
         },
99 127
         {
100
-          id:3,
128
+          id:2,
101 129
           name:'待通过客户数',
102 130
           num:'',
103
-          key:'daitonhhuo'
131
+          key:'passed_count'
104 132
         },
105 133
         {
106
-          id:4,
134
+          id:3,
107 135
           name:'已添加总客户数',
108 136
           num:'',
109
-          key:'yitianjia'
137
+          key:'added_count'
110 138
         },
111 139
         {
112 140
           id:5,
113 141
           name:'添加完成率',
114 142
           num:'',
115
-          key:'lv'
143
+          key:'added_rate'
116 144
         },
117 145
       ],
118 146
       user_id_list:[],
119
-      tableData:[]
147
+      tableData:[],
148
+      desCol: [
149
+        { prop: "name", label: "成员" },
150
+        { prop: "assign_count", label: "分配客户数" },
151
+        { prop: "waiting_add_count", label: "待添加客户数" },
152
+        { prop: "passed_count", label: "待通过客户数" },
153
+        { prop: "added_count", label: "已添加客户数" },
154
+        { prop: 'recycled_count', label: "回收客户数",  },
155
+        { prop: 'add_rate', label: "添加完成率",  },
156
+      ],
157
+
120 158
     }
121 159
   },
122 160
   created() {
123
-    this.height = document.documentElement.clientHeight - 320 > 400 ? document.documentElement.clientHeight - 320 : 400
161
+    this.height = document.documentElement.clientHeight - 300 > 400 ? document.documentElement.clientHeight - 300 : 400
162
+    this.time = this.default_time
163
+    this.init_predata()
164
+    this.init(1)
165
+  },
166
+  watch:{
167
+    user_id_list(){
168
+      this.init(1)
169
+    }
124 170
   },
125 171
   methods:{
126
-    goDetial(){
172
+    goDetial(id){
127 173
 
128 174
     },
129 175
     gooverviewDetial(id){
@@ -143,27 +189,18 @@ export default {
143 189
     },
144 190
     init_predata () {
145 191
       this.dataLoading = true
146
-      this.$axios.post(this.URL.BASEURL + this.URL.charge_pre_data, {
147
-        order_source: this.paySource_val,
148
-        start_date: this.time[0],
149
-        end_date: this.time[1],
192
+      this.$axios.get(this.URL.BASEURL + this.URL.batchAddCustomer_dataSummary, {
193
+         params:{
194
+           start_date: this.time[0],
195
+           end_date: this.time[1],
196
+         }
150 197
       })
151 198
         .then((res) => {
152 199
           var res = res.data
153 200
           this.dataLoading = false
154 201
           if (res && res.errno == 0) {
155
-            this.dataInfo_stat = res.rst.data.stat;
156
-            this.trendX = []
157
-            this.trendData.dds = []
158
-            this.trendData.zfje = []
159
-            res.rst.data.trend.forEach(i => {
160
-              this.trendX.push(i.ref_date)
161
-              this.trendData.dds.push(i.order_count)
162
-              this.trendData.zfje.push(i.pay_money)
163
-            })
164
-            this.trendData.key += 1
165
-            this.$nextTick(() => {
166
-              this.initCharts()
202
+            this.overviewArrs.forEach(item=>{
203
+              item.num = res.rst[item.key]
167 204
             })
168 205
           } else if (res.errno != 4002) {
169 206
             this.$message({
@@ -188,14 +225,14 @@ export default {
188 225
         }
189 226
       }
190 227
       this.loading = true
191
-      this.$axios.post(this.URL.BASEURL + this.URL.charge_list, {
192
-        order_source: this.paySource_val,
193
-        order_id: this.id_val,
194
-        start_date: this.time[0],
195
-        end_date: this.time[1],
196
-        pay_status: this.chargePay_val,
197
-        page: type == 'export' ? 1 : this.page,
198
-        pagesize: type == 'export' ? this.$store.state.exportNumber : this.page_size,
228
+      this.$axios.get(this.URL.BASEURL + this.URL.batchAddCustomer_statistic, {
229
+        params:{
230
+          user_id: this.user_id_list&&this.user_id_list.length>0?this.user_id_list.join():'',
231
+          start_date: this.time[0],
232
+          end_date: this.time[1],
233
+          page: type == 'export' ? 1 : this.page,
234
+          pagesize: type == 'export' ? this.$store.state.exportNumber : this.page_size,
235
+        }
199 236
       }).then((res) => {
200 237
         var res = res.data
201 238
         this.loading = false
@@ -255,7 +292,7 @@ export default {
255 292
     .num{
256 293
 font-weight: 600;
257 294
       color: #000;
258
-      font-size: 15px;
295
+      font-size: 18px;
259 296
     }
260 297
     .name{
261 298
 font-size: 12px;

+ 1 - 1
project/src/router/allRouter.js

@@ -119,7 +119,7 @@ export var allRouter = [
119 119
         }
120 120
       },
121 121
       {
122
-        path: 'importRecordDetial',
122
+        path: 'importRecordDetial/:id',
123 123
         name: 'batchAddFriend',
124 124
         component: importRecordDetial,
125 125
         meta: {

+ 4 - 0
qwh5/.browserslistrc

@@ -0,0 +1,4 @@
1
+> 1%
2
+last 2 versions
3
+not dead
4
+not ie 11

+ 5 - 0
qwh5/.editorconfig

@@ -0,0 +1,5 @@
1
+[*.{js,jsx,ts,tsx,vue}]
2
+indent_style = space
3
+indent_size = 2
4
+trim_trailing_whitespace = true
5
+insert_final_newline = true

+ 18 - 0
qwh5/.eslintrc.js

@@ -0,0 +1,18 @@
1
+module.exports = {
2
+  root: true,
3
+  env: {
4
+    node: true
5
+  },
6
+  extends: [
7
+    // 'plugin:vue/vue3-essential',
8
+    '@vue/standard',
9
+    '@vue/typescript/recommended'
10
+  ],
11
+  parserOptions: {
12
+    ecmaVersion: 2020
13
+  },
14
+  rules: {
15
+    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
16
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
17
+  }
18
+}

+ 23 - 0
qwh5/.gitignore

@@ -0,0 +1,23 @@
1
+.DS_Store
2
+node_modules
3
+/dist
4
+
5
+
6
+# local env files
7
+.env.local
8
+.env.*.local
9
+
10
+# Log files
11
+npm-debug.log*
12
+yarn-debug.log*
13
+yarn-error.log*
14
+pnpm-debug.log*
15
+
16
+# Editor directories and files
17
+.idea
18
+.vscode
19
+*.suo
20
+*.ntvs*
21
+*.njsproj
22
+*.sln
23
+*.sw?

+ 24 - 0
qwh5/README.md

@@ -0,0 +1,24 @@
1
+# qwh5
2
+
3
+## Project setup
4
+```
5
+npm install
6
+```
7
+
8
+### Compiles and hot-reloads for development
9
+```
10
+npm run serve
11
+```
12
+
13
+### Compiles and minifies for production
14
+```
15
+npm run build
16
+```
17
+
18
+### Lints and fixes files
19
+```
20
+npm run lint
21
+```
22
+
23
+### Customize configuration
24
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 5 - 0
qwh5/babel.config.js

@@ -0,0 +1,5 @@
1
+module.exports = {
2
+  presets: [
3
+    '@vue/cli-plugin-babel/preset'
4
+  ]
5
+}

File diff suppressed because it is too large
+ 1 - 0
qwh5/h5Pack/css/app.85dd6470.css


BIN
qwh5/h5Pack/favicon.ico


File diff suppressed because it is too large
+ 1 - 0
qwh5/h5Pack/index.html


+ 2 - 0
qwh5/h5Pack/js/about.76dda73f.js

@@ -0,0 +1,2 @@
1
+"use strict";(self["webpackChunkqwh5"]=self["webpackChunkqwh5"]||[]).push([[443],{4335:function(n,u,t){t.r(u),t.d(u,{default:function(){return f}});var a=t(3396);const e={class:"about"},r=(0,a._)("h1",null,"This is an about page",-1),s=[r];function c(n,u){return(0,a.wg)(),(0,a.iD)("div",e,s)}var i=t(89);const h={},o=(0,i.Z)(h,[["render",c]]);var f=o}}]);
2
+//# sourceMappingURL=about.76dda73f.js.map

File diff suppressed because it is too large
+ 1 - 0
qwh5/h5Pack/js/about.76dda73f.js.map


File diff suppressed because it is too large
+ 2 - 0
qwh5/h5Pack/js/app.5255912a.js


File diff suppressed because it is too large
+ 1 - 0
qwh5/h5Pack/js/app.5255912a.js.map


File diff suppressed because it is too large
+ 20 - 0
qwh5/h5Pack/js/chunk-vendors.ec43d46e.js


File diff suppressed because it is too large
+ 1 - 0
qwh5/h5Pack/js/chunk-vendors.ec43d46e.js.map


File diff suppressed because it is too large
+ 9553 - 0
qwh5/package-lock.json


+ 38 - 0
qwh5/package.json

@@ -0,0 +1,38 @@
1
+{
2
+  "name": "qwh5",
3
+  "version": "0.1.0",
4
+  "private": true,
5
+  "scripts": {
6
+    "serve": "vue-cli-service serve",
7
+    "build": "vue-cli-service build",
8
+    "lint": "vue-cli-service lint"
9
+  },
10
+  "dependencies": {
11
+    "core-js": "^3.8.3",
12
+    "element-plus": "^2.2.4",
13
+    "vue": "^3.2.13",
14
+    "vue-class-component": "^8.0.0-0",
15
+    "vue-router": "^4.0.3",
16
+    "vuex": "^4.0.0"
17
+  },
18
+  "devDependencies": {
19
+    "@typescript-eslint/eslint-plugin": "^5.4.0",
20
+    "@typescript-eslint/parser": "^5.4.0",
21
+    "@vue/cli-plugin-babel": "~5.0.0",
22
+    "@vue/cli-plugin-eslint": "~5.0.0",
23
+    "@vue/cli-plugin-router": "~5.0.0",
24
+    "@vue/cli-plugin-typescript": "~5.0.0",
25
+    "@vue/cli-plugin-vuex": "~5.0.0",
26
+    "@vue/cli-service": "~5.0.0",
27
+    "@vue/eslint-config-standard": "^6.1.0",
28
+    "@vue/eslint-config-typescript": "^9.1.0",
29
+    "eslint": "^7.32.0",
30
+    "eslint-plugin-import": "^2.25.3",
31
+    "eslint-plugin-node": "^11.1.0",
32
+    "eslint-plugin-promise": "^5.1.0",
33
+    "eslint-plugin-vue": "^8.0.3",
34
+    "sass": "^1.32.7",
35
+    "sass-loader": "^12.0.0",
36
+    "typescript": "~4.5.5"
37
+  }
38
+}

BIN
qwh5/public/favicon.ico


+ 17 - 0
qwh5/public/index.html

@@ -0,0 +1,17 @@
1
+<!DOCTYPE html>
2
+<html lang="">
3
+  <head>
4
+    <meta charset="utf-8">
5
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
7
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
8
+    <title><%= htmlWebpackPlugin.options.title %></title>
9
+  </head>
10
+  <body>
11
+    <noscript>
12
+      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
13
+    </noscript>
14
+    <div id="app"></div>
15
+    <!-- built files will be auto injected -->
16
+  </body>
17
+</html>

+ 26 - 0
qwh5/src/App.vue

@@ -0,0 +1,26 @@
1
+<template>
2
+  <router-view/>
3
+</template>
4
+
5
+<style lang="scss">
6
+#app {
7
+  font-family: Avenir, Helvetica, Arial, sans-serif;
8
+  -webkit-font-smoothing: antialiased;
9
+  -moz-osx-font-smoothing: grayscale;
10
+  //text-align: center;
11
+  color: #2c3e50;
12
+}
13
+
14
+nav {
15
+  padding: 30px;
16
+
17
+  a {
18
+    font-weight: bold;
19
+    color: #2c3e50;
20
+
21
+    &.router-link-exact-active {
22
+      color: #42b983;
23
+    }
24
+  }
25
+}
26
+</style>

BIN
qwh5/src/assets/logo.png


+ 65 - 0
qwh5/src/components/HelloWorld.vue

@@ -0,0 +1,65 @@
1
+<template>
2
+  <div class="hello">
3
+    <h1>{{ msg }}</h1>
4
+    <p>
5
+      For a guide and recipes on how to configure / customize this project,<br>
6
+      check out the
7
+      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
8
+    </p>
9
+    <h3>Installed CLI Plugins</h3>
10
+    <ul>
11
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
12
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li>
13
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-vuex" target="_blank" rel="noopener">vuex</a></li>
14
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
15
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-typescript" target="_blank" rel="noopener">typescript</a></li>
16
+    </ul>
17
+    <h3>Essential Links</h3>
18
+    <ul>
19
+      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
20
+      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
21
+      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
22
+      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
23
+      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
24
+    </ul>
25
+    <h3>Ecosystem</h3>
26
+    <ul>
27
+      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
28
+      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
29
+      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
30
+      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
31
+      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
32
+    </ul>
33
+  </div>
34
+</template>
35
+
36
+<script lang="ts">
37
+import { Options, Vue } from 'vue-class-component'
38
+
39
+@Options({
40
+  props: {
41
+    msg: String
42
+  }
43
+})
44
+export default class HelloWorld extends Vue {
45
+  msg!: string
46
+}
47
+</script>
48
+
49
+<!-- Add "scoped" attribute to limit CSS to this component only -->
50
+<style scoped lang="scss">
51
+h3 {
52
+  margin: 40px 0 0;
53
+}
54
+ul {
55
+  list-style-type: none;
56
+  padding: 0;
57
+}
58
+li {
59
+  display: inline-block;
60
+  margin: 0 10px;
61
+}
62
+a {
63
+  color: #42b983;
64
+}
65
+</style>

+ 8 - 0
qwh5/src/main.ts

@@ -0,0 +1,8 @@
1
+import { createApp } from 'vue'
2
+import App from './App.vue'
3
+import router from './router'
4
+import store from './store'
5
+// import ElementPlus from 'element-plus'
6
+// import 'element-plus/dist/index.css'
7
+
8
+createApp(App).use(router).use(store).mount('#app')

+ 25 - 0
qwh5/src/router/index.ts

@@ -0,0 +1,25 @@
1
+import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
2
+import HomeView from '../views/HomeView.vue'
3
+
4
+const routes: Array<RouteRecordRaw> = [
5
+  {
6
+    path: '/',
7
+    name: 'home',
8
+    component: HomeView
9
+  },
10
+  {
11
+    path: '/about',
12
+    name: 'about',
13
+    // route level code-splitting
14
+    // this generates a separate chunk (about.[hash].js) for this route
15
+    // which is lazy-loaded when the route is visited.
16
+    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
17
+  }
18
+]
19
+
20
+const router = createRouter({
21
+  history: createWebHistory(process.env.BASE_URL),
22
+  routes
23
+})
24
+
25
+export default router

+ 6 - 0
qwh5/src/shims-vue.d.ts

@@ -0,0 +1,6 @@
1
+/* eslint-disable */
2
+declare module '*.vue' {
3
+  import type { DefineComponent } from 'vue'
4
+  const component: DefineComponent<{}, {}, any>
5
+  export default component
6
+}

+ 14 - 0
qwh5/src/store/index.ts

@@ -0,0 +1,14 @@
1
+import { createStore } from 'vuex'
2
+
3
+export default createStore({
4
+  state: {
5
+  },
6
+  getters: {
7
+  },
8
+  mutations: {
9
+  },
10
+  actions: {
11
+  },
12
+  modules: {
13
+  }
14
+})

+ 5 - 0
qwh5/src/views/AboutView.vue

@@ -0,0 +1,5 @@
1
+<template>
2
+  <div class="about">
3
+    <h1>This is an about page</h1>
4
+  </div>
5
+</template>

+ 149 - 0
qwh5/src/views/HomeView.vue

@@ -0,0 +1,149 @@
1
+<template>
2
+  <div class="home">
3
+    <div class="tipsBox">管理员{{adminName}}给你分配了{{customeNum}}个客户还未添加,快去复制电话号码添加客户吧,管理员在微伴后台可查看添加状态哦~</div>
4
+    <div class="operateArea">
5
+      <div>
6
+        添加状态:
7
+        <el-select v-model="value" class="m-2" placeholder="请选择">
8
+          <el-option
9
+            v-for="item in addStatusArrs"
10
+            :key="item.value"
11
+            :label="item.label"
12
+            :value="item.value"
13
+          />
14
+        </el-select>
15
+      </div>
16
+      <el-button plain @click="value = 0">重置</el-button>
17
+    </div>
18
+    <div class="splitLine"></div>
19
+    <div class="tableArea">
20
+      <div class="title_span"><span class="iconLable"></span> 共{{customeNum}}个客户</div>
21
+
22
+      <div class="table">
23
+        <div class="table_header">
24
+          <div>客户电话</div>
25
+          <div>添加状态</div>
26
+          <div>操作</div>
27
+        </div>
28
+        <div class="table_body" v-for="(item,index) in tableData" :key="index">
29
+          <div>{{item.phoneNum?item.phoneNum:'-'}}</div>
30
+          <div>{{item.status==1?'已添加':'未添加'}}</div>
31
+          <div><span class="copy" @click="goAddCustomer">复制</span></div>
32
+        </div>
33
+      </div>
34
+    </div>
35
+  </div>
36
+</template>
37
+
38
+<script lang="ts">
39
+import { Vue } from 'vue-class-component'
40
+export default class HomeView extends Vue {
41
+  adminName = '刘晓娜'
42
+  customeNum = 1
43
+  value=''
44
+  tableData = [
45
+    {
46
+      phoneNum: '1264988309',
47
+      status:1
48
+    },
49
+    {
50
+      phoneNum: '12649883019',
51
+      status:2
52
+    },
53
+    {
54
+      phoneNum: '12649883209',
55
+      status:3
56
+    },
57
+    {
58
+      phoneNum: '126498t8309',
59
+      status:1
60
+    }
61
+  ]
62
+  addStatusArrs = [
63
+    {
64
+      value: '0',
65
+      label: '全部'
66
+    },
67
+    {
68
+      value: '1',
69
+      label: '待添加'
70
+    },
71
+    {
72
+      value: '2',
73
+      label: '待通过'
74
+    },
75
+    {
76
+      value: '3',
77
+      label: '已添加'
78
+    }
79
+  ]
80
+
81
+
82
+  goAddCustomer(){
83
+    console.log(111,'复制了')
84
+  }
85
+}
86
+</script>
87
+<style lang="scss" scoped>
88
+.home{
89
+  padding: 10px 20px;
90
+  .tipsBox{
91
+    padding: 10px;
92
+    font-size: 14px;
93
+    line-height: 18px;
94
+    background-color: #fff7ee;
95
+    color: #b8733d;
96
+  }
97
+  .operateArea{
98
+    display: flex;
99
+    align-items: center;
100
+    justify-content: space-between;
101
+    padding: 10px 0;
102
+  }
103
+  .splitLine{
104
+    width: 100%;
105
+    height: 10px;
106
+    background-color: #eee;
107
+    margin: 10px 0;
108
+  }
109
+  .tableArea{
110
+    .title_span{
111
+      font-weight: 600;
112
+      color: #000;
113
+      margin: 10px 0;
114
+      .iconLable{
115
+        display: inline-block;
116
+        width: 5px;
117
+        height: 15px;
118
+        background-color: #42b983;
119
+        margin-right: 2px;
120
+
121
+      }
122
+    }
123
+    .table{
124
+      border: 1px solid #ddd;
125
+      font-size: 14px;
126
+      .table_header{
127
+        background:#eef9ff;
128
+        color:#999;
129
+      }
130
+      .table_header,.table_body{
131
+        display: flex;
132
+        align-items: center;
133
+        padding: 10px 0;
134
+        div{
135
+          width: 33%;
136
+          text-align: center;
137
+          .copy{
138
+            color: #4d8feb;
139
+            padding: 4px 8px;
140
+            border: 1px solid #4d8feb;
141
+            border-radius: 4px;
142
+            cursor: pointer;
143
+          }
144
+        }
145
+      }
146
+    }
147
+  }
148
+}
149
+</style>

+ 41 - 0
qwh5/tsconfig.json

@@ -0,0 +1,41 @@
1
+{
2
+  "compilerOptions": {
3
+    "target": "esnext",
4
+    "module": "esnext",
5
+    "strict": true,
6
+    "jsx": "preserve",
7
+    "moduleResolution": "node",
8
+    "experimentalDecorators": true,
9
+    "skipLibCheck": true,
10
+    "esModuleInterop": true,
11
+    "allowSyntheticDefaultImports": true,
12
+    "forceConsistentCasingInFileNames": true,
13
+    "useDefineForClassFields": true,
14
+    "sourceMap": true,
15
+    "baseUrl": ".",
16
+    "types": [
17
+      "webpack-env"
18
+    ],
19
+    "paths": {
20
+      "@/*": [
21
+        "src/*"
22
+      ]
23
+    },
24
+    "lib": [
25
+      "esnext",
26
+      "dom",
27
+      "dom.iterable",
28
+      "scripthost"
29
+    ]
30
+  },
31
+  "include": [
32
+    "src/**/*.ts",
33
+    "src/**/*.tsx",
34
+    "src/**/*.vue",
35
+    "tests/**/*.ts",
36
+    "tests/**/*.tsx"
37
+  ],
38
+  "exclude": [
39
+    "node_modules"
40
+  ]
41
+}

+ 6 - 0
qwh5/vue.config.js

@@ -0,0 +1,6 @@
1
+const { defineConfig } = require('@vue/cli-service')
2
+module.exports = defineConfig({
3
+  transpileDependencies: true,
4
+  lintOnSave: false,
5
+  outputDir:'h5Pack'
6
+})