From eb5b0cd3e99caa28f1be06340fb8d888388a8959 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期三, 03 九月 2025 16:14:26 +0800
Subject: [PATCH] 用户消费金额与总订单数,按标签过滤会员,订单列表会员名称与导出

---
 manager/src/api/order.js                       |    3 +
 manager/src/views/member/list/index.vue        |   25 ++++++++++--
 manager/src/views/order/order/orderList.vue    |   16 ++++++-
 manager/src/views/video/VideoList.vue          |   13 +++---
 manager/src/views/member/list/memberDetail.vue |   33 +++++++++++++++-
 manager/src/api/member.js                      |   15 +++++++
 6 files changed, 88 insertions(+), 17 deletions(-)

diff --git a/manager/src/api/member.js b/manager/src/api/member.js
index 6f101df..040bb2b 100644
--- a/manager/src/api/member.js
+++ b/manager/src/api/member.js
@@ -37,7 +37,20 @@
 
 //  鑾峰彇浼氬憳鍒楄〃
 export const getMemberListData = (params) => {
-  return getRequest("/passport/member", params);
+  const processedParams = new URLSearchParams();
+
+  Object.entries(params).forEach(([key, value]) => {
+    if (key === 'tagIds' && Array.isArray(value)) {
+      // 濡傛灉鏄痶agIds鏁扮粍锛屼负姣忎釜鍏冪礌娣诲姞[]鍚庣紑
+      value.forEach(tagId => {
+        processedParams.append('tagIds[]', tagId);
+      });
+    } else {
+      processedParams.append(key, value);
+    }
+  });
+
+  return getRequest(`/passport/member?${processedParams.toString()}`);
 };
 
 //  鑾峰彇浼氬憳璇︽儏
diff --git a/manager/src/api/order.js b/manager/src/api/order.js
index 340dbc9..6d523ed 100644
--- a/manager/src/api/order.js
+++ b/manager/src/api/order.js
@@ -6,6 +6,9 @@
   deleteRequest
 } from '@/libs/axios';
 
