浏览代码

Merge remote-tracking branch 'origin/master'

yfh 1 月之前
父节点
当前提交
daea2b3063

+ 8 - 0
src/api/store/storeOrder.js

@@ -145,3 +145,11 @@ export function uploadCredentials(data) {
   })
 }
 
+//获取制单类型
+export function getCreateOrderType() {
+  return request({
+    url: '/store/storeOrder/getCreateOrderType',
+    method: 'get'
+  })
+}
+

+ 19 - 0
src/api/users/user.js

@@ -88,3 +88,22 @@ export function enabledUsers(data) {
     data: data
   })
 }
+
+
+// 黑名单
+export function blacklist(query) {
+  return request({
+    url: '/users/user/blacklist',
+    method: 'get',
+    params: query
+  })
+}
+
+// 批量解禁
+export function enabledBlackUsers(data) {
+  return request({
+    url: '/users/user/enabledBlackUsers',
+    method: 'post',
+    data: data
+  })
+}

+ 42 - 29
src/views/company/companyApply/index.vue

@@ -55,7 +55,7 @@
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -65,9 +65,9 @@
     />
 
     <!-- 详情对话框 -->
-    <el-dialog 
-      title="申请详情" 
-      :visible.sync="detailsVisible" 
+    <el-dialog
+      title="申请详情"
+      :visible.sync="detailsVisible"
       width="50%"
       :close-on-click-modal="false"
       custom-class="apply-details-dialog"
@@ -93,21 +93,26 @@
           </el-tag>
         </div>
       </div>
-      
+
       <!-- 用户列表 -->
       <div class="details-content">
         <div class="content-title">变更用户列表</div>
-        <el-table 
-          :data="selectedUsers" 
-          border 
+        <el-table
+          :data="selectedUsers"
+          border
           style="width: 100%"
           :header-cell-style="{background:'#f5f7fa',color:'#606266'}"
         >
+          <el-table-column prop="projectId" label="项目" align="center">
+            <template slot-scope="scope">
+              <el-tag v-if="scope.row.projectId !== null">{{ getProjectLabel(scope.row.projectId) }}</el-tag>
+            </template>
+          </el-table-column>
           <el-table-column prop="userId" label="用户ID" align="center"></el-table-column>
           <el-table-column prop="userName" label="姓名" align="center"></el-table-column>
         </el-table>
       </div>
-      
+
       <!-- 底部操作区 -->
       <div class="details-footer">
         <el-button @click="detailsVisible = false">关闭</el-button>
@@ -115,9 +120,9 @@
     </el-dialog>
 
     <!-- 审核对话框 -->
-    <el-dialog 
-      title="审核申请" 
-      :visible.sync="auditVisible" 
+    <el-dialog
+      title="审核申请"
+      :visible.sync="auditVisible"
       width="40%"
       :close-on-click-modal="false"
       custom-class="audit-dialog"
@@ -136,8 +141,8 @@
             <el-radio :label="2">拒绝</el-radio>
           </el-radio-group>
         </el-form-item>
-        <el-form-item 
-          label="拒绝原因" 
+        <el-form-item
+          label="拒绝原因"
           prop="reason"
           v-if="auditForm.status === 2"
         >
@@ -149,7 +154,7 @@
           ></el-input>
         </el-form-item>
       </el-form>
-      
+
       <!-- 底部操作区 -->
       <div class="audit-footer">
         <el-button @click="auditVisible = false">取 消</el-button>
@@ -214,10 +219,14 @@ export default {
         reason: [
           { required: true, message: "请输入拒绝原因", trigger: "blur" }
         ]
-      }
+      },
+      projectOptions: [],
     };
   },
   created() {
+    this.getDicts("sys_course_project").then(response => {
+      this.projectOptions = response.data;
+    });
     this.getList();
   },
   methods: {
@@ -267,7 +276,7 @@ export default {
           if (this.auditForm.status === 1) {
             this.auditForm.reason = '';
           }
-          
+
           this.submitLoading = true;
           auditApply(this.auditForm).then(response => {
             this.msgSuccess("审核成功");
@@ -280,7 +289,11 @@ export default {
           });
         }
       });
-    }
+    },
+    /** 获取项目对应名称 */
+    getProjectLabel(projectId) {
+      return this.projectOptions.find(item => parseInt(item.dictValue) === projectId)?.dictLabel;
+    },
   }
 };
 </script>
