Procházet zdrojové kódy

分销接口对接完成 -zzx

zouzexu před 6 měsíci
rodič
revize
b38b5fa138

+ 1 - 1
config/dev.env.js

@@ -4,5 +4,5 @@ const prodEnv = require('./prod.env')
 
 module.exports = merge(prodEnv, {
   NODE_ENV: '"development"',
-  BASE_API: '"http://192.168.2.21:8080/zs/channel/admin"'
+  BASE_API: '"http://192.168.2.21:9120/zs/channel/admin"'
 })

+ 17 - 7
src/api/distribution.js

@@ -73,11 +73,12 @@ export function settingType(data) {
 }
 
 //获取二维码
-export function getQrcode(data) {
+export function getQrcode(params) {
   return request({
-    url: "/ums/umsAdminUser/distributionBindUser",
-    method: "post",
-    data: data,
+    responseType: 'blob',
+    url: "/ums/fileCtl/qrcode",
+    method: "get",
+    params: params,
   });
 }
 
@@ -91,10 +92,19 @@ export function recordsList(params) {
 }
 
 // 更新财务结算状态
-export function updateStatus(params) {
+export function updateStatus(data) {
   return request({
     url: "/ums/umsAdminUser/financialSettlement",
-    method: "get",
-    params: params,
+    method: "post",
+    data: data,
+  });
+}
+
+// 分销员编辑
+export function peopleEdit(data) {
+  return request({
+    url: "/ums/umsAdminUser/updateDistributionInfo",
+    method: "post",
+    data: data,
   });
 }

+ 16 - 8
src/router/index.js

@@ -21,29 +21,33 @@ import Layout from '../views/layout/Layout'
 export const constantRouterMap = [
   {path: '/login', component: () => import('@/views/login/index'), hidden: true},
   {path: '/404', component: () => import('@/views/404'), hidden: true},
+
+]
+
+export const asyncRouterMap = [
   {
     path: '/channel',
     component: Layout,
     redirect: '/channel/info',
     name: 'channel',
-    meta: {title: '渠道管理', icon: 'home'},
+    meta: {title: '渠道管理', icon: 'cms-subject'},
     children: [{
       path: 'info',
       name: 'info',
       component: () => import('@/views/channel/info/index'),
-      meta: {title: '渠道基础信息', icon: 'BasicsInfo'}
+      meta: {title: '基础信息', icon: 'BasicsInfo'},
     },
     {
       path: 'useCondition',
       name: 'useCondition',
       component: () => import('@/views/channel/useCondition/index'),
-      meta: {title: '渠道使用情况', icon: 'useCondition'}
+      meta: {title: '使用情况', icon: 'useCondition'}
     },
     {
       path: 'upCheck',
       name: 'upCheck',
       component: () => import('@/views/channel/upCheck/index'),
-      meta: {title: '渠道上账情况', icon: 'settleAccounts'}
+      meta: {title: '上账情况', icon: 'settleAccounts'}
     },
     ]
   },
@@ -71,6 +75,13 @@ export const constantRouterMap = [
       component: () => import('@/views/distribution/peopleManage/index'),
       meta: {title: '分销员管理', icon: 'peopleChannel'}
     },
+    {
+      path: 'junior',
+      name: 'junior',
+      component: () => import('@/views/distribution/peopleManage/junior'),
+      meta: {title: '下级查看', icon: 'peopleChannel'},
+      hidden: true
+    },
     {
       path: 'statistics',
       name: 'statistics',
@@ -84,10 +95,7 @@ export const constantRouterMap = [
       meta: {title: '分销记录', icon: 'example'}
     },
     ]
-  }
-]
-
-export const asyncRouterMap = [
+  },
   {
     path:'/ums',
     component: Layout,

+ 1 - 0
src/store/modules/user.js

@@ -46,6 +46,7 @@ const user = {
       return new Promise((resolve, reject) => {
         getInfo().then(response => {
           const data = response.data
+          localStorage.setItem("type",data.type);
           if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
             commit('SET_ROLES', data.roles)
           } else {

+ 24 - 20
src/utils/request.js

@@ -28,28 +28,32 @@ service.interceptors.response.use(
   * code为非200是抛错 可结合自己业务进行修改
   */
     const res = response.data
-    if (res.code !== 200) {
-      Message({
-        message: res.message,
-        type: 'error',
-        duration: 3 * 1000
-      })
-
-      // 401:未登录;
-      if (res.code === 401) {
-        MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', {
-          confirmButtonText: '重新登录',
-          cancelButtonText: '取消',
-          type: 'warning'
-        }).then(() => {
-          store.dispatch('FedLogOut').then(() => {
-            location.reload()// 为了重新实例化vue-router对象 避免bug
-          })
+    if(res.code){
+      if (res.code !== 200) {
+        Message({
+          message: res.message,
+          type: 'error',
+          duration: 3 * 1000
         })
+  
+        // 401:未登录;
+        if (res.code === 401) {
+          MessageBox.confirm('你已被登出,可以取消继续留在该页面,或者重新登录', '确定登出', {
+            confirmButtonText: '重新登录',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            store.dispatch('FedLogOut').then(() => {
+              location.reload()// 为了重新实例化vue-router对象 避免bug
+            })
+          })
+        }
+        return Promise.reject('error')
+      } else {
+        return response.data
       }
-      return Promise.reject('error')
-    } else {
-      return response.data
+    }else{
+      return response
     }
   },
   error => {

+ 10 - 3
src/views/channel/info/index.vue

@@ -1,7 +1,14 @@
+<!--
+ * @Descripttion: 渠道信息
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-09 16:08:16
+ * @LastEditors: zzx
+ * @LastEditTime: 2024-11-19 16:08:16
+-->
 <template>
-   
   <div class="app-container">
-    <el-card class="filter-container" shadow="never">
+    <el-card class="filter-container" shadow="hover">
       <div>
         <i class="el-icon-search"></i>
         <span>筛选搜索</span>
@@ -25,7 +32,7 @@
         </el-form>
       </div>
     </el-card>
-    <el-card class="operate-container" shadow="never">
+    <el-card class="operate-container" shadow="hover">
       <i class="el-icon-tickets"></i>
       <span>数据列表</span>
       <el-button size="mini" class="btn-add" @click="handleAdd()" style="margin-left: 20px">添加</el-button>

+ 10 - 3
src/views/channel/upCheck/index.vue

@@ -1,7 +1,14 @@
+<!--
+ * @Descripttion: 上账情况
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-09 16:08:16
+ * @LastEditors: zzx
+ * @LastEditTime: 2024-11-19 16:08:16
+-->
 <template>
-     
     <div class="app-container">
-        <el-card class="filter-container" shadow="never">
+        <el-card class="filter-container" shadow="hover">
             <div>
                 <i class="el-icon-search"></i>
                 <span>筛选搜索</span>
@@ -27,7 +34,7 @@
                 </el-form>
             </div>
         </el-card>
-        <el-card class="operate-container" shadow="never">
+        <el-card class="operate-container" shadow="hover">
             <i class="el-icon-tickets"></i>
             <span>数据列表</span>
         </el-card>

+ 10 - 3
src/views/channel/useCondition/index.vue

@@ -1,7 +1,14 @@
+<!--
+ * @Descripttion: 使用情况
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-09 16:08:16
+ * @LastEditors: zzx
+ * @LastEditTime: 2024-11-19 16:08:16
+-->
 <template>
-     
     <div class="app-container">
-        <el-card class="filter-container" shadow="never">
+        <el-card class="filter-container" shadow="hover">
             <div>
                 <i class="el-icon-search"></i>
                 <span>筛选搜索</span>
@@ -27,7 +34,7 @@
                 </el-form>
             </div>
         </el-card>
-        <el-card class="operate-container" shadow="never">
+        <el-card class="operate-container" shadow="hover">
             <i class="el-icon-tickets"></i>
             <span>数据列表</span>
         </el-card>

+ 44 - 34
src/views/distribution/distributionSet/index.vue

@@ -4,27 +4,30 @@
  * @Author: zzx
  * @Date: 2024-11-09 16:08:16
  * @LastEditors: zzx
- * @LastEditTime: 2024-11-13 16:08:16
+ * @LastEditTime: 2024-11-19 16:08:16
 -->
 <template>
     <div class="app-container">
-        <el-card class="filter-container" shadow="never">
+        <el-card class="filter-container" shadow="hover">
             <el-form :model="admin" ref="admin" label-width="150px" :rules="rules" size="mini">
                 <div class="blSet">
                     <h4>返佣比例设置</h4>
                     <span @click="forbiddenDialogVisible = true">查看说明</span>
                 </div>
                 <el-form-item label="一级返佣比例%:" prop="firstLevel">
-                    <el-input v-model="admin.firstLevel" clearable placeholder="请输入一级返佣比例" type="number" style="width: 250px"></el-input>
+                    <el-input v-model="admin.firstLevel" clearable placeholder="请输入一级返佣比例" type="number"
+                        style="width: 250px"></el-input>
                 </el-form-item>
                 <el-form-item label="二级返佣比例%:" prop="secondLevel">
-                    <el-input v-model="admin.secondLevel" clearable placeholder="请输入二级返佣比例" type="number" style="width: 250px"></el-input>
+                    <el-input v-model="admin.secondLevel" clearable placeholder="请输入二级返佣比例" type="number"
+                        style="width: 250px"></el-input>
                 </el-form-item>
                 <div>
                     <h4>分销员人数限制</h4>
                 </div>
                 <el-form-item label="" style="margin-left: -120px;" prop="maxUserCount">
-                    一级分销员最多可添加 <el-input v-model="admin.maxUserCount" placeholder="请输入整数" type="number" style="width: 100px"></el-input> 个二级分销员
+                    一级分销员最多可添加 <el-input v-model="admin.maxUserCount" placeholder="请输入整数" type="number"
+                        style="width: 100px"></el-input> 个二级分销员
                 </el-form-item>
             </el-form>
             <el-divider content-position="left"></el-divider>
@@ -37,54 +40,57 @@
             <div class="text1">1.一级返佣比例,是指一级分销员所获得的返佣比例;二级分佣比例,是指二级分销员所获得的返佣比例。</div>
             <div class="text1">2.计算公式:</div>
             <div class="text2">举例:某电站的计费策略如下图,一级返佣比例为10%,二级返佣比例为90%,某用户在9点开始充电,11点结束,消耗2度电。</div>
-            <div class="text2">只有一级分销员,由一级分销员直接发展的用户。一级分销员的返佣总金额 = 运营服务费/度 × 一级返佣比例/度 × 用户充电度数举例:0.13 × 0.1 × 2 = 0.026 元</div>
-            <div class="text2">(2)有两级分销员。二级分销员的返佣总金额 = 运营服务费/度 × 一级返佣比例/度 × 二级返佣比例度 × 用户充电度数一级分销员的返佣总金额 = 运营服务费/度 × 一级分佣比例/度 × (1 - 二级返佣比例/度) × 用户充电度数</div>
+            <div class="text2">只有一级分销员,由一级分销员直接发展的用户。一级分销员的返佣总金额 = 运营服务费/度 × 一级返佣比例/度 × 用户充电度数举例:0.13 × 0.1 × 2 = 0.026
+                元</div>
+            <div class="text2">(2)有两级分销员。二级分销员的返佣总金额 = 运营服务费/度 × 一级返佣比例/度 × 二级返佣比例度 × 用户充电度数一级分销员的返佣总金额 = 运营服务费/度 ×
+                一级分佣比例/度 × (1 - 二级返佣比例/度) × 用户充电度数</div>
             <div class="text2">举例:一级分销员的返佣总金额 = 0.13 × 0.1 × (1 - 0.9)× 2 = 0.0026 元</div>
             <div class="text3">二级分销员的返佣总金额 = 0.13 × 0.1 × 0.9 × 2 = 0.0234 元 </div>
             <div style="margin-top: 20px;">
                 <el-table ref="adminTable" :data="list" border>
-                <el-table-column label="时间段" width="150" align="center" prop="times"></el-table-column>
-                <el-table-column label="电费(元/度)" width="150" align="center" prop="electricity"></el-table-column>
-                <el-table-column label="结算服务费(元)" width="150" align="center" prop="service"></el-table-column>
-                <el-table-column label="结算费合计(元/度)" width="150" align="center" prop="total"></el-table-column>
-                <el-table-column label="运营服务费(元)" width="150" align="center" prop="operate"></el-table-column>
-                <el-table-column label="销售合计价格(元/度)" width="150" align="center" prop="sellTotal"></el-table-column>
-            </el-table>
+                    <el-table-column label="时间段" align="center" prop="times"></el-table-column>
+                    <el-table-column label="电费(元/度)"  align="center" prop="electricity"></el-table-column>
+                    <el-table-column label="结算服务费(元)"  align="center" prop="service"></el-table-column>
+                    <el-table-column label="结算费合计(元/度)" align="center" prop="total"></el-table-column>
+                    <el-table-column label="运营服务费(元)" align="center" prop="operate"></el-table-column>
+                    <el-table-column label="销售合计价格(元/度)"  align="center" prop="sellTotal"></el-table-column>
+                </el-table>
             </div>
         </el-dialog>
     </div>
 </template>
 <script>
-import { systemconfig,distributionSet } from "@/api/distribution";
+import { systemconfig, distributionSet } from "@/api/distribution";
 const defaultAdmin = {
     firstLevel: null,
     secondLevel: null,
     maxUserCount: null
 };
 export default {
+    name: "distributionSet",
     data() {
         return {
             admin: Object.assign({}, defaultAdmin),
             forbiddenDialogVisible: false,
             list: [{
-                times:'09:00-12:00',
-                electricity:'0.82',
-                service:'0.24',
-                total:'1.06', 
-                operate:'0.13',
-                sellTotal:'1.05'
-            },{
-                times:'16:00-21:00',
-                electricity:'0.82',
-                service:'0.24',
-                total:'1.06', 
-                operate:'0.13',
-                sellTotal:'1.05'
+                times: '09:00-12:00',
+                electricity: '0.82',
+                service: '0.24',
+                total: '1.06',
+                operate: '0.13',
+                sellTotal: '1.05'
+            }, {
+                times: '16:00-21:00',
+                electricity: '0.82',
+                service: '0.24',
+                total: '1.06',
+                operate: '0.13',
+                sellTotal: '1.05'
             }],
             rules: {
-                firstLevel: [{ required: true,message: '请输入一级返佣比例',trigger: 'blur' },{pattern:/^(100|[0-9]|[1-9][0-9])$/, message: '请输入0-100的整数', trigger: 'blur' }],
-                secondLevel: [{ required: true, message: '请输入二级返佣比例', trigger: 'blur' },{pattern:/^(100|[0-9]|[1-9][0-9])$/, message: '请输入0-100的整数', trigger: 'blur' }],
-                maxUserCount: [{ required: true, message: '请输入人数限制',trigger: 'blur' }],
+                firstLevel: [{ required: true, message: '请输入一级返佣比例', trigger: 'blur' }, { pattern: /^(100|[0-9]|[1-9][0-9])$/, message: '请输入0-100的整数', trigger: 'blur' }],
+                secondLevel: [{ required: true, message: '请输入二级返佣比例', trigger: 'blur' }, { pattern: /^(100|[0-9]|[1-9][0-9])$/, message: '请输入0-100的整数', trigger: 'blur' }],
+                maxUserCount: [{ required: true, message: '请输入人数限制', trigger: 'blur' }],
             },
         }
     },
@@ -94,7 +100,7 @@ export default {
     computed: {
     },
     methods: {
-        submitForm(){
+        submitForm() {
             this.$confirm("是否确认提交?", "提示", {
                 confirmButtonText: "确定",
                 cancelButtonText: "取消",
@@ -109,7 +115,7 @@ export default {
                 distributionSet({ ...updateData }).then((response) => {
                     if (response.code == 200) {
                         this.$message({
-                            message:"提交成功!",
+                            message: "提交成功!",
                             type: "success",
                         });
                         this.get_systemconfig()
@@ -124,7 +130,7 @@ export default {
         },
 
         // 获取系统配置
-        get_systemconfig(){
+        get_systemconfig() {
             systemconfig().then((response) => {
                 if (response.code == 200) {
                     this.admin = response.data;
@@ -143,16 +149,20 @@ export default {
         margin-left: 300px;
         color: #409EFF;
         font-size: 14px;
+        cursor: pointer;
     }
 }
+
 .text1 {
     margin-top: 10px;
     margin-left: 20px;
 }
+
 .text2 {
     margin-top: 8px;
     margin-left: 30px;
 }
+
 .text3 {
     margin-top: 8px;
     margin-left: 62px;

+ 91 - 77
src/views/distribution/peopleManage/index.vue

@@ -1,7 +1,14 @@
+<!--
+ * @Descripttion: 分销员管理
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-09 16:08:16
+ * @LastEditors: zzx
+ * @LastEditTime: 2024-11-19 16:08:16
+-->
 <template>
-     
     <div class="app-container">
-        <el-card class="filter-container" shadow="never">
+        <el-card class="filter-container" shadow="hover">
             <div>
                 <i class="el-icon-search"></i>
                 <span>筛选搜索</span>
@@ -22,13 +29,13 @@
                         <el-input v-model="listQuery.phone" class="input-width" placeholder="请输入手机号码"
                             clearable></el-input>
                     </el-form-item>
-                    <!-- <el-form-item label="分销员层级:">
-                        <el-select v-model="listQuery.value" clearable placeholder="请选择">
+                    <el-form-item label="分销员层级:">
+                        <el-select v-model="listQuery.level" clearable placeholder="请选择">
                             <el-option v-for="item in options" :key="item.value" :label="item.label"
                                 :value="item.value">
                             </el-option>
                         </el-select>
-                    </el-form-item> -->
+                    </el-form-item>
                     <el-form-item label="更新时间:">
                         <el-date-picker v-model="date" size="small" value-format="yyyy-MM-dd"
                             class="item-width-350 ml10" type="datetimerange" range-separator="至"
@@ -38,7 +45,7 @@
                 </el-form>
             </div>
         </el-card>
-        <el-card class="operate-container" shadow="never">
+        <el-card class="operate-container" shadow="hover">
             <i class="el-icon-tickets"></i>
             <span>数据列表</span>
         </el-card>
@@ -48,7 +55,7 @@
                 <el-table-column label="分销员姓名" align="center" prop="userName"></el-table-column>
                 <el-table-column label="分销员层级" align="center">
                     <template slot-scope="scope">
-                        <el-tag v-if="scope.row.type == 1" type="info">普通用户</el-tag>
+                        <el-tag v-if="scope.row.type == 1 || scope.row.type == null" type="info">普通用户</el-tag>
                         <el-tag v-else-if="scope.row.type == 2" type="success">一级分销</el-tag>
                         <el-tag v-else="scope.row.type == 3" type="warning">二级分销</el-tag>
                     </template>
@@ -64,7 +71,8 @@
                     <template slot-scope="scope">
                         <el-button size="mini" type="primary" plain @click="checkQrCode(scope.row)">
                             查看二维码</el-button>
-                        <el-button size="mini" type="success" plain @click="checkJunior(scope.$index, scope.row)">查看下级</el-button>
+                        <el-button size="mini" type="success" plain
+                            @click="checkJunior(scope.$index, scope.row)">查看下级</el-button>
                         <el-button size="mini" type="info" plain @click="userEdit(scope.row)">编辑</el-button>
                     </template>
                 </el-table-column>
@@ -85,12 +93,15 @@
                     <el-input v-model="admin.userName" style="width: 250px"></el-input>
                 </el-form-item>
                 <el-form-item label="分销员层级:">
-                    <el-input type="text" disabled v-if="admin.type == 1" value="普通用户" style="width: 250px"></el-input>
-                    <el-input type="text" disabled v-else-if="admin.type == 2" value="一级分销" style="width: 250px"></el-input>
-                    <el-input type="text" disabled v-else="admin.type == 3" value="二级分销" style="width: 250px"></el-input>
+                    <el-input type="text" disabled v-if="admin.type == 1 || admin.type == null" value="普通用户"
+                        style="width: 250px"></el-input>
+                    <el-input type="text" disabled v-else-if="admin.type == 2" value="一级分销"
+                        style="width: 250px"></el-input>
+                    <el-input type="text" disabled v-else="admin.type == 3" value="二级分销"
+                        style="width: 250px"></el-input>
                 </el-form-item>
                 <el-form-item label="手机号:">
-                    <el-input v-model="admin.phone" type="number" style="width: 250px"></el-input>
+                    <el-input v-model="admin.phone" disabled type="number" style="width: 250px"></el-input>
                 </el-form-item>
                 <el-form-item label="身份证号码:">
                     <el-input v-model="admin.card" type="text" :rows="5" style="width: 250px"></el-input>
@@ -102,42 +113,30 @@
                     <el-input v-model="admin.depositBank" type="text" :rows="5" style="width: 250px"></el-input>
                 </el-form-item>
                 <el-form-item label="佣金比例:">
-                    <el-input disabled v-model="admin.level" type="text" :rows="5"
-                        style="width: 250px"></el-input>
+                    <el-input disabled v-model="admin.level" type="text" :rows="5" style="width: 250px"></el-input>
                 </el-form-item>
             </el-form>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="forbiddenDialogVisible = false" size="small">取 消</el-button>
-                <el-button type="primary" @click="handleDialogConfirm()" size="small">确 定</el-button>
+                <el-button type="primary" @click="confirmEdit" size="small">确 定</el-button>
             </span>
         </el-dialog>
-        <el-dialog title="查看下级分销员" :visible.sync="checkDialogVisible" width="80%">
-            <el-table ref="adminTable" :data="juniorlist" style="width: 100%" v-loading="listLoading" border>
-                <el-table-column label="分销员编号" width="100" align="center" prop="number"></el-table-column>
-                <el-table-column label="分销员姓名" align="center" prop="userName"></el-table-column>
-                <el-table-column label="分销员层级" align="center">
-                </el-table-column>
-                <el-table-column label="手机号" align="center" prop="phone"></el-table-column>
-                <el-table-column label="身份证号码" align="center" prop="card"></el-table-column>
-                <el-table-column label="银行卡号" align="center" prop="bankCard"></el-table-column>
-                <el-table-column label="开户行" align="center" prop="depositBank"></el-table-column>
-                <el-table-column label="佣金比例%" align="center" prop="level"></el-table-column>
-            </el-table>
-            <div class="peoplePagination">
-                <el-pagination background @size-change="juniorhandleSizeChange" @current-change="juniorhandleCurrentChange"
-                layout="total, sizes,prev, pager, next,jumper" :current-page.sync="juniorQuery.pageNum"
-                :page-size="juniorQuery.pageSize" :page-sizes="[10, 15, 20]" :total="juniorTotal">
-            </el-pagination>
-            </div>
-        </el-dialog>
         <el-dialog title="查看二维码" :visible.sync="checkQrCodeDialogVisible" width="20%">
-            <span>二维码</span>
-            <el-button type="primary" @click="handleDialogConfirm()" size="mini">下载二维码</el-button>
+            <div style="text-align: center;">
+                <el-image class="qrCode" style="" :src="qrCodeImg">
+                    <div slot="error" class="image-slot">
+                        <i class="el-icon-loading"></i>
+                    </div>
+                </el-image>
+            </div>
+            <div style="text-align: center;margin-top: 20px;">
+                <el-button type="success" @click="downloadQrCode" lazy size="mini">下载二维码</el-button>
+            </div>
         </el-dialog>
     </div>
 </template>
 <script>
-import { peopleList,getJuniorList,getQrcode } from "@/api/distribution";
+import { peopleList, getJuniorList, getQrcode,peopleEdit } from "@/api/distribution";
 import { formatDate } from "@/utils/date";
 
 const defaultListQuery = {
@@ -147,12 +146,7 @@ const defaultListQuery = {
     phone: null,
     startTime: '',
     endTime: '',
-    value: ''
-};
-const juniorListQuery = {
-    pageNum: 1,
-    pageSize: 10,
-    userId: null,
+    level: ''
 };
 const defaultAdmin = {
     id: null,
@@ -164,28 +158,22 @@ const defaultAdmin = {
     status: 1,
 };
 export default {
-    name: "upCheck",
+    name: "peopleManage",
     data() {
         return {
             date: "",
+            qrCodeImg: "",
             listQuery: Object.assign({}, defaultListQuery),
-            juniorQuery: Object.assign({}, juniorListQuery),
             list: null,
-            juniorlist: null,
             total: null,
-            juniorTotal: null,
             listLoading: false,
             admin: Object.assign({}, defaultAdmin),
             forbiddenDialogVisible: false,
-            checkDialogVisible: false,
             checkQrCodeDialogVisible: false,
             options: [{
-                value: 1,
-                label: '普通用户'
-            }, {
                 value: 2,
                 label: '一级'
-            },{
+            }, {
                 value: 3,
                 label: '二级'
             }],
@@ -216,29 +204,58 @@ export default {
     },
     methods: {
         // 编辑
-        userEdit(row){
-            this.forbiddenDialogVisible= true;
-            this.admin=row;
+        userEdit(row) {
+            this.forbiddenDialogVisible = true;
+            this.admin = row;
+        },
+        confirmEdit(){
+            let data={
+                userName: this.admin.userName,
+                adminUserId: this.admin.adminUserId,
+                bankCard: this.admin.bankCard,
+                card: this.admin.card,
+                depositBank: this.admin.depositBank,
+            }
+            peopleEdit({...data}).then(res => {
+                if(res.code == 200){
+                    this.$message({
+                        message: '修改成功',
+                        type: 'success'
+                    });
+                    this.forbiddenDialogVisible = false;
+                    this.getList();
+                }
+            })
         },
 
         // 查看二维码
-        checkQrCode(row){
+        checkQrCode(row) {
             this.checkQrCodeDialogVisible = true;
-            getQrcode({adminUserId:row.adminUserId,userId:row.id}).then((res) => {
-                if (res.code == 200) {
-                    
-                }
+            getQrcode({ adminUserId: row.adminUserId, userId: row.id }).then(res => {
+                const blob = new Blob([res.data], { type: 'image/png' });
+                const objectUrl = URL.createObjectURL(blob);
+                this.qrCodeImg = objectUrl;
             })
         },
+
+        // 下载
+        downloadQrCode() {
+            const a = document.createElement('a');
+            a.href = this.qrCodeImg;
+            a.download = '二维码.jpg'; // 下载后的文件名
+            document.body.appendChild(a);
+            a.click();
+            document.body.removeChild(a);
+        },
+
         // 查看下级
         checkJunior(index, row) {
-            this.juniorQuery.userId=row.id
-            this.checkDialogVisible = true;
-            getJuniorList(this.juniorQuery).then((res) => {
-                if (res.code == 200) {
-                    this.juniorList = res.data.list;
-                }
-            })
+            this.$router.push({
+                name: "junior",
+                query: {
+                    adminUserId: row.adminUserId,
+                },
+            });
         },
         handleResetSearch() {
             this.listQuery = Object.assign({}, defaultListQuery);
@@ -256,15 +273,6 @@ export default {
             this.listQuery.pageNum = val;
             this.getList();
         },
-        juniorhandleSizeChange(val) {
-            this.juniorQuery.pageNum = 1;
-            this.juniorQuery.pageSize = val;
-            // this.getList();
-        },
-        juniorhandleCurrentChange(val) {
-            this.juniorQuery.pageNum = val;
-            // this.getList();
-        },
         getList() {
             this.listLoading = true;
             peopleList(this.listQuery).then((response) => {
@@ -277,9 +285,15 @@ export default {
 };
 </script>
 <style scoped>
-.peoplePagination{
+.peoplePagination {
     margin-top: 10px;
     display: flex;
     justify-content: right;
 }
+
+.qrCode {
+    width: 110px;
+    height: 110px;
+    border-radius: 6px;
+}
 </style>

+ 98 - 0
src/views/distribution/peopleManage/junior.vue

@@ -0,0 +1,98 @@
+<!--
+ * @Descripttion: 下级查看
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-09 16:08:16
+ * @LastEditors: zzx
+ * @LastEditTime: 2024-11-19 16:08:16
+-->
+<template>
+    <div class="app-container">
+        <el-card class="filter-container" shadow="hover">
+            <el-button size="small" type="info" icon="el-icon-back" @click="comeBack">返回</el-button>
+        </el-card>
+        <div class="table-container">
+            <el-table ref="adminTable" :data="list" style="width: 100%" v-loading="juniorListLoading" border>
+                <el-table-column label="分销员编号" width="100" align="center" prop="number"></el-table-column>
+                <el-table-column label="分销员姓名" align="center" prop="userName"></el-table-column>
+                <el-table-column label="分销员层级" align="center">
+                    <template slot-scope="scope">
+                        <el-tag v-if="scope.row.type == 1 || scope.row.type == null" type="info">普通用户</el-tag>
+                        <el-tag v-else-if="scope.row.type == 2" type="success">一级分销</el-tag>
+                        <el-tag v-else="scope.row.type == 3" type="warning">二级分销</el-tag>
+                    </template>
+                </el-table-column>
+                <el-table-column label="手机号" align="center" prop="phone"></el-table-column>
+                <el-table-column label="身份证号码" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.card || '--'}}
+                    </template>
+                </el-table-column>
+                <el-table-column label="银行卡号" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.bankCard || '--'}}
+                    </template>
+                </el-table-column>
+                <el-table-column label="开户行" align="center" prop="depositBank"></el-table-column>
+                <el-table-column label="佣金比例%" align="center" prop="level">
+                    <template slot-scope="scope">
+                        {{ scope.row.level ||'--' }}
+                    </template>
+                </el-table-column>
+            </el-table>
+        </div>
+        <div class="pagination-container">
+            <el-pagination background @size-change="juniorhandleSizeChange" @current-change="juniorhandleCurrentChange"
+                layout="total, sizes,prev, pager, next,jumper" :current-page.sync="juniorQuery.pageNum"
+                :page-size="juniorQuery.pageSize" :page-sizes="[10, 15, 20]" :total="total">
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { getJuniorList } from "@/api/distribution";
+const juniorListQuery = {
+    pageNum: 1,
+    pageSize: 10,
+    userId: null,
+};
+export default {
+    name: "junior",
+    data() {
+        return {
+            juniorQuery: Object.assign({}, juniorListQuery),
+            list: null,
+            total: null,
+            juniorListLoading: false,
+        };
+    },
+    created() {
+        this.juniorQuery.userId = this.$route.query.adminUserId
+        this.getList();
+    },
+    methods: {
+        // 返回上一级
+        comeBack() {
+            this.$router.back()
+        },
+        juniorhandleSizeChange(val) {
+            this.juniorQuery.pageNum = 1;
+            this.juniorQuery.pageSize = val;
+            this.getList();
+        },
+        juniorhandleCurrentChange(val) {
+            this.juniorQuery.pageNum = val;
+            this.getList();
+        },
+        getList() {
+            this.juniorListLoading = true;
+            getJuniorList(this.juniorQuery).then((response) => {
+                this.juniorListLoading = false;
+                this.list = response.data.list;
+                this.total = response.data.total;
+            });
+        },
+    },
+};
+</script>
+<style scoped></style>

+ 11 - 5
src/views/distribution/records/index.vue

@@ -1,7 +1,14 @@
+<!--
+ * @Descripttion: 分销记录
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-09 16:08:16
+ * @LastEditors: zzx
+ * @LastEditTime: 2024-11-19 16:08:16
+-->
 <template>
-     
     <div class="app-container">
-        <el-card class="filter-container" shadow="never">
+        <el-card class="filter-container" shadow="hover">
             <div>
                 <i class="el-icon-search"></i>
                 <span>筛选搜索</span>
@@ -54,7 +61,7 @@
                 </el-form>
             </div>
         </el-card>
-        <el-card class="operate-container" shadow="never">
+        <el-card class="operate-container" shadow="hover">
             <div class="title">
                 <div class="titleContent">
                     <i class="el-icon-tickets"></i>
@@ -70,7 +77,6 @@
         </el-card>
         <div class="table-container">
             <el-table ref="adminTable" :data="list" style="width: 100%" v-loading="listLoading" border>
-                <el-table-column type="selection" width="55"> </el-table-column>
                 <el-table-column label="充电订单编号" width="100" align="center" prop="chargeOrderNo"></el-table-column>
                 <el-table-column label="订单金额/元" align="center" prop="realCost"></el-table-column>
                 <el-table-column label="服务费金额/元" align="center" prop="realServiceCost"></el-table-column>
@@ -143,7 +149,7 @@ const defaultListQuery = {
     adminUserId: "",
 };
 export default {
-    name: "upCheck",
+    name: "records",
     data() {
         return {
             completeDate: "",

+ 24 - 12
src/views/distribution/statistics/index.vue

@@ -1,7 +1,14 @@
+<!--
+ * @Descripttion: 业绩统计
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-09 16:08:16
+ * @LastEditors: zzx
+ * @LastEditTime: 2024-11-19 16:08:16
+-->
 <template>
-     
     <div class="app-container">
-        <el-card class="filter-container" shadow="never">
+        <el-card class="filter-container" shadow="hover">
             <div>
                 <i class="el-icon-search"></i>
                 <span>筛选搜索</span>
@@ -25,7 +32,7 @@
                 </el-form>
             </div>
         </el-card>
-        <el-card class="operate-container" shadow="never">
+        <el-card class="operate-container" shadow="hover">
             <div class="title">
                 <div class="titleContent">
                     <i class="el-icon-tickets"></i>
@@ -41,15 +48,20 @@
                 <el-table-column label="分销员姓名" width="100" align="center" prop="userName"></el-table-column>
                 <el-table-column label="分销员手机号" align="center" prop="phone"></el-table-column>
                 <el-table-column label="用户购券金额/元" align="center" prop="userTopAllMoney"></el-table-column>
-                <el-table-column label="待清算金/元" align="center" prop="unconsumedMoney"></el-table-column>
+                <el-table-column label="待清算金/元" align="center" prop="unconsumedMoney"></el-table-column>
                 <el-table-column label="用户退款金额/元" align="center" prop="userRefundAllMoney"></el-table-column>
                 <el-table-column label="待结算佣金/元" align="center">
                     <template slot-scope="scope">
-                        <span class="pushRecords" @click="pushRecords(scope.row)">{{ scope.row.unSettleAccountMoney || '0'
-                            }}</span>
+                        <span class="pushRecords" @click="pushRecords(scope.row)">{{ scope.row.unSettleAccountMoney ||
+                            '0' }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="已结算佣金/元" align="center">
+                    <template slot-scope="scope">
+                        <span class="pushRecords" @click="pushRecords(scope.row)">{{ scope.row.settleAccountMoney ||
+                            '0' }}</span>
                     </template>
                 </el-table-column>
-                <el-table-column label="已结算佣金/元" align="center" prop="settleAccountMoney"></el-table-column>
                 <el-table-column label="操作" width="180" align="center">
                     <template slot-scope="scope">
                         <el-button size="mini" type="warning" plain @click="withdrawApplyfor(scope.row)">
@@ -65,14 +77,14 @@
                 :page-size="listQuery.pageSize" :page-sizes="[10, 15, 20]" :total="total">
             </el-pagination>
         </div>
-        <el-dialog title="提现申请" :visible.sync="forbiddenDialogVisible" width="40%">
+        <el-dialog title="提现申请" :visible.sync="forbiddenDialogVisible" width="40%" center>
             <el-descriptions border>
                 <el-descriptions-item label="分销员姓名">{{ dialogQuery.userName }}</el-descriptions-item>
                 <el-descriptions-item label="分销员手机号">{{ dialogQuery.phone }}</el-descriptions-item>
-                <el-descriptions-item label="本次提现订单数/笔">{{ '--' }}</el-descriptions-item>
+                <el-descriptions-item label="本次提现订单数/笔">{{ dialogQuery.orderCount||'--' }}</el-descriptions-item>
                 <el-descriptions-item label="本次提现金额/元">{{ dialogQuery.unSettleAccountMoney }}</el-descriptions-item>
             </el-descriptions>
-            <div style="margin-top: 10px;font-size: 14px;">说明:提现的订单为今天(2024-11-14)之前</div>
+            <div style="margin-top: 10px;font-size: 14px;color: #F4B01D ;">说明:提现的订单为今天( {{ new Date().toLocaleDateString() }} )之前</div>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="forbiddenDialogVisible = false" size="small">取 消</el-button>
                 <el-button type="primary" @click="confirmRequest" size="small">确
@@ -95,7 +107,7 @@ const defaultListQuery = {
     endTime: ''
 };
 export default {
-    name: "upCheck",
+    name: "statistics",
     data() {
         return {
             downloadLoading: false,
@@ -137,7 +149,7 @@ export default {
             this.$router.push({
                 path: "/distribution/records",
                 query: {
-                    adminUserId:row.adminUserId,
+                    adminUserId: row.adminUserId,
                 },
             });
         },

+ 89 - 33
src/views/distribution/userList/index.vue

@@ -1,7 +1,14 @@
+<!--
+ * @Descripttion: 用户列表
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-09 16:08:16
+ * @LastEditors: zzx
+ * @LastEditTime: 2024-11-19 16:08:16
+-->
 <template>
-     
     <div class="app-container">
-        <el-card class="filter-container" shadow="never">
+        <el-card class="filter-container" shadow="hover">
             <div>
                 <i class="el-icon-search"></i>
                 <span>筛选搜索</span>
@@ -31,17 +38,21 @@
                 </el-form>
             </div>
         </el-card>
-        <el-card class="operate-container" shadow="never">
+        <el-card class="operate-container" shadow="hover">
             <i class="el-icon-tickets"></i>
             <span>数据列表</span>
         </el-card>
         <div class="table-container">
             <el-table ref="adminTable" :data="list" style="width: 100%" v-loading="listLoading" border>
-                <el-table-column label="昵称" width="100" align="center" prop="nickName"></el-table-column>
-                <el-table-column label="手机号" align="center" prop="phone"></el-table-column>
+                <el-table-column label="昵称" width="100" align="center">
+                    <template slot-scope="scope">{{ scope.row.nickName || '--' }}</template>
+                </el-table-column>
+                <el-table-column label="手机号" align="center">
+                    <template slot-scope="scope">{{ scope.row.phone || '--' }}</template>
+                </el-table-column>
                 <el-table-column label="属性" align="center" prop="updateBy">
                     <template slot-scope="scope">
-                        <el-tag v-if="scope.row.type == 1" type="info">普通用户</el-tag>
+                        <el-tag v-if="scope.row.type == 1 || scope.row.type == null" type="info">普通用户</el-tag>
                         <el-tag v-else-if="scope.row.type == 2" type="success">一级分销</el-tag>
                         <el-tag v-else-if="scope.row.type == 3" type="warning">二级分销</el-tag>
                     </template>
@@ -49,14 +60,20 @@
                 <el-table-column label="注册时间" align="center" prop="createTime"></el-table-column>
                 <el-table-column label="操作" align="center">
                     <template slot-scope="scope">
-                        <el-button v-if="scope.row.createBy === 'admin'" size="mini" type="warning" plain
-                            @click="get_settingType(scope.$index, scope.row)">
-                            设为一级分销员
-                        </el-button>
-                        <el-button size="mini" type="warning" plain @click="get_settingType(scope.$index, scope.row)">
-                            设为二级分销员
-                        </el-button>
-                        <el-button size="mini" type="primary" plain @click="checkBindUser(scope.$index, scope.row)">
+                        <span v-if="isAdmin == 0">
+                            <el-button v-if="scope.row.type==1" size="mini" type="success" plain
+                                @click="get_settingType(scope.$index, scope.row)">
+                                设为一级分销员
+                            </el-button>
+                        </span>
+                        <span v-else>
+                            <el-button v-if="isAdmin==2" size="mini" type="warning" plain
+                                @click="get_settingType(scope.$index, scope.row)">
+                                设为二级分销员
+                            </el-button>
+                        </span>
+                        <el-button size="mini" v-if="scope.row.type != 1 && scope.row.type != null" type="primary" plain
+                            @click="checkBindUser(scope.$index, scope.row)">
                             查看绑定用户
                         </el-button>
                     </template>
@@ -69,36 +86,52 @@
                 :page-size="listQuery.pageSize" :page-sizes="[10, 15, 20]" :total="total">
             </el-pagination>
         </div>
-        <el-dialog title="查看绑定用户" :visible.sync="forbiddenDialogVisible" width="30%">
-            <el-table ref="adminTable" :data="list" style="width: 100%" v-loading="dialogListLoading" border>
+        <el-dialog title="查看绑定用户" :visible.sync="forbiddenDialogVisible" width="60%" :before-close="handleClose">
+            <el-table ref="adminTable" :data="dialogList" style="width: 100%" v-loading="dialogListLoading" border>
                 <el-table-column label="序号" width="100" align="center" prop="id"></el-table-column>
                 <el-table-column label="姓名" align="center" prop="nickName"></el-table-column>
                 <el-table-column label="手机号" align="center" prop="phone"></el-table-column>
             </el-table>
+            <div style="margin-top: 20px;text-align: right;">
+                <el-pagination background @size-change="handleSizeChangeDialog"
+                    @current-change="handleCurrentChangeDialog" layout="total, sizes,prev, pager, next,jumper"
+                    :current-page.sync="dialogListQuery.pageNum" :page-size="dialogListQuery.pageSize"
+                    :page-sizes="[10, 15, 20]" :total="dialogTotal">
+                </el-pagination>
+            </div>
         </el-dialog>
     </div>
 </template>
 <script>
 import { userList, settingType } from "@/api/distribution";
 import { formatDate } from "@/utils/date";
-
+import { getCookie } from '@/utils/support';
 const defaultListQuery = {
     pageNum: 1,
     pageSize: 10,
-    nickName: null,
     admin_user_id: null,
+    nickName: null,
     phone: null,
-    startTime: '',
-    endTime: ''
+    registerStartTime: '',
+    registerEndTime: ''
+};
+const dialogDefaultListQuery = {
+    pageNum: 1,
+    pageSize: 10,
+    admin_user_id: null,
 };
 export default {
-    name: "upCheck",
+    name: "userList",
     data() {
         return {
+            isAdmin: sessionStorage.getItem("type"),
             date: "",
             listQuery: Object.assign({}, defaultListQuery),
+            dialogListQuery: Object.assign({}, dialogDefaultListQuery),
             list: null,
+            dialogList: null,
             total: null,
+            dialogTotal: null,
             listLoading: false,
             dialogListLoading: false,
             forbiddenDialogVisible: false
@@ -107,16 +140,17 @@ export default {
     watch: {
         date(val) {
             if (val) {
-                this.listQuery.startTime = Date.parse(val[0]);
-                this.listQuery.endTime = Date.parse(val[1]);
+                this.listQuery.registerStartTime = Date.parse(val[0]);
+                this.listQuery.registerEndTime = Date.parse(val[1]);
             } else {
-                this.listQuery.startTime = "";
-                this.listQuery.endTime = "";
+                this.listQuery.registerStartTime = "";
+                this.listQuery.registerEndTime = "";
             }
         },
     },
     created() {
         this.getList();
+
     },
     filters: {
         formatDateTime(time) {
@@ -130,7 +164,7 @@ export default {
     methods: {
         // 设置分销
         get_settingType(idnex, row) {
-            this.$confirm("是否确认提交?", "提示", {
+            this.$confirm("是否确认?", "提示", {
                 confirmButtonText: "确定",
                 cancelButtonText: "取消",
                 type: "warning",
@@ -158,6 +192,7 @@ export default {
         // 查看绑定用户
         checkBindUser(index, row) {
             this.listQuery.admin_user_id = row.id;
+            this.dialogListQuery.admin_user_id = row.id;
             this.forbiddenDialogVisible = true;
             this.getList();
         },
@@ -165,7 +200,7 @@ export default {
             this.listQuery = Object.assign({}, defaultListQuery);
         },
         handleSearchList() {
-            this.listQuery.admin_user_id=null
+            this.listQuery.admin_user_id = null
             this.listQuery.pageNum = 1;
             this.getList();
         },
@@ -178,18 +213,39 @@ export default {
             this.listQuery.pageNum = val;
             this.getList();
         },
+
+        // dialog内事件
+        handleSizeChangeDialog(val) {
+            this.dialogListQuery.pageNum = 1;
+            this.dialogListQuery.pageSize = val;
+            this.getList();
+        },
+        handleCurrentChangeDialog(val) {
+            this.dialogListQuery.pageNum = val;
+            this.getList();
+        },
+        handleClose() {
+            this.forbiddenDialogVisible = false;
+            this.dialogListQuery.pageNum = 1;
+            this.listQuery.admin_user_id = null
+        },
+
         getList() {
             if (this.listQuery.admin_user_id == null) {
                 this.listLoading = true;
+                userList(this.listQuery).then((response) => {
+                    this.listLoading = false;
+                    this.list = response.data.list;
+                    this.total = response.data.total;
+                });
             } else {
                 this.dialogListLoading = true;
+                userList(this.dialogListQuery).then((response) => {
+                    this.dialogListLoading = false;
+                    this.dialogList = response.data.list;
+                    this.dialogTotal = response.data.total;
+                });
             }
-            userList(this.listQuery).then((response) => {
-                this.listLoading = false;
-                this.dialogListLoading = false;
-                this.list = response.data.list;
-                this.total = response.data.total;
-            });
         },
     },
 };

+ 1 - 0
src/views/layout/components/Sidebar/index.vue

@@ -8,6 +8,7 @@
       background-color="#304156"
       text-color="#bfcbd9"
       active-text-color="#409EFF"
+      :unique-opened="false"
     >
       <sidebar-item :routes="routes"></sidebar-item>
     </el-menu>