+export const countByIdOrder = (id) =>{
+  return getRequest(`/order/order/countOrder/${id}`,)
+}
 
 //  浜ょ敱鍟嗗鐢宠瘔
 export const storeComplain = (params) => {
diff --git a/manager/src/views/member/list/index.vue b/manager/src/views/member/list/index.vue
index e930b40..fae9bd4 100644
--- a/manager/src/views/member/list/index.vue
+++ b/manager/src/views/member/list/index.vue
@@ -14,6 +14,12 @@
           <Form-item label="鑱旂郴鏂瑰紡" prop="mobile">
             <Input type="text" v-model="searchForm.mobile" placeholder="璇疯緭鍏ヤ細鍛樿仈绯绘柟寮�" clearable style="width: 200px" />
           </Form-item>
+          <Form-item label="鐢ㄦ埛鏍囩" prop="tags">
+            <Select v-model="searchForm.tagIds" multiple filterable :loading="selectLoading" style="width:200px;">
+              <Option v-for="item in options" :key="item.id" :label="item.tagName" :value="item.id"></Option>
+            </Select>
+          </Form-item>
+
           <Button @click="handleSearch" class="search-btn" type="primary" icon="ios-search">鎼滅储</Button>
         </Form>
       </Row>
@@ -73,6 +79,9 @@
             <Option v-for="item in options" :key="item.id" :label="item.tagName" :value="item.id"></Option>
           </Select>
         </FormItem>
+        <FormItem label="鐢ㄦ埛鑷畾涔夋爣绛�" prop="customerTags">
+          <span class="inf0o" v-for="(item,index) in memberTags" :key="index">{{item.tagName}}<span v-if="index < memberTags.length - 1">, </span></span>
+        </FormItem>
         <FormItem label="鎬у埆" prop="sex">
           <RadioGroup type="button" button-style="solid" v-model="form.sex">
             <Radio :label="1">
@@ -91,10 +100,7 @@
         </FormItem>
         <FormItem label="鎵�鍦ㄥ湴" prop="mail">
           {{ form.region || '鏆傛棤鍦板潃' }}
-
-
           <Button style="margin-left: 10px;" @click="$refs.map.open()">閫夋嫨</Button>
-
         </FormItem>
       </Form>
     </Modal>
@@ -111,6 +117,7 @@
 import ossManage from "@/views/sys/oss-manage/ossManage";
 import * as RegExp from "@/libs/RegExp.js";
 import { getTags } from "@/api/tag.js";
+import { detailById } from "@/api/memberCustomerTag.js"
 
 export default {
   name: "member",
@@ -120,6 +127,7 @@
   },
   data() {
     return {
+      memberTags:[],
       defaultPic: require('@/assets/default.png'),
       descTitle: "", // modal鏍囬
       descFlag: false, //缂栬緫鏌ョ湅妗�
@@ -143,6 +151,7 @@
         username: "",
         mobile: "",
         disabled: "OPEN",
+        tagIds:[],
       },
       picModelFlag: false, // 閫夋嫨鍥剧墖
       form: {}, // 琛ㄥ崟鏁版嵁
@@ -330,6 +339,13 @@
     },
   },
   methods: {
+    getMemberTags(id){
+      detailById(id).then(res =>{
+        if (res.code === 200){
+          this.memberTags = res.data;
+        }
+      });
+    },
     // 鍥炶皟缁欑埗绾�
     callback(val, index) {
       this.selectMember.forEach(item => { item.___selected = false })
@@ -387,9 +403,10 @@
     },
     //鏌ョ湅璇︽儏淇敼
     editPerm(val) {
+      this.form = {};
       this.descTitle = `鏌ョ湅鐢ㄦ埛 ${val.username}`;
       this.descFlag = true;
-
+      this.getMemberTags(val.id);
       this.getMemberInfo(val.id);
     },
     addMember() {
diff --git a/manager/src/views/member/list/memberDetail.vue b/manager/src/views/member/list/memberDetail.vue
index c00065b..4380387 100644
--- a/manager/src/views/member/list/memberDetail.vue
+++ b/manager/src/views/member/list/memberDetail.vue
@@ -20,7 +20,7 @@
               </div>
             </div>
             <div class="bottom-info">
-              <p>涓婃鐧诲綍 {{memberInfo.lastLoginDate}}&nbsp;
+              <p>涓婃鐧诲綍 {{memberInfo.lastLoginDate}}&nbsp;</p>
               <p>
                 <i-switch size="large" v-model="memberInfo.disabled" :true-value="true" :false-value="false"
                           @on-change="memberStatusChange">
@@ -56,15 +56,34 @@
                   class="info">鏆傛湭瀹屽杽</span>
             <span v-else class="info">{{memberInfo.region}}</span>
           </p>
+
+        </div>
+        <div class="ant-col-md-6">
           <p class="item">
             <span class="label">娉ㄥ唽鏃堕棿锛�</span>
             <span class="info">{{memberInfo.createTime}}</span>
           </p>
           <p class="item">
             <span class="label">鐢ㄦ埛鑷畾涔夋爣绛撅細</span>
-            <span class="inf0o" v-for="(item,index) in memberTags" :key="index">{{item.tagName}}<span v-if="index < memberTags.length - 1">, </span></span>
+            <span  v-for="(item,index) in memberTags" :key="index">{{item.tagName}}<span v-if="index < memberTags.length - 1">, </span></span>
+          </p>
+          <p class="item">
+            <span class="label">鎬诲畬鎴愯鍗曟暟锛�</span>
+            <span class="info">{{orderNumCount}}</span>
+          </p>
+          <p class="item">
+            <span class="label">鎬绘秷璐归噾棰濓細</span>
+            <span class="info">{{orderPriceCount}}</span>
+          </p>
+          <p class="item">
+            <span class="label">绯荤粺鏍囩锛�</span>
+            <span  v-for="(item,index) in memberInfo.tags" :key="index">{{item.tagName}}<span v-if="index < memberInfo.tags.length - 1">, </span></span>
           </p>
         </div>
+        <div>
+
+        </div>
+
       </div>
     </Card>
 
@@ -369,6 +388,7 @@
   import multipleMap from "@/components/map/multiple-map";
   import * as RegExp from '@/libs/RegExp.js';
   import * as API_Order from "@/api/order.js";
+  import {countByIdOrder} from "../../../api/order";
 
   export default {
     name: "memberDetail",
@@ -382,6 +402,8 @@
         id: "",//浼氬憳id
         loading: true, // 琛ㄥ崟鍔犺浇鐘舵��
         memberInfo: {},//浼氬憳淇℃伅
+        orderPriceCount:0,
+        orderNumCount:0,
         memberWalletInfo: {},//浼氬憳棰勫瓨娆句俊鎭�
         addressModalTitle: "",//浼氬憳鍦板潃鎿嶄綔鏍囬
         addressModalVisible: false, //浼氬憳鍦板潃鎿嶄綔寮瑰嚭妗�
@@ -847,6 +869,7 @@
     methods: {
 
       init() {
+        this.getCountOrderPrice();
         //鏌ヨ浼氬憳淇℃伅
         this.getMemberInfo();
         //鏌ヨ浼氬憳鐨勫巻鍙茬Н鍒嗘暟鎹�
@@ -860,6 +883,12 @@
           }
         });
       },
+      getCountOrderPrice(){
+        API_Order.countByIdOrder(this.id).then(res =>{
+          this.$set(this, "orderPriceCount", res.result.orderPriceCount);
+          this.$set(this, "orderNumCount", res.result.orderNumCount);
+        })
+      },
       //浼氬憳淇℃伅tab鏀瑰彉浜嬩欢
       memberInfoChange(v) {
         if (v == "point") {
diff --git a/manager/src/views/order/order/orderList.vue b/manager/src/views/order/order/orderList.vue
index 9c855c5..1161466 100644
--- a/manager/src/views/order/order/orderList.vue
+++ b/manager/src/views/order/order/orderList.vue
@@ -18,11 +18,20 @@
             style="width: 160px"
           />
         </Form-item>
-        <Form-item label="浼氬憳鍚嶇О" prop="buyerName">
+<!--        <Form-item label="浼氬憳鍚嶇О" prop="buyerName">-->
+<!--          <Input-->
+<!--            type="text"-->
+<!--            v-model="searchForm.buyerName"-->
+<!--            placeholder="璇疯緭鍏ヤ細鍛樺悕绉�"-->
+<!--            clearable-->
+<!--            style="width: 160px"-->
+<!--          />-->
+<!--        </Form-item>-->
+        <Form-item label="浼氬憳鏄电О" prop="nickName">
           <Input
             type="text"
-            v-model="searchForm.buyerName"
-            placeholder="璇疯緭鍏ヤ細鍛樺悕绉�"
+            v-model="searchForm.nickName"
+            placeholder="璇疯緭鍏ヤ細鍛樻樀绉�"
             clearable
             style="width: 160px"
           />
@@ -258,6 +267,7 @@
         orderType: "",
         orderSn: "",
         buyerName: "",
+        nickName:"",
         orderStatus: "",
       },
       selectDate: null,
diff --git a/manager/src/views/video/VideoList.vue b/manager/src/views/video/VideoList.vue
index e3aa4b1..7529244 100644
--- a/manager/src/views/video/VideoList.vue
+++ b/manager/src/views/video/VideoList.vue
@@ -259,13 +259,13 @@
         :title="playVideoTitle"
         width="800"
         :mask-closable="false"
-        @close="playVideoClose"
+        @on-cancel="playVideoClose"
       >
         <div class="video-warp">
           <video :src="playVideoUrl" autoplay controls style="width: 768px;height: 432px"/>
         </div>
         <div slot="footer">
-          <Button type="text" @click="playVideoClose">鍏抽棴</Button>
+          <Button type="text" @click="playVideoClose">鍏抽棴1</Button>
         </div>
       </Modal>
 
@@ -1067,11 +1067,10 @@
       this.upLoadVideoShow = false;
     },
     submitVideoUpload() {
-      console.log(this.uploadVideoForm.coverUrl)
-      if (this.uploadVideoForm.coverUrl === null || this.uploadVideoForm.coverUrl === undefined) {
-        this.$Message.error('鏍囬涓嶈兘涓虹┖');
-        return;
-      }
+      // if (this.uploadVideoForm.coverUrl === null || this.uploadVideoForm.coverUrl === undefined) {
+      //   this.$Message.error('灏侀潰涓嶈兘涓虹┖');
+      //   return;
+      // }
       this.uploadVideoForm.goodsList = this.uploadVideoForm.goodsList.filter(item => {
         return item.goodsNum > 0;
       })

--
Gitblit v1.8.0