@@ -291,7 +304,7 @@ export default {
   ::v-deep .el-dialog__body {
     padding: 20px;
   }
-  
+
   /* 头部信息样式 */
   .details-header {
     display: flex;
@@ -300,20 +313,20 @@ export default {
     background-color: #f8f9fa;
     border-radius: 4px;
     margin-bottom: 20px;
-    
+
     .info-item {
       width: 50%;
       margin-bottom: 10px;
       display: flex;
       align-items: center;
-      
+
       .label {
         color: #606266;
         font-size: 14px;
         width: 100px;
         text-align: right;
       }
-      
+
       .value {
         color: #303133;
         font-size: 14px;
@@ -321,7 +334,7 @@ export default {
       }
     }
   }
-  
+
   /* 内容区域样式 */
   .details-content {
     .content-title {
@@ -333,7 +346,7 @@ export default {
       border-left: 3px solid #409EFF;
     }
   }
-  
+
   /* 底部样式 */
   .details-footer {
     margin-top: 20px;
@@ -352,7 +365,7 @@ export default {
       font-weight: bold;
     }
   }
-  
+
   .el-table__body-wrapper {
     tr:hover > td {
       background-color: #f5f7fa;
@@ -365,21 +378,21 @@ export default {
   ::v-deep .el-dialog__body {
     padding: 20px;
   }
-  
+
   /* 表单样式 */
   .el-form {
     padding: 20px 0;
-    
+
     .el-form-item {
       margin-bottom: 20px;
-      
+
       span {
         color: #606266;
         font-size: 14px;
       }
     }
   }
-  
+
   /* 底部样式 */
   .audit-footer {
     margin-top: 20px;

+ 30 - 7
src/views/crm/customer/index.vue

@@ -224,11 +224,7 @@
                 <el-tag prop="status" v-for="(item, index) in sourceOptions"    v-if="scope.row.source==item.dictValue">{{item.dictLabel}}</el-tag>
             </template>
           </el-table-column>
-          <el-table-column  label="跟进阶段"  width="200" align="center" prop="visitStatus">
-            <template slot-scope="scope">
-                <el-tag prop="visitStatus" v-for="(item, index) in visitStatusOptions"    v-if="scope.row.visitStatus==item.dictValue">{{item.dictLabel}}</el-tag>
-              </template>
-          </el-table-column>
+         
           <el-table-column  label="客户类型"  width="200" align="center" prop="customerLevel">
             <template slot-scope="scope">
                 <el-tag v-for="(item, index) in customerLevelOptions"    v-if="scope.row.customerLevel===item.dictValue">{{item.dictLabel}}</el-tag>
@@ -243,10 +239,29 @@
           </el-table-column>
           <el-table-column  label="认领人"  align="center" prop="companyUserNickName" :show-overflow-tooltip="true">
           </el-table-column>
-          <el-table-column label="最后一次跟进时间" align="center" prop="receiveTime" width="180">
-          </el-table-column>
+          <!-- <el-table-column label="最后一次跟进时间" align="center" prop="receiveTime" width="180"> -->
+          <!-- </el-table-column> -->
           <el-table-column label="入公海时间" align="center" prop="poolTime" width="180">
           </el-table-column>
+          <el-table-column label="成交总价" align="center" prop="payMoney"/>
+          <el-table-column label="成交类型" align="center" prop="orderType">
+            <template slot-scope="scope">
+              <el-tag v-for="item in orderTypeOptions"  v-if="scope.row.orderType === item.dictValue">{{item.dictLabel}}</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="最新下单时间" align="center" prop="orderTime" width="180"></el-table-column>
+          <el-table-column  label="跟进阶段"  width="200" align="center" prop="visitStatus">
+            <template slot-scope="scope">
+                <el-tag prop="visitStatus" v-for="(item, index) in visitStatusOptions"    v-if="scope.row.visitStatus==item.dictValue">{{item.dictLabel}}</el-tag>
+              </template>
+          </el-table-column>
+          <el-table-column label="跟进类型" align="center" prop="visitType">
+            <template slot-scope="scope">
+              <el-tag v-for="item in visitTypeOptions"  v-if="scope.row.visitType === item.dictValue">{{item.dictLabel}}</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="跟进内容" align="center" prop="visitContent"/>
+          <el-table-column label="最新跟进时间" align="center" prop="visitTime" width="180"></el-table-column>
           <el-table-column label="操作"   align="center" fixed="right" width="120px" class-name="small-padding fixed-width">
             <template slot-scope="scope">
               <!-- <el-button
@@ -393,6 +408,8 @@ export default {
         title:"分配历史记录",
         open:false,
       },
+      orderTypeOptions: [],
+      visitTypeOptions:[],
       visitStatusOptions:[],
       customerSource:{
           open:false,
@@ -519,6 +536,12 @@ export default {
     },
   },
   created() {
+    this.getDicts("store_order_type").then((response) => {
+      this.orderTypeOptions = response.data;
+    });
+    this.getDicts("crm_customer_visit_type").then((response) => {
+      this.visitTypeOptions = response.data;
+    });
     this.getDicts("crm_customer_user_status").then((response) => {
       this.visitStatusOptions = response.data;
     });

+ 14 - 1
src/views/crm/customer/my.vue

@@ -271,10 +271,19 @@
       </el-table-column>
       <el-table-column label="进线客户详情" align="center" :show-overflow-tooltip="true" prop="registerDesc" />
       <el-table-column label="最新跟进时间" align="center" prop="lastTime" />
+      <el-table-column label="跟进内容" align="center" prop="visitContent"/>
       <el-table-column label="领取时间" align="center" prop="receiveTime" />
       <el-table-column label="进线客户提交日期" align="center" prop="registerSubmitTime" />
-      <el-table-column label="创建时间" align="center" prop="customerCreateTime" width="180">
+      <el-table-column label="创建时间" align="center" prop="customerCreateTime" width="180"> </el-table-column>
+      <el-table-column label="成交总价" align="center" prop="payMoney"/>
+      <el-table-column label="成交类型" align="center" prop="orderType">
+        <template slot-scope="scope">
+          <el-tag v-for="item in orderTypeOptions"  v-if="scope.row.orderType === item.dictValue">{{item.dictLabel}}</el-tag>
+        </template>
       </el-table-column>
+      <el-table-column label="最新下单时间" align="center" prop="orderTime" width="180"></el-table-column>
+   
+     
       <el-table-column label="操作"   align="center" fixed="right" width="120px" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
@@ -450,6 +459,7 @@ export default {
       tags:[],
       inputVisible: false,
       inputValue: '',
+      orderTypeOptions: [],
       statusOptions:[],
       typeOptions:[],
       sourceOptions:[],
@@ -534,6 +544,9 @@ export default {
     };
   },
   created() {
+    this.getDicts("store_order_type").then((response) => {
+      this.orderTypeOptions = response.data;
+    });
     this.getDicts("crm_customer_source").then((response) => {
       this.sourceOptions = response.data;
     });

+ 27 - 3
src/views/member/list.vue

@@ -2,6 +2,16 @@
   <div class="app-container">
     <!-- Search Form -->
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="项目" prop="projectId">
+        <el-select  v-model="queryParams.projectId" placeholder="请选择项目" clearable size="small" >
+          <el-option
+            v-for="item in projectOptions"
+            :key="item.dictValue"
+            :label="item.dictLabel"
+            :value="item.dictValue"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item label="会员ID" prop="userId">
         <el-input
           style="width: 200px"
@@ -144,6 +154,11 @@
     <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange" border>
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="ID" align="center" prop="userId" />
+      <el-table-column label="项目" align="center" prop="projectId">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.projectId !== null">{{ getProjectLabel(scope.row.projectId) }}</el-tag>
+        </template>
+      </el-table-column>
       <el-table-column label="昵称" align="center" prop="nickname" />
       <el-table-column label="头像" align="center" width="80">
         <template slot-scope="scope">
@@ -342,7 +357,8 @@ export default {
         missCourseStatus: "0",
         continueMissCourseSort: "0",
         registerStartTime: null,
-        registerEndTime: null
+        registerEndTime: null,
+        projectId: null,
       },
       // 表单参数
       form: {},
@@ -358,7 +374,8 @@ export default {
         status: [
           { required: true, message: "状态不能为空", trigger: "change" }
         ]
-      }
+      },
+      projectOptions: []
     };
   },
   created() {
@@ -366,6 +383,9 @@ export default {
     this.getDicts("user_status").then(response => {
       this.statusOptions = response.data;
     });
+    this.getDicts("sys_course_project").then(response => {
+      this.projectOptions = response.data;
+    });
     this.getTagOptions();
     this.getSalesOptions();
   },
@@ -590,7 +610,11 @@ export default {
           }
         });
       }).catch(() => {});
-    }
+    },
+    /** 获取项目对应名称 */
+    getProjectLabel(projectId) {
+      return this.projectOptions.find(item => parseInt(item.dictValue) === projectId)?.dictLabel;
+    },
   }
 };
 </script>

+ 27 - 3
src/views/member/myList.vue

@@ -2,6 +2,16 @@
   <div class="app-container">
     <!-- Search Form -->
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="项目" prop="projectId">
+        <el-select  v-model="queryParams.projectId" placeholder="请选择项目" clearable size="small" >
+          <el-option
+            v-for="item in projectOptions"
+            :key="item.dictValue"
+            :label="item.dictLabel"
+            :value="item.dictValue"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item label="昵称" prop="nickname">
         <el-input
           style="width: 200px"
@@ -134,6 +144,11 @@
     <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange" border>
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="ID" align="center" prop="userId" />
+      <el-table-column label="项目" align="center" prop="projectId">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.projectId !== null">{{ getProjectLabel(scope.row.projectId) }}</el-tag>
+        </template>
+      </el-table-column>
       <el-table-column label="昵称" align="center" prop="nickname" />
       <el-table-column label="头像" align="center" width="80">
         <template slot-scope="scope">
@@ -305,7 +320,8 @@ export default {
         missCourseStatus: "0",
         continueMissCourseSort: "0",
         registerStartTime: null,
-        registerEndTime: null
+        registerEndTime: null,
+        projectId: null,
       },
       // 表单参数
       form: {},
@@ -321,7 +337,8 @@ export default {
         status: [
           { required: true, message: "状态不能为空", trigger: "change" }
         ]
-      }
+      },
+      projectOptions: []
     };
   },
   created() {
@@ -329,6 +346,9 @@ export default {
     this.getDicts("user_status").then(response => {
       this.statusOptions = response.data;
     });
+    this.getDicts("sys_course_project").then(response => {
+      this.projectOptions = response.data;
+    });
     this.getTagOptions();
     this.getSalesOptions();
   },
@@ -532,7 +552,11 @@ export default {
           }
         });
       }).catch(() => {});
-    }
+    },
+    /** 获取项目对应名称 */
+    getProjectLabel(projectId) {
+      return this.projectOptions.find(item => parseInt(item.dictValue) === projectId)?.dictLabel;
+    },
   }
 };
 </script>

+ 276 - 239
src/views/store/components/addOrder.vue

@@ -1,176 +1,167 @@
 <template>
   <div class="app-container">
-
-
-        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
-           <el-form-item label="会员信息" prop="userId">
-                <el-row  >
-                  <el-col >
-                      <el-input placeholder="请输入会员手机号" style="width:240px;cursor:pointer" v-model="phone">
-                      </el-input>
-                      <el-button plain style="margin-left:10px;"    @click="searchUser()">查询</el-button>
-                      <el-button plain style="margin-left:10px;" icon="el-icon-plus"  type="primary" @click="handleAddUser()">添加会员</el-button>
-                  </el-col>
-                </el-row>
-                <el-table border style="margin-top:5px;"  v-loading="userloading" :data="users">
-                  <el-table-column label="ID" align="center" prop="userId" />
-                  <el-table-column label="会员头像" align="center" width="80">
-                    <template slot-scope="scope">
-                      <el-popover
-                        placement="right"
-                        title=""
-                        trigger="hover"
-                      >
-                        <img slot="reference" :src="scope.row.avatar" width="50" >
-                        <img :src="scope.row.avatar" style="max-width: 120px;">
-                      </el-popover>
-                    </template>
-                  </el-table-column>
-                  <el-table-column label="昵称" align="center" prop="nickname" />
-                  <el-table-column label="手机号" align="center" prop="phone" />
-                  <el-table-column label="状态" align="center" prop="status" >
-                      <template slot-scope="scope">
-                          <el-tag prop="status" v-for="(item, index) in userStatusOptions"    v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
-                      </template>
-                  </el-table-column>
-                </el-table>
-            </el-form-item>
-            <el-form-item label="收货信息" prop="addressId">
-              <el-row  >
-                <el-col >
-                      <el-button plain  type="primary" icon="el-icon-plus"  @click="handleAddUserAddress()">添加收货地址</el-button>
-                </el-col>
-              </el-row>
-              <el-radio-group v-model="form.addressId" style="width:100%">
-              <el-table border  style="margin-top:5px;"  v-loading="addressloading" :data="address">
-                <el-table-column label="ID" align="center"  >
-                    <template slot-scope="scope">
-                       <el-radio :label="scope.row.id"></el-radio>
-                    </template>
-                </el-table-column>
-                <el-table-column label="收货人姓名" align="center" prop="realName" />
-                <el-table-column label="收货人电话" align="center" prop="phone" />
-                <el-table-column label="地址" align="center" prop="detail" >
-                    <template slot-scope="scope">
-                       {{scope.row.province}} {{scope.row.city}} {{scope.row.district}} {{scope.row.detail}}
-                    </template>
-                </el-table-column>
-              </el-table>
-              </el-radio-group>
-            </el-form-item>
-            <el-form-item label="商品列表" >
-              <el-row  >
-                <el-col >
-                      <el-button plain  type="primary" icon="el-icon-plus" @click="handleAddProduct">添加商品</el-button>
-                </el-col>
-              </el-row>
-              <el-table border :key = "tablekey" width="100%" style="margin-top:5px;"  :data="products">
-                <el-table-column label="商品编号" align="center" prop="barCode" />
-                <el-table-column label="商品图片" align="center" width="100">
-                  <template slot-scope="scope">
-                    <el-popover
-                      placement="right"
-                      title=""
-                      trigger="hover"
-                    >
-                      <img slot="reference" :src="scope.row.image" width="50">
-                      <img :src="scope.row.image" style="max-width: 50px;">
-                    </el-popover>
-                  </template>
-                </el-table-column>
-                <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
-                <el-table-column label="商品规格" align="center" prop="sku" />
-                <el-table-column label="库存" align="center" prop="stock" />
-                <el-table-column label="单价" align="center" prop="price" />
-                <el-table-column label="数量" align="center"  prop="count" width="200px" :key="tablekey">
-                   <template slot-scope="scope">
-                    <div>
-                        <el-input-number v-model="scope.row.count"  @change="handleProductCountChange(scope.row)"  size="mini" :min="1" :max="scope.row.stock"  ></el-input-number>
-                    </div>
-                  </template>
-                </el-table-column>
-                <el-table-column label="小计" align="center" prop="money"   />
-                <el-table-column label="操作" align="center" width="100px" >
-                  <template slot-scope="scope">
-                    <el-button
-                      size="mini"
-                      type="text"
-                      icon="el-icon-delete"
-                      @click="handleDelete(scope.row)"
-                    >删除</el-button>
-                  </template>
-                </el-table-column>
-              </el-table>
-              <el-row>
-                <el-col>
-                      <span>商品合计:{{products.length}}</span><span style="margin-left:10px;">商品总价:{{totalMoney.toFixed(2)}}</span>
-                </el-col>
-              </el-row>
-            </el-form-item>
-            <el-form-item label="订单类型" prop="orderType">
-              <el-select   v-model="form.orderType" placeholder="请选择订单类型" clearable size="small" >
-              <el-option
-                      v-for="item in orderTypeOptions"
-                      :key="item.dictValue"
-                      :label="item.dictLabel"
-                      :value="item.dictValue"
-                    />
-              </el-select>
-            </el-form-item>
-            <el-form-item label="媒体来源" prop="orderMedium" v-if="orderMediumOptions.length>0">
-              <el-select   v-model="form.orderMedium" placeholder="请选择媒体来源" clearable size="small" >
-              <el-option
-                      v-for="item in orderMediumOptions"
-                      :key="item.dictValue"
-                      :label="item.dictLabel"
-                      :value="item.dictValue"
-                    />
-              </el-select>
-            </el-form-item>
-            <el-form-item label="支付方式" prop="payType">
-              <el-select   v-model="form.payType" placeholder="请选择支付方式" clearable size="small" >
-              <el-option
-                      v-for="item in payTypeOptions"
-                      :key="item.dictValue"
-                      :label="item.dictLabel"
-                      :value="item.dictValue"
-                    />
-              </el-select>
-            </el-form-item>
-            <el-form-item label="改价" prop="payPrice">
-              <el-input-number  v-model="form.payPrice" placeholder="修改商品总价" size="medium" :precision="2" :min="0.01" :step="0.1" />
-            </el-form-item>
-            <el-form-item label="物流代收" prop="amount" v-if="form.payType == '3'">
-              <el-input-number  v-model="form.amount" placeholder="平台支付价格" size="medium" :precision="2" :min="0.01" :step="0.1" />
-            </el-form-item>
-            <el-form-item label="订单备注" prop="mark">
-              <el-input  type="textarea" rows="2" v-model="form.mark" placeholder="" />
-            </el-form-item>
-        </el-form>
-      <div slot="footer" class="dialog-footer" style="float: right; margin-bottom: 20px;">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    <el-dialog :title="product.title" v-if="product.open"  :visible.sync="product.open" width="1000px" append-to-body>
-        <product-select  @selectProduct="selectProduct" />
+    <!-- 添加一个加载状态,在获取createOrderType之前显示 -->
+    <div v-if="!formReady" style="text-align: center; padding: 50px;">
+      <i class="el-icon-loading"></i> 正在加载...
+    </div>
+    
+    <!-- 只有在formReady为true时才显示表单 -->
+    <el-form v-if="formReady" ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-form-item label="会员信息" prop="userId">
+        <el-row>
+          <el-col>
+            <el-input placeholder="请输入会员手机号" style="width:240px;cursor:pointer" v-model="phone">
+            </el-input>
+            <el-button plain style="margin-left:10px;" @click="searchUser()">查询</el-button>
+            <el-button plain style="margin-left:10px;" icon="el-icon-plus" type="primary" @click="handleAddUser()">添加会员</el-button>
+          </el-col>
+        </el-row>
+        <el-table border style="margin-top:5px;" v-loading="userloading" :data="users">
+          <el-table-column label="ID" align="center" prop="userId" />
+          <el-table-column label="会员头像" align="center" width="80">
+            <template slot-scope="scope">
+              <el-popover placement="right" title="" trigger="hover">
+                <img slot="reference" :src="scope.row.avatar" width="50">
+                <img :src="scope.row.avatar" style="max-width: 120px;">
+              </el-popover>
+            </template>
+          </el-table-column>
+          <el-table-column label="昵称" align="center" prop="nickname" />
+          <el-table-column label="手机号" align="center" prop="phone" />
+          <el-table-column label="状态" align="center" prop="status">
+            <template slot-scope="scope">
+              <el-tag prop="status" v-for="(item, index) in userStatusOptions" v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+      
+      <el-form-item label="收货信息" prop="addressId">
+        <el-row>
+          <el-col>
+            <el-button plain type="primary" icon="el-icon-plus" @click="handleAddUserAddress()">添加收货地址</el-button>
+          </el-col>
+        </el-row>
+        <el-radio-group v-model="form.addressId" style="width:100%">
+          <el-table border style="margin-top:5px;" v-loading="addressloading" :data="address">
+            <el-table-column label="ID" align="center">
+              <template slot-scope="scope">
+                <el-radio :label="scope.row.id"></el-radio>
+              </template>
+            </el-table-column>
+            <el-table-column label="收货人姓名" align="center" prop="realName" />
+            <el-table-column label="收货人电话" align="center" prop="phone" />
+            <el-table-column label="地址" align="center" prop="detail">
+              <template slot-scope="scope">
+                {{scope.row.province}} {{scope.row.city}} {{scope.row.district}} {{scope.row.detail}}
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-radio-group>
+      </el-form-item>
+      
+      <el-form-item label="商品列表">
+        <el-row>
+          <el-col>
+            <el-button plain type="primary" icon="el-icon-plus" @click="handleAddProduct">添加商品</el-button>
+          </el-col>
+        </el-row>
+        <el-table border :key="tablekey" width="100%" style="margin-top:5px;" :data="products">
+          <el-table-column label="商品编号" align="center" prop="barCode" />
+          <el-table-column label="商品图片" align="center" width="100">
+            <template slot-scope="scope">
+              <el-popover placement="right" title="" trigger="hover">
+                <img slot="reference" :src="scope.row.image" width="50">
+                <img :src="scope.row.image" style="max-width: 50px;">
+              </el-popover>
+            </template>
+          </el-table-column>
+          <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
+          <el-table-column label="商品规格" align="center" prop="sku" />
+          <el-table-column label="库存" align="center" prop="stock" />
+          <el-table-column label="单价" align="center" prop="price" width="200px" v-if="createOrderType == 1">
+            <template slot-scope="scope">
+              <el-input-number v-model="scope.row.price" @change="handleProductCountChange(scope.row)" size="mini" :min="0.01"></el-input-number>
+            </template>
+          </el-table-column>
+          <el-table-column label="单价" align="center" prop="price" v-if="createOrderType == 2"/>
+          <el-table-column label="数量" align="center" prop="count" width="200px" :key="tablekey">
+            <template slot-scope="scope">
+              <div>
+                <el-input-number v-model="scope.row.count" @change="handleProductCountChange(scope.row)" size="mini" :min="1" :max="scope.row.stock"></el-input-number>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="小计" align="center" prop="money" />
+          <el-table-column label="操作" align="center" width="100px">
+            <template slot-scope="scope">
+              <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-row>
+          <el-col>
+            <span>商品合计:{{products.length}}</span><span style="margin-left:10px;">商品总价:{{totalMoney.toFixed(2)}}</span>
+          </el-col>
+        </el-row>
+      </el-form-item>
+      
+      <el-form-item label="订单类型" prop="orderType">
+        <el-select v-model="form.orderType" placeholder="请选择订单类型" clearable size="small">
+          <el-option v-for="item in orderTypeOptions" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue" />
+        </el-select>
+      </el-form-item>
+      
+      <el-form-item label="媒体来源" prop="orderMedium" v-if="orderMediumOptions.length>0">
+        <el-select v-model="form.orderMedium" placeholder="请选择媒体来源" clearable size="small">
+          <el-option v-for="item in orderMediumOptions" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue" />
+        </el-select>
+      </el-form-item>
+      
+      <el-form-item label="支付方式" prop="payType">
+        <el-select v-model="form.payType" placeholder="请选择支付方式" clearable size="small">
+          <el-option v-for="item in payTypeOptions" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue" />
+        </el-select>
+      </el-form-item>
+      
+      <el-form-item label="改价" prop="payPrice" v-if="createOrderType == 2">
+        <el-input-number v-model="form.payPrice" placeholder="修改商品总价" size="medium" :precision="2" :min="0.01" :step="0.1" />
+      </el-form-item>
+      
+      <el-form-item label="物流代收" prop="amount" v-if="form.payType == '3'">
+        <el-input-number v-model="form.amount" placeholder="平台支付价格" size="medium" :precision="2" :min="0.01" :step="0.1" />
+      </el-form-item>
+      
+      <el-form-item label="订单备注" prop="mark">
+        <el-input type="textarea" rows="2" v-model="form.mark" placeholder="" />
+      </el-form-item>
+    </el-form>
+    
+    <div v-if="formReady" slot="footer" class="dialog-footer" style="float: right; margin-bottom: 20px;">
+      <el-button type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="cancel">取 消</el-button>
+    </div>
+    
+    <!-- 对话框部分保持不变 -->
+    <el-dialog :title="product.title" v-if="product.open" :visible.sync="product.open" width="1000px" append-to-body>
+      <product-select @selectProduct="selectProduct" />
     </el-dialog>
-    <el-dialog :title="user.title" v-if="user.open"  :visible.sync="user.open" width="500px" append-to-body>
-        <add-user @addUser="addUser" />
+    <el-dialog :title="user.title" v-if="user.open" :visible.sync="user.open" width="500px" append-to-body>
+      <add-user @addUser="addUser" />
     </el-dialog>
-    <el-dialog :title="userAddress.title" v-if="userAddress.open"  :visible.sync="userAddress.open" width="800px" append-to-body>
-        <add-user-address ref="addUserAddress"   @addUserAddress="addUserAddress" />
+    <el-dialog :title="userAddress.title" v-if="userAddress.open" :visible.sync="userAddress.open" width="800px" append-to-body>
+      <add-user-address ref="addUserAddress" @addUserAddress="addUserAddress" />
     </el-dialog>
-    <el-dialog :title="payQr.title" v-if="payQr.open"  :visible.sync="payQr.open" width="240px" append-to-body>
-        <div style="padding-bottom:15px;" >
-            <div  class="qrcode" ref="qrCodeUrl"></div>
-        </div>
+    <el-dialog :title="payQr.title" v-if="payQr.open" :visible.sync="payQr.open" width="240px" append-to-body>
+      <div style="padding-bottom:15px;">
+        <div class="qrcode" ref="qrCodeUrl"></div>
+      </div>
     </el-dialog>
-
   </div>
 </template>
 
 <script>
-import {exportStoreOrderItems, createUserOrder,listStoreOrder, getStoreOrder, delStoreOrder, addStoreOrder, updateStoreOrder, exportStoreOrder } from "@/api/store/storeOrder";
+import {exportStoreOrderItems, createUserOrder,listStoreOrder, getStoreOrder, delStoreOrder, addStoreOrder, updateStoreOrder, exportStoreOrder,getCreateOrderType } from "@/api/store/storeOrder";
 import { getUserList } from "@/api/users/user";
 import { getAddressList } from "@/api/users/userAddress";
 import { getTcmScheduleList } from "@/api/company/tcmScheduleReport";
@@ -183,21 +174,25 @@ import QRCode from 'qrcodejs2'
 import { treeselect } from "@/api/company/companyDept";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
 export default {
   components: { Treeselect,productOrder,productSelect,addUser,addUserAddress },
   name: "StoreOrder",
   props: {
     customerId: {
-      type: Number, // 或 Number,根据实际情况选择
+      type: Number,
       required: false
     },
     userId: {
-      type: Number, // 或 Number,根据实际情况选择
+      type: Number,
       required: false
     }
   },
   data() {
     return {
+      // 添加表单准备状态
+      formReady: false,
+      createOrderType: null,
       // 部门树选项
       deptOptions: undefined,
       // 部门名称
@@ -251,7 +246,6 @@ export default {
       single: true,
       // 非多个禁用
       multiple: true,
-
       // 显示搜索条件
       showSearch: true,
       // 总条数
@@ -332,70 +326,131 @@ export default {
         products: [
           { required: true, message: "商品不能为空", trigger: "submit" }
         ],
-
       }
     };
   },
   watch: {
     // 根据名称筛选部门树
     deptName(val) {
-        this.$refs.tree.filter(val);
+      this.$refs.tree.filter(val);
     },
   },
   created() {
-    this.getTreeselect();
-    // 媒体来源 如需要则增加字典 
-    this.getDicts("store_order_medium").then((response) => {
-      this.orderMediumOptions = response.data;
-    });
-    this.getDicts("store_order_type").then((response) => {
-      this.orderTypeOptions = response.data;
-    });
-    this.getDicts("store_pay_type").then((response) => {
-      this.payTypeOptions = response.data;
-    });
-    this.getDicts("user_status").then((response) => {
-      this.userStatusOptions = response.data;
-    });
-    this.getDicts("store_order_status").then((response) => {
-      this.statusOptions = response.data;
-      console.log(response.data)
-    });
-    this.getDicts("store_order_delivery_status").then((response) => {
-      this.deliveryStatusOptions = response.data;
-    });
-    this.getDicts("store_delivery_pay_status").then((response) => {
-      this.deliveryPayStatusOptions = response.data;
-    });
-    getTcmScheduleList().then(response => {
-      this.scheduleOptions = response.data;
-    });
-    this.initUser();
+    // 先获取createOrderType,然后再初始化其他数据
+    this.initializeForm();
   },
   methods: {
-    initUser(){
-      console.log("--------------",this.userId)
-      if(this.userId != null){
-        var data={userId:this.userId}
-        this.userloading = true;
-        this.users=[];
-        this.address=[];
-        getUserList(data).then(response => {
-          this.users = response.data;
-          this.userloading = false;
-          if(this.users!=null&&this.users.length==1){
-            this.form.userId=this.users[0].userId;
-            this.getAddressList(this.form.userId)
-          }
-        });
+    // 初始化表单的方法
+    async initializeForm() {
+      try {
+        // 1. 首先获取createOrderType
+        const response = await getCreateOrderType();
+        this.createOrderType = response.createSalesOrderType;
+        console.log('createOrderType loaded:', this.createOrderType);
+        
+        // 2. 然后并行加载其他数据
+        await Promise.all([
+          this.loadDictionaries(),
+          this.loadOtherData(),
+          this.initUser()
+        ]);
+        
+        // 3. 所有数据加载完成后,设置表单为准备状态
+        this.formReady = true;
+        console.log('Form is ready to display');
+        
+      } catch (error) {
+        console.error('Error initializing form:', error);
+        this.$message.error('表单初始化失败');
       }
     },
-     /** 查询部门下拉树结构 */
-     getTreeselect() {
-      treeselect().then((response) => {
+    
+    // 加载字典数据
+    async loadDictionaries() {
+      const dictPromises = [
+        this.getDicts("crm_customer_source").then((response) => {
+          this.orderMediumOptions = response.data;
+        }),
+        this.getDicts("store_order_type").then((response) => {
+          this.orderTypeOptions = response.data;
+        }),
+        this.getDicts("store_pay_type").then((response) => {
+          this.payTypeOptions = response.data;
+        }),
+        this.getDicts("user_status").then((response) => {
+          this.userStatusOptions = response.data;
+        }),
+        this.getDicts("store_order_status").then((response) => {
+          this.statusOptions = response.data;
+        }),
+        this.getDicts("store_order_delivery_status").then((response) => {
+          this.deliveryStatusOptions = response.data;
+        }),
+        this.getDicts("store_delivery_pay_status").then((response) => {
+          this.deliveryPayStatusOptions = response.data;
+        })
+      ];
+      
+      await Promise.all(dictPromises);
+    },
+    
+    // 加载其他数据
+    async loadOtherData() {
+      await Promise.all([
+        this.getTreeselect(),
+        getTcmScheduleList().then(response => {
+          this.scheduleOptions = response.data;
+        })
+      ]);
+    },
+
+    initUser(){
+      return new Promise((resolve) => {
+        console.log("--------------",this.userId)
+        if(this.userId != null){
+          var data={userId:this.userId}
+          this.userloading = true;
+          this.users=[];
+          this.address=[];
+          getUserList(data).then(response => {
+            this.users = response.data;
+            this.userloading = false;
+            if(this.users!=null&&this.users.length==1){
+              this.form.userId=this.users[0].userId;
+              this.getAddressList(this.form.userId).then(() => {
+                resolve();
+              });
+            } else {
+              resolve();
+            }
+          }).catch(() => {
+            resolve();
+          });
+        } else {
+          resolve();
+        }
+      });
+    },
+    
+    /** 查询部门下拉树结构 */
+    getTreeselect() {
+      return treeselect().then((response) => {
         this.deptOptions = response.data;
       });
     },
+    
+    // 修改getAddressList方法,返回Promise
+    getAddressList(userId){
+      var data={userId:userId}
+      this.addressloading = true;
+      this.address=[];
+      return getAddressList(data).then(response => {
+        this.address = response.data;
+        this.addressloading = false;
+      });
+    },
+
+    // 其他方法保持不变...
     // 筛选节点
     filterNode(value, data) {
       if (!value) return true;
@@ -410,7 +465,7 @@ export default {
       this.payQr.open=true;
       setTimeout(() => {
         var qrcode = new QRCode(this.$refs.qrCodeUrl, {
-            text: config.payQRUrl+row.id, // 需要转换为二维码的内容
+            text: config.payQRUrl+row.id,
             width: 200,
             height: 200,
             colorDark: '#000000',
@@ -418,8 +473,6 @@ export default {
             correctLevel: QRCode.CorrectLevel.H
         })
       }, 200);
-
-
     },
     handleAddUser(){
       this.user.open=true;
@@ -442,7 +495,6 @@ export default {
     addUser(){
       this.user.open=false;
     },
-
     compute(){
       this.totalMoney=0;
       var that=this;
@@ -491,15 +543,6 @@ export default {
         }
       });
     },
-    getAddressList(userId){
-      var data={userId:userId}
-      this.addressloading = true;
-      this.address=[];
-      getAddressList(data).then(response => {
-        this.address = response.data;
-        this.addressloading = false;
-      });
-    },
     handleDetails(row){
       this.show.open=true;
       const orderId = row.id ;
@@ -558,7 +601,6 @@ export default {
         addressId:null,
         userId:null,
         products:null,
-
       };
       this.resetForm("form");
     },
@@ -608,11 +650,9 @@ export default {
           createUserOrder(this.form).then(response => {
             if (response.code === 200) {
               this.msgSuccess("创建成功");
-
               this.$emit("closePackage")
             }
           });
-
         }
       });
     },
@@ -620,11 +660,9 @@ export default {
     handleDelete(row) {
        this.products.splice(this.products.findIndex(item => item.id === row.id), 1)
        this.compute();
-
     },
     /** 导出按钮操作 */
     handleExport() {
-
       if(this.queryParams.status=='00'){
         this.queryParams.status=null;
       }
@@ -646,7 +684,6 @@ export default {
       else{
         this.queryParams.deliveryImportTimeRange=null;
       }
-
       const queryParams = this.addDateRange(this.queryParams, this.dateRange);
       this.$confirm('是否确认导出所有订单数据项?', "警告", {
           confirmButtonText: "确定",
@@ -694,6 +731,7 @@ export default {
   }
 };
 </script>
+
 <style scoped lang="scss">
 .items{
   margin: 5px 0px;
@@ -710,7 +748,6 @@ export default {
     max-width: 200px;
     text-align: left;
     .goods-title{
-
       overflow:hidden;
       white-space: nowrap;
       text-overflow: ellipsis;
@@ -727,9 +764,9 @@ export default {
   overflow: auto;
 }
 </style>
-<style>
-  .el-descriptions-item__label.is-bordered-label{
-    font-weight: normal;
-  }
 
-</style>
+<style>
+.el-descriptions-item__label.is-bordered-label{
+  font-weight: normal;
+}
+</style>

+ 26 - 0
src/views/store/storeOrder/list.vue

@@ -250,11 +250,33 @@
                   <el-tag prop="status" v-for="(item, index) in orderTypeOptions"    v-if="scope.row.orderType==item.dictValue">{{item.dictLabel}}</el-tag>
               </template>
           </el-table-column>
+          <el-table-column label="媒体来源" align="center" prop="orderMedium" >
+          <template slot-scope="scope">
+              <el-tag prop="orderMedium" v-for="(item, index) in orderMediumOptions"    v-if="scope.row.orderMedium==item.dictValue">{{item.dictLabel}}</el-tag>
+          </template>
+          </el-table-column>
+          <el-table-column label="订单产品" align="center" width="200px">
+            <template slot-scope="scope">
+              <div v-if="scope.row.items && scope.row.items.length > 0">
+                <el-tag 
+                  v-for="(item, index) in scope.row.items" 
+                  :key="index" 
+                  size="mini" 
+                  class="product-tag"
+                >
+                  {{ JSON.parse(item.jsonInfo).productName }} × {{ item.num }}
+                </el-tag>
+              </div>
+              <span v-else class="no-products">暂无商品</span>
+            </template>
+          </el-table-column>
           <el-table-column label="状态" align="center" prop="status" >
               <template slot-scope="scope">
                   <el-tag prop="status" v-for="(item, index) in statusOptions"    v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
               </template>
           </el-table-column>
+          <el-table-column label="运单号" align="center" prop="deliveryId" >
+          </el-table-column>
           <el-table-column label="物流状态" align="center" prop="deliveryStatus" >
               <template slot-scope="scope">
                   <el-tag prop="status" v-for="(item, index) in deliveryStatusOptions"    v-if="scope.row.deliveryStatus==item.dictValue">{{item.dictLabel}}</el-tag>
@@ -476,6 +498,7 @@ export default {
       deliveryPayStatusOptions:[],
       deliveryStatusOptions:[],
       dateRange: [],
+      orderMediumOptions:[],
       orderTypeOptions:[],
       payTypeOptions:[],
       payQr:{
@@ -611,6 +634,9 @@ export default {
   },
   created() {
     this.getTreeselect();
+    this.getDicts("crm_customer_source").then((response) => {
+      this.orderMediumOptions = response.data;
+    });
     this.getDicts("store_order_type").then((response) => {
       this.orderTypeOptions = response.data;
     });

+ 189 - 0
src/views/users/user/blacklist.vue

@@ -0,0 +1,189 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px" @submit.native.prevent>
+      <el-form-item label="关键词" prop="keyword">
+        <el-input
+          style="width:220px"
+          v-model="queryParams.keyword"
+          placeholder="请输入微信名称/手机号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-button
+        size="mini"
+        type="primary"
+        style="margin-left: 5px"
+        :disabled="ids.length === 0"
+        @click="handleUpdateBatch"
+        v-hasPermi="['users:user:enabledBlackUsers']"
+      >批量启用</el-button>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table  height="500" border v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="用户id" align="center" prop="userId" />
+      <el-table-column label="项目" align="center" prop="projectName" />
+      <el-table-column label="用户昵称" align="center" prop="nickname" />
+      <el-table-column label="用户头像" align="center" prop="avatar">
+        <template slot-scope="scope">
+          <el-popover trigger="hover" placement="top">
+            <el-image :src="scope.row.avatar" style="width: 200px;height: 200px"/>
+            <div slot="reference" class="name-wrapper">
+              <el-avatar shape="square" size="large" :src="scope.row.avatar"/>
+            </div>
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column label="注册时间" align="center" prop="createTime" width="160px"/>
+<!--      <el-table-column label="看课数量" align="center" prop="watchCourseCount" />-->
+<!--      <el-table-column label="缺课数量" align="center" prop="missCourseCount" />-->
+<!--      <el-table-column label="缺课状态" align="center" prop="missCourseStatus">-->
+<!--        <template slot-scope="scope">-->
+<!--          <el-tag effect="dark" type="danger"  v-if="scope.row.missCourseStatus === 1">已缺课</el-tag>-->
+<!--          <el-tag effect="dark" type="success" v-else>未缺课</el-tag>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="参与营期数量" align="center" prop="partCourseCount" width="100px"/>-->
+      <el-table-column label="最后一次看课时间" align="center" prop="lastWatchDate"  width="160px"/>
+<!--      <el-table-column label="看课状态" align="center" prop="courseCountStatus">-->
+<!--        <template slot-scope="scope">-->
+<!--          <el-tag effect="dark" type="success" v-if="scope.row.courseCountStatus === 1">正常</el-tag>-->
+<!--          <el-tag effect="dark" type="info"    v-else-if="scope.row.courseCountStatus === 2">停止</el-tag>-->
+<!--          <el-tag effect="dark" type="danger"  v-else>未看</el-tag>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="停课天数" align="center" prop="stopWatchDays" />-->
+<!--      <el-table-column label="完播时间" align="center" prop="completeWatchDate" width="160px"/>-->
+      <el-table-column label="标签名称" align="center" prop="tag" />
+      <el-table-column label="所属销售名称" align="center" prop="companyUserNickName" width="120px"/>
+      <el-table-column label="是否重粉" align="center" prop="isRepeatFans" width="120px">
+        <template slot-scope="scope">
+          <el-tag effect="dark" type="success" v-if="scope.row.isRepeatFans === 0">否</el-tag>
+          <el-tag effect="dark" type="danger"    v-else-if="scope.row.isRepeatFans === 1">是</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['users:user:enabledBlackUsers']"
+            v-if="scope.row.isRepeatFans !== 1"
+          >启用</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import { blacklist,enabledBlackUsers } from "@/api/users/user";
+
+export default {
+  name: "blacklist",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 用户列表数据
+      userList: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        keyword: null,
+        status: 2
+      },
+      selectUser: []
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询客户列表 */
+    getList() {
+      this.loading = true;
+      blacklist(this.queryParams).then(response => {
+        this.userList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.userId)
+      this.selectedUser = selection.map(item => {return {userId: item.userId, projectId: item.projectId}})
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    // 启用
+    handleUpdate(row) {
+      enabledBlackUsers([{userId: row.userId, projectId: row.projectId}]).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("取消禁用成功");
+          this.getList();
+        } else {
+          this.msgError(response.msg);
+        }
+      });
+    },
+    // 启用
+    handleUpdateBatch() {
+      enabledBlackUsers(this.selectedUser).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("取消禁用成功");
+          this.getList();
+        } else {
+          this.msgError(response.msg);
+        }
+      });
+    }
+  }
+};
+</script>
+<style scoped>
+.app-container {
+  height: 87.5vh;
+}
+</style>

+ 7 - 4
src/views/users/user/darkRoom.vue

@@ -32,6 +32,7 @@
     <el-table  height="500" border v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="用户id" align="center" prop="userId" />
+      <el-table-column label="项目" align="center" prop="projectName" />
       <el-table-column label="用户昵称" align="center" prop="nickname" />
       <el-table-column label="用户头像" align="center" prop="avatar">
         <template slot-scope="scope">
@@ -78,7 +79,7 @@
             size="mini"
             type="text"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['users:user:darkRoomList']"
+            v-hasPermi="['users:user:enabledUsers']"
             v-if="scope.row.isRepeatFans !== 1"
           >启用</el-button>
         </template>
@@ -121,8 +122,9 @@ export default {
         pageNum: 1,
         pageSize: 10,
         keyword: null,
-        isBlack: true
+        status: 0
       },
+      selectUser: []
     };
   },
   created() {
@@ -151,12 +153,13 @@ export default {
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.userId)
+      this.selectedUser = selection.map(item => {return {userId: item.userId, projectId: item.projectId}})
       this.single = selection.length!==1
       this.multiple = !selection.length
     },
     // 启用
     handleUpdate(row) {
-      enabledUsers([row.userId]).then(response => {
+      enabledUsers([{userId: row.userId, projectId: row.projectId}]).then(response => {
         if (response.code === 200) {
           this.msgSuccess("取消禁用成功");
           this.getList();
@@ -167,7 +170,7 @@ export default {
     },
     // 启用
     handleUpdateBatch() {
-      enabledUsers(this.ids).then(response => {
+      enabledUsers(this.selectedUser).then(response => {
         if (response.code === 200) {
           this.msgSuccess("取消禁用成功");
           this.getList();

+ 18 - 2
src/views/users/user/transfer.vue

@@ -66,6 +66,12 @@
     <!-- 表格数据 -->
     <el-table height="500" border v-loading="loading" :data="customerList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="客户ID" align="center" prop="userId" />
+      <el-table-column label="项目" align="center" prop="projectId">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.projectId !== null">{{ getProjectLabel(scope.row.projectId) }}</el-tag>
+        </template>
+      </el-table-column>
       <el-table-column label="会员ID" align="center" prop="userId" />
       <el-table-column label="昵称" align="center" prop="nickname" />
       <el-table-column label="所属销售" align="center" prop="companyUserNickName" />
@@ -155,9 +161,14 @@ export default {
         salesName: null,
         phoneNumber: null,
       },
+      projectOptions: [],
+      selectedUser: [],
     };
   },
   created() {
+    this.getDicts("sys_course_project").then(response => {
+      this.projectOptions = response.data;
+    });
     getUserList().then(res=>{
       if(res.code === 200) {
         this.companyUserList = res.data
@@ -204,6 +215,7 @@ export default {
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.userId)
+      this.selectedUser = selection.map(item => {return {userId: item.userId, projectId: item.projectId}})
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
@@ -226,7 +238,7 @@ export default {
       this.$refs["transferForm"].validate(valid => {
         if (valid) {
           transferUser({
-            userIds: this.ids,
+            userIds: this.selectedUser,
             targetCompanyUserId: this.transferForm.targetUserId,
             content: this.transferForm.content
           }).then(response => {
@@ -260,7 +272,11 @@ export default {
           // 处理下载
           this.download(response.msg); // RuoYi 提供的下载方法
         }).catch(function() {});
-    }
+    },
+    /** 获取项目对应名称 */
+    getProjectLabel(projectId) {
+      return this.projectOptions.find(item => parseInt(item.dictValue) === projectId)?.dictLabel;
+    },
 
   }
 };

+ 15 - 2
src/views/users/user/transferLog.vue

@@ -153,6 +153,11 @@
         <el-form-item label="转移矩阵" prop="customerIds">
           <el-table :data="form.customerList" border>
             <el-table-column label="客户" align="center" prop="userName" />
+            <el-table-column label="项目" align="center" prop="projectId">
+              <template slot-scope="scope">
+                <el-tag v-if="scope.row.projectId !== null">{{ getProjectLabel(scope.row.projectId) }}</el-tag>
+              </template>
+            </el-table-column>
             <el-table-column label="转移前销售" align="center" prop="beforeCompanyUserName" />
             <el-table-column label="转移后销售" align="center" prop="afterCompanyUserName" />
           </el-table>
@@ -268,7 +273,8 @@ export default {
         updatedAt: [
           { required: true, message: "记录最后更新时间不能为空", trigger: "blur" }
         ]
-      }
+      },
+      projectOptions: [],
     };
   },
   created() {
@@ -278,6 +284,9 @@ export default {
     getDicts('transfer_approval_status').then(response => {
       this.approvalStatusList = response.data;
     })
+    this.getDicts("sys_course_project").then(response => {
+      this.projectOptions = response.data;
+    });
     getUserList().then(res=>{
       if(res.code === 200) {
         this.companyUserList = res.data
@@ -393,7 +402,11 @@ export default {
         }).then(response => {
           this.download(response.msg);
         }).catch(function() {});
-    }
+    },
+    /** 获取项目对应名称 */
+    getProjectLabel(projectId) {
+      return this.projectOptions.find(item => parseInt(item.dictValue) === projectId)?.dictLabel;
+    },
   }
 };
 </script>