Selaa lähdekoodia

对接分销功能接口 -zzx

zouzexu 6 kuukautta sitten
vanhempi
commit
2cdc382ad7

+ 1 - 1
index.html

@@ -3,7 +3,7 @@
   <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
-    <title>中数电动渠道管理后台</title>
+    <title>中数电动管理平台</title>
     <!-- Google tag (gtag.js) -->
     <script async src="https://www.googletagmanager.com/gtag/js?id=G-73YJPXJTLX"></script>
     <script>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 410 - 68
package-lock.json


+ 4 - 1
package.json

@@ -10,9 +10,11 @@
     "build": "node build/build.js"
   },
   "dependencies": {
+    "ali-oss": "^6.21.0",
     "axios": "^0.18.0",
     "echarts": "^4.2.0-rc.2",
     "element-ui": "^2.3.7",
+    "file-saver": "^2.0.5",
     "js-cookie": "^2.2.0",
     "normalize.css": "^8.0.0",
     "nprogress": "^0.2.0",
@@ -21,7 +23,8 @@
     "v-distpicker": "^1.0.20",
     "vue": "^2.7.2",
     "vue-router": "^3.0.1",
-    "vuex": "^3.0.1"
+    "vuex": "^3.0.1",
+    "xlsx": "^0.16.0"
   },
   "devDependencies": {
     "autoprefixer": "^7.1.2",

+ 1 - 1
src/App.vue

@@ -10,5 +10,5 @@
   }
 </script>
 
-<style>
+<style scoped lang="scss">
 </style>

+ 0 - 1
src/api/channel.js

@@ -1,5 +1,4 @@
 import request from '@/utils/request'
-import { status } from 'nprogress'
 
 //渠道列表
 export function channelList(params) {

+ 73 - 0
src/api/distribution.js

@@ -0,0 +1,73 @@
+import request from "@/utils/request";
+
+//系统配置
+export function systemconfig(params) {
+  return request({
+    url: "/ums/umsSystemConfig/getSystemConfig",
+    method: "get",
+    params: params,
+  });
+}
+
+//分销比例设置
+export function distributionSet(data) {
+  return request({
+    url: "/ums/umsSystemConfig/updateSystemConfig",
+    method: "post",
+    data: data,
+  });
+}
+
+//用户列表
+export function userList(params) {
+  return request({
+    url: "/ums/umsAdminUser/getDistributionList",
+    method: "get",
+    params: params,
+  });
+}
+
+//分销商列表
+export function peopleList(params) {
+  return request({
+    url: "/ums/umsAdminUser/list",
+    method: "get",
+    params: params,
+  });
+}
+
+//分销员下级列表
+export function getJuniorList(params) {
+  return request({
+    url: "/ums/umsAdminUser/getSubordinate",
+    method: "get",
+    params: params,
+  });
+}
+
+//分销商列表
+export function performanceList(params) {
+  return request({
+    url: "/ums/umsAdminUser/getPerformanceStatisticsList",
+    method: "get",
+    params: params,
+  });
+}
+
+//设置分销等级
+export function settingType(data) {
+  return request({
+    url: "/ums/umsAdminUser/setDistribution",
+    method: "post",
+    data: data,
+  });
+}
+
+//获取二维码
+export function getQrcode(data) {
+  return request({
+    url: "/ums/umsAdminUser/distributionBindUser",
+    method: "post",
+    data: data,
+  });
+}

+ 7 - 3
src/api/oss.js

@@ -1,7 +1,11 @@
 import request from '@/utils/request'
-export function policy() {
+export function policy(data) {
   return request({
-    url:'/aliyun/oss/policy',
-    method:'get',
+    url:'/ums/fileCtl/upload',
+    method:'post',
+    headers:{
+      "Content-Type":"multipart/form-data",
+    },
+    data:data
   })
 }

+ 2 - 3
src/components/Upload/multiUpload.vue

@@ -21,7 +21,6 @@
 </template>
 <script>
   import {policy} from '@/api/oss'
-
   export default {
     name: 'multiUpload',
     props: {
@@ -45,9 +44,9 @@
         },
         dialogVisible: false,
         dialogImageUrl:null,
-        useOss:false, //使用oss->true;使用MinIO->false
+        useOss:true, //使用oss->true;使用MinIO->false
         ossUploadUrl:'http://macro-oss.oss-cn-shenzhen.aliyuncs.com',
-        minioUploadUrl:'http://localhost:8080/minio/upload',
+        minioUploadUrl:'http://192.168.2.21:8080/zs/channel/admin/ums/fileCtl/upload',
       };
     },
     computed: {

+ 3 - 4
src/components/Upload/singleUpload.vue

@@ -20,7 +20,6 @@
 </template>
 <script>
   import {policy} from '@/api/oss'
-
   export default {
     name: 'singleUpload',
     props: {
@@ -63,9 +62,9 @@
           // callback:'',
         },
         dialogVisible: false,
-        useOss:false, //使用oss->true;使用MinIO->false
-        ossUploadUrl:'http://macro-oss.oss-cn-shenzhen.aliyuncs.com',
-        minioUploadUrl:'http://localhost:8080/minio/upload',
+        useOss:true, //使用oss->true;使用MinIO->false
+        ossUploadUrl:'http://192.168.2.21:8080/zs/channel/admin/ums/fileCtl/upload',
+        minioUploadUrl:'http://192.168.2.21:8080/zs/channel/admin/ums/fileCtl/upload',
       };
     },
     methods: {

+ 141 - 0
src/components/Upload/uploadImg.vue

@@ -0,0 +1,141 @@
+<template>
+    <div>
+            <!-- :on-change="uploadFile" -->
+            <el-upload :limit="limit" action accept="image/*" :on-change="uploadFile" list-type="picture-card"
+                :auto-upload="false" :file-list="fileList" :on-exceed="handleExceed"
+                :on-preview="handlePictureCardPreview" :on-remove="handleRemove" ref="upload" class="avatar-uploader"
+                :class="{ hide: showUpload }" :disabled="disabled">
+                <i class="el-icon-plus"></i>
+            </el-upload>
+            <el-dialog width="30%" :visible.sync="dialogVisible">
+                <img width="100%" :src="imgUrl.url" alt />
+            </el-dialog>
+            <!-- <Button text="上 传" type="add_u" style="margin-top: 10px;" @click.native="submitUpload"></Button> -->
+    </div>
+</template>
+
+<script>
+//引入上传图片接口
+  import {policy} from '@/api/oss'
+// import { uploadImg } from "@/api/public/api";
+export default {
+    props: {
+        limit: Number,
+        fileList: Array,
+        disabled: Boolean,
+    },
+    data() {
+        return {
+            showUpload: false, //控制limit最大值之后 关闭上传按钮
+            dialogVisible: false, //查看图片弹出框
+            imgUrl: [], //上传图片后地址合集
+        };
+    },
+    //监听上传图片的数组(为了处理修改时,自动渲染问题,和上传按钮消失问题);
+    watch: {
+        fileList(newName, oldName) {
+            if (newName.length == this.limit) this.showUpload = true;
+            else this.showUpload = false;
+        },
+    },
+    methods: {
+        //文件列表移除文件时的函数
+        handleRemove(file, fileList) {
+            const index = this.fileList.findIndex((item) => item === file.uid);
+            this.imgUrl.splice(index, 1);
+            this.$emit("delUrl", this.imgUrl);
+            if (fileList.length < this.limit) this.showUpload = false;
+        },
+        //点击文件列表中已上传的文件时的函数
+        handlePictureCardPreview(file) {
+            this.imgUrl.url = file.url;
+            this.dialogVisible = true;
+        },
+        //这里是不需要直接上传而是通过按钮上传的方法
+        submitUpload() {
+            this.$refs.upload.submit();
+        },
+        //文件状态改变时的函数(主要逻辑函数)
+        uploadFile(e, fileList) {
+            //判断用户上传最大数量限制,来让上传按钮消失
+            if (fileList.length >= this.limit) this.showUpload = true;
+            // const file = e.file; <- 这里是不需要直接上传而是通过按钮上传的
+            const file = e.raw; // <- 这里是直接上传的
+            //大小
+            const size = file.size / 1024 / 1024 / 2;
+            if (
+                !(
+                    file.type === "image/png" ||
+                    file.type === "image/gif" ||
+                    file.type === "image/jpg" ||
+                    file.type === "image/jpeg"
+                )
+            ) {
+                this.$notify.warning({
+                    title: "警告",
+                    message:
+                        "请上传格式为image/png, image/gif, image/jpg, image/jpeg的图片",
+                });
+            } else if (size > 2) {
+                this.$notify.warning({
+                    title: "警告",
+                    message: "图片大小必须小于2M",
+                });
+            } else {
+                if (this.limit == 1) this.imgUrl = []; //此处判断为一张的时候需要清空数组
+                const params = new FormData();
+                params.append("fileMut", file);
+                policy(params).then((res) => {
+                    //这里返回的数据结构(根据自己返回结构进行修改)
+                    if (res.code ===200 ) {
+                        this.$message.success("上传成功");
+                        this.imgUrl = res.data;
+                        //调用父组件的方法来传递图片参数
+                        this.$emit("getUrl", this.imgUrl);
+                    } else this.$message.error("上传失败");
+                });
+            }
+        },
+        //文件超出个数限制时的函数
+        handleExceed(files, fileList) {
+            this.$message.info(`最多只允许上传${this.limit}张图片`);
+        },
+    },
+};
+</script>
+
+<style scope>
+.hide .el-upload--picture-card {
+    display: none !important;
+}
+
+.avatar-uploader>.el-upload {
+    width: 100px;
+    height: 100px;
+    line-height: 100px;
+    border-radius: 0px;
+    background: #fff;
+    border: 1px dashed #ccc;
+}
+
+.avatar-uploader>.el-upload>i {
+    font-size: 28px;
+    color: #ccc;
+}
+
+.avatar-uploader>.el-upload-list {
+    display: block;
+}
+
+.avatar-uploader>.el-upload-list>.el-upload-list__item {
+    width: 100px;
+    height: 100px;
+    display: block;
+}
+
+.avatar-uploader>.el-upload-list>.el-upload-list__item>img {
+    width: 100px;
+    height: 100px;
+    border-radius: 0px;
+}
+</style>

+ 1 - 0
src/icons/svg/peopleChannel.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1731662436297" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6461" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M537.3 354.69H253.87c-18.06 0-32.69-14.64-32.69-32.7 0-18.06 14.64-32.69 32.69-32.7H537.3c18.06-0.02 32.71 14.61 32.73 32.66 0.02 18.06-14.6 32.71-32.66 32.73h-0.07zM421 529.14H253.87c-17.5-0.79-31.29-15.21-31.29-32.73 0-17.52 13.78-31.94 31.29-32.73h167.2a32.756 32.756 0 0 1 29.6 15.92 32.782 32.782 0 0 1 0 33.61 32.764 32.764 0 0 1-29.6 15.93H421z m0 174.44H253.87c-17.5-0.79-31.29-15.21-31.29-32.73 0-17.52 13.78-31.94 31.29-32.73h167.2a32.744 32.744 0 0 1 29.6 15.93 32.782 32.782 0 0 1 0 33.61 32.764 32.764 0 0 1-29.6 15.93H421z m322.5-99.35a54.508 54.508 0 0 0-49.43 26.41 54.498 54.498 0 0 0 49.43 82.45c29.01-1.43 51.8-25.38 51.8-54.43s-22.78-53-51.8-54.43z m141.75 324.23c-15.65-0.07-29.08-11.2-32.03-26.58-9.78-52.86-55.89-91.22-109.65-91.22-53.76 0-99.87 38.36-109.65 91.22a32.824 32.824 0 0 1-21 27.07 32.814 32.814 0 0 1-33.66-6.36 32.791 32.791 0 0 1-9.66-32.86c11.14-59.18 51.75-108.56 107.65-130.92-43.93-29.19-63.57-83.71-48.32-134.21 15.25-50.5 61.77-85.05 114.52-85.05 52.75 0 99.27 34.55 114.51 85.05 15.25 50.5-4.39 105.02-48.32 134.21 55.88 22.37 96.44 71.75 107.52 130.92 1.82 9.52-0.7 19.37-6.86 26.85a32.72 32.72 0 0 1-25.05 11.88z m-464.25 0.4H169.34c-36.13-0.04-65.42-29.32-65.46-65.46V180.25c0.04-36.14 29.32-65.42 65.46-65.46h684.48c36.12 0.04 65.39 29.33 65.39 65.46v308.88a32.698 32.698 0 0 1-49.05 28.32 32.698 32.698 0 0 1-16.35-28.32V180.25H169.34V863.4H421a32.766 32.766 0 0 1 29.6 49.54 32.797 32.797 0 0 1-29.6 15.92z m0 0" p-id="6462"></path></svg>

+ 1 - 0
src/icons/svg/performance.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1731662600101" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7573" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M959.3 834.7v-677c0-50.7-41.1-91.9-91.9-91.9h-677c-50.7 0-91.9 41.1-91.9 91.9V676l266.9-286.2c3.6-3.9 8.7-6.2 14.2-5.9 5.4 0.1 10.4 2.6 13.9 6.7l172.6 207.1 197.8-243.5-63.6 10.6c-10.3 1.7-19.8-5.2-21.6-15.3-1.7-10.2 5.2-19.8 15.3-21.6l112.3-18.7c5.5-0.9 11 0.6 15.1 4.1 1.9 1.6 3.4 3.5 4.5 5.6 0 0 0 0.1 0.1 0.1 0.2 0.4 0.4 0.9 0.6 1.3 0.1 0.3 0.2 0.5 0.3 0.8 0.1 0.3 0.2 0.5 0.3 0.8 0.7 2.2 1 4.6 0.9 6.9V440c0.1 10.4-8.3 18.7-18.7 18.7s-18.7-8.4-18.7-18.7v-59.5L580.8 639c-3.5 4.4-8.8 6.8-14.4 6.9h-0.1c-5.6 0-10.8-2.5-14.4-6.7L378.4 431 98.5 731v103.7c0 50.7 41.1 91.9 91.9 91.9h677c50.7 0 91.9-41.2 91.9-91.9z" p-id="7574"></path></svg>

+ 1 - 0
src/icons/svg/setting.svg

@@ -0,0 +1 @@
+<svg t="1731661304238" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4448" width="200" height="200"><path d="M919.6 405.6l-57.2-8c-12.7-1.8-23-10.4-28-22.1-11.3-26.7-25.7-51.7-42.9-74.5-7.7-10.2-10-23.5-5.2-35.3l21.7-53.5c6.7-16.4 0.2-35.3-15.2-44.1L669.1 96.6c-15.4-8.9-34.9-5.1-45.8 8.9l-35.4 45.3c-7.9 10.2-20.7 14.9-33.5 13.3-14-1.8-28.3-2.8-42.8-2.8-14.5 0-28.8 1-42.8 2.8-12.8 1.6-25.6-3.1-33.5-13.3l-35.4-45.3c-10.9-14-30.4-17.8-45.8-8.9L230.4 168c-15.4 8.9-21.8 27.7-15.2 44.1l21.7 53.5c4.8 11.9 2.5 25.1-5.2 35.3-17.2 22.8-31.7 47.8-42.9 74.5-5 11.8-15.3 20.4-28 22.1l-57.2 8C86 408 72.9 423 72.9 440.8v142.9c0 17.7 13.1 32.7 30.6 35.2l57.2 8c12.7 1.8 23 10.4 28 22.1 11.3 26.7 25.7 51.7 42.9 74.5 7.7 10.2 10 23.5 5.2 35.3l-21.7 53.5c-6.7 16.4-0.2 35.3 15.2 44.1L354 927.8c15.4 8.9 34.9 5.1 45.8-8.9l35.4-45.3c7.9-10.2 20.7-14.9 33.5-13.3 14 1.8 28.3 2.8 42.8 2.8 14.5 0 28.8-1 42.8-2.8 12.8-1.6 25.6 3.1 33.5 13.3l35.4 45.3c10.9 14 30.4 17.8 45.8 8.9l123.7-71.4c15.4-8.9 21.8-27.7 15.2-44.1l-21.7-53.5c-4.8-11.8-2.5-25.1 5.2-35.3 17.2-22.8 31.7-47.8 42.9-74.5 5-11.8 15.3-20.4 28-22.1l57.2-8c17.6-2.5 30.6-17.5 30.6-35.2V440.8c0.2-17.8-12.9-32.8-30.5-35.2z m-408 245.5c-76.7 0-138.9-62.2-138.9-138.9s62.2-138.9 138.9-138.9 138.9 62.2 138.9 138.9-62.2 138.9-138.9 138.9z" fill="" p-id="4449"></path></svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 1
src/icons/svg/settleAccounts.svg


+ 1 - 1
src/icons/svg/useCondition.svg

@@ -1 +1 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1731404432506" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5281" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M166.4 102.4h681.6v428.8l-38.4 35.2V140.8H185.6v745.6h624v-208l38.4-35.2v278.4H147.2V102.4z" fill="#5B8FD9" p-id="5282"></path><path d="M668.8 764.8l35.2-9.6 32-9.6-22.4-25.6-22.4-22.4-12.8 35.2zM873.6 515.2l-179.2 179.2 44.8 44.8 182.4-179.2zM556.8 796.8v32H768v-32z" fill="#68D279" p-id="5283"></path><path d="M268.8 537.6v35.2h256v-35.2zM268.8 457.6v32h384v-32zM268.8 377.6v32h457.6v-32zM268.8 294.4v32h457.6v-32zM268.8 214.4h457.6v32H268.8z" fill="#F9D65D" p-id="5284"></path></svg>
+<svg t="1731476496192" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5480" width="200" height="200"><path d="M577.918 78.291a116.768 116.768 0 0 1 76.271 28.352l192.64 166.177a116.768 116.768 0 0 1 40.5 88.416v484.386a100.086 100.086 0 0 1-100.091 100.087H236.762a100.086 100.086 0 0 1-100.087-100.087V178.378A100.086 100.086 0 0 1 236.762 78.291z m-20.184 66.724H236.763a33.365 33.365 0 0 0-33.27 30.873l-0.092 2.49v667.244a33.365 33.365 0 0 0 30.873 33.27l2.49 0.092h550.475a33.365 33.365 0 0 0 33.271-30.873l0.092-2.49V412.963H691.183a133.451 133.451 0 0 1-133.384-129.291l-0.062-4.157v-134.5zM683.816 662.13a20.017 20.017 0 0 1 20.017 20.017v26.69a20.017 20.017 0 0 1-20.017 20.017H306.822a20.017 20.017 0 0 1-20.017-20.017v-26.69a20.017 20.017 0 0 1 20.017-20.017zM500.323 478.638a20.017 20.017 0 0 1 20.017 20.017v26.69a20.017 20.017 0 0 1-20.017 20.017h-193.5a20.017 20.017 0 0 1-20.017-20.017v-26.69a20.017 20.017 0 0 1 20.017-20.017h193.5z m302.922-155.294L624.459 169.117v110.4a66.726 66.726 0 0 0 63.395 66.643l3.33 0.082h127.115a50.043 50.043 0 0 0-12.6-20.627l-2.458-2.269z" p-id="5481"></path></svg>

+ 37 - 0
src/router/index.js

@@ -45,6 +45,43 @@ export const constantRouterMap = [
       meta: {title: '渠道上账情况', icon: 'settleAccounts'}
     },
     ]
+  },
+  {
+    path: '/distribution',
+    component: Layout,
+    redirect: '/distribution/distributionSet',
+    meta: {title: '分销管理', icon: 'total-yesterday'},
+    children: [{
+      path: 'distributionSet',
+      name: 'distributionSet',
+      component: () => import('@/views/distribution/distributionSet/index'),
+      meta: {title: '分销设置', icon: 'setting'}
+    },
+    {
+      path: 'userList',
+      name: 'userList',
+      component: () => import('@/views/distribution/userList/index'),
+      meta: {title: '用户列表', icon: 'user'}
+    },
+    {
+      path: 'peopleManage',
+      name: 'peopleManage',
+      component: () => import('@/views/distribution/peopleManage/index'),
+      meta: {title: '分销员管理', icon: 'peopleChannel'}
+    },
+    {
+      path: 'statistics',
+      name: 'statistics',
+      component: () => import('@/views/distribution/statistics/index'),
+      meta: {title: '业绩统计', icon: 'performance'}
+    },
+    {
+      path: 'records',
+      name: 'records',
+      component: () => import('@/views/distribution/records/index'),
+      meta: {title: '分销记录', icon: 'settleAccounts'}
+    },
+    ]
   }
 ]
 

+ 1 - 1
src/views/404.vue

@@ -34,7 +34,7 @@
   }
 </script>
 
-<style scoped>
+<style scoped lang="scss">
   .app-container {
     width: 80%;
     margin: 120px auto;

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

@@ -219,12 +219,14 @@ export default {
           });
         } else {
           createAdmin(this.admin).then((response) => {
-            this.$message({
+            if( response.code == 200){
+              this.$message({
               message: "添加成功!",
               type: "success",
             });
             this.dialogVisible = false;
             this.getList();
+            }
           });
         }
       });

+ 57 - 44
src/views/channel/useCondition/index.vue

@@ -37,14 +37,14 @@
                 <el-table-column label="渠道名称" align="center" prop="thirdPartyName"></el-table-column>
                 <el-table-column label="使用状态" align="center">
                     <template slot-scope="scope">
-                        <el-tag type='success' v-if="scope.row.status === 1">正常</el-tag>
+                        <el-tag type="success" v-if="scope.row.status === 1">正常</el-tag>
                         <el-tag type="danger" v-else>禁用</el-tag>
                     </template>
                 </el-table-column>
                 <el-table-column label="渠道上账总金额/元" align="center" prop="topAllMoney"></el-table-column>
                 <el-table-column label="渠道应付总金额/元" width="160" align="center">
                     <template slot-scope="scope">
-                        {{ scope.row.totalPayable || '0' }}
+                        {{ scope.row.totalPayable || "0" }}
                     </template>
                 </el-table-column>
                 <el-table-column label="用户充值总金额/元" width="160" align="center" prop="userTopAllMoney"></el-table-column>
@@ -52,7 +52,7 @@
                     prop="userConsumeAllMoney"></el-table-column>
                 <el-table-column label="用户退款总金额/元" width="140" align="center">
                     <template slot-scope="scope">
-                        {{ scope.row.userRefundAllMoney || '0' }}
+                        {{ scope.row.userRefundAllMoney || "0" }}
                     </template>
                 </el-table-column>
                 <el-table-column label="用户剩余总金额/元" width="140" align="center" prop="userBalance"></el-table-column>
@@ -93,19 +93,25 @@
         </el-dialog>
         <el-dialog :title="isEdit ? '渠道上账' : '渠道结算'" :visible.sync="dialogVisible" width="40%">
             <el-form :model="admin" ref="adminForm" label-width="150px" :rules="rules" size="small">
-                <div style="font-size: 18px;font-weight: bold;">渠道信息</div>
+                <div style="font-size: 18px; font-weight: bold">渠道信息</div>
                 <el-form-item label="渠道编号:">
-                    <template><span style="color: #969595;">{{ admin.appId }}</span></template>
+                    <template><span style="color: #969595">{{ admin.appId }}</span></template>
                 </el-form-item>
                 <el-form-item label="渠道名称:">
-                    <template><span style="color: #969595;">{{ admin.thirdPartyName }}</span></template>
+                    <template><span style="color: #969595">{{
+                        admin.thirdPartyName
+                            }}</span></template>
                 </el-form-item>
-                <div style="font-size: 18px;font-weight: bold;">使用情况</div>
+                <div style="font-size: 18px; font-weight: bold">使用情况</div>
                 <el-form-item label="渠道上账总金额/元:">
-                    <template><span style="color: #969595;">{{ admin.topAllMoney }}</span></template>
+                    <template><span style="color: #969595">{{
+                        admin.topAllMoney
+                            }}</span></template>
                 </el-form-item>
                 <el-form-item label="渠道应付总金额/元:">
-                    <template><span style="color: #969595;">{{ admin.totalPayable || '0' }}</span></template>
+                    <template><span style="color: #969595">{{
+                        admin.totalPayable || "0"
+                            }}</span></template>
                 </el-form-item>
                 <el-form-item label="本次上账金额/元:" prop="upAccount">
                     <el-input v-model="admin.money" placeholder="请输入上账金额" type="text" :rows="5"
@@ -113,9 +119,8 @@
                     <el-checkbox v-if="!isEdit" v-model="admin.checked">负数</el-checkbox>
                 </el-form-item>
                 <el-form-item label="上传凭证:">
-                    <el-upload action="https://jsonplaceholder.typicode.com/posts/" list-type="picture-card">
-                        <i class="el-icon-plus"></i>
-                    </el-upload>
+                    <uploadImg :limit="2" :file-list="fileList" @getUrl="getUrl($event)" @delUrl="delUrl($event)"
+                        :disabled="false"></uploadImg>
                 </el-form-item>
             </el-form>
             <span slot="footer" class="dialog-footer">
@@ -128,13 +133,13 @@
 <script>
 import { useConditionList, updateStatus, upTheAccount } from "@/api/channel";
 import { formatDate } from "@/utils/date";
-
+import uploadImg from '@/components/Upload/uploadImg'
 const defaultListQuery = {
     pageNum: 1,
     pageSize: 10,
     ecName: null,
-    startTime: '',
-    endTime: ''
+    startTime: "",
+    endTime: "",
 };
 const defaultAdmin = {
     id: null,
@@ -147,10 +152,13 @@ const defaultAdmin = {
 };
 export default {
     name: "useCondition",
+    components: { uploadImg },
     data() {
         return {
+            fileList: [],
+            upImg:'',
             setQuery: {},
-            date: '',
+            date: "",
             isforbidden: false,
             forbiddenDialogVisible: false,
             listQuery: Object.assign({}, defaultListQuery),
@@ -163,7 +171,9 @@ export default {
             allocRoleIds: [],
             allRoleList: [],
             allocAdminId: null,
-            rules: { upAccount: [{ required: true, message: "请输入金额", trigger: "blur", }] }
+            rules: {
+                upAccount: [{ required: true, message: "请输入金额", trigger: "blur" }],
+            },
         };
     },
     watch: {
@@ -190,29 +200,37 @@ export default {
         },
     },
     methods: {
+        //函数
+        getUrl(getUrl) {
+            this.upImgUrl = getUrl;
+        },
+        delUrl(getUrl) {
+            console.log(getUrl,'----删除')
+        },
+
         // 启用
         enable(index, row) {
-            this.isforbidden = true
-            this.forbiddenDialogVisible = true
-            this.setQuery = row
+            this.isforbidden = true;
+            this.forbiddenDialogVisible = true;
+            this.setQuery = row;
         },
         // 禁用
         forbiddenStatus(index, row) {
-            this.isforbidden = false
-            this.forbiddenDialogVisible = true
-            this.setQuery = row
+            this.isforbidden = false;
+            this.forbiddenDialogVisible = true;
+            this.setQuery = row;
         },
 
         // 确认禁用/启用
         confirmForbidden() {
-            let isEnable = ''
+            let isEnable = "";
             if (this.isforbidden === true) {
-                isEnable = 1
+                isEnable = 1;
             } else {
-                isEnable = 2
+                isEnable = 2;
             }
             updateStatus(this.setQuery.thirdPartyId, isEnable).then((res) => {
-                this.forbiddenDialogVisible = false
+                this.forbiddenDialogVisible = false;
                 if (res.code == 200) {
                     this.$message({
                         message: "修改成功!",
@@ -220,7 +238,7 @@ export default {
                     });
                     this.getList();
                 }
-            })
+            });
         },
 
         // 结算
@@ -264,27 +282,23 @@ export default {
                     money: this.admin.money,
                     thirdPartyInfoId: this.admin.thirdPartyId,
                     type: this.isEdit == true ? 1 : 2,
-                    voucherPic: ''
-                }
-                if (this.isEdit) {
-                    upTheAccount({ ...updateData }).then((response) => {
+                    voucherPic: this.upImg,
+                };
+                upTheAccount({ ...updateData }).then((response) => {
+                    if (response.code == 200) {
                         this.$message({
-                            message: "上账成功!",
+                            message: this.isEdit == true ? "上账成功!" : "结算成功!",
                             type: "success",
                         });
                         this.dialogVisible = false;
                         this.getList();
-                    });
-                } else {
-                    upTheAccount({ ...updateData }).then((response) => {
+                    } else {
                         this.$message({
-                            message: "结算成功!",
-                            type: "success",
+                            message: response.msg,
+                            type: "error",
                         });
-                        this.dialogVisible = false;
-                        this.getList();
-                    });
-                }
+                    }
+                });
             });
         },
         getList() {
@@ -298,5 +312,4 @@ export default {
     },
 };
 </script>
-<style>
-</style>
+<style></style>

+ 160 - 0
src/views/distribution/distributionSet/index.vue

@@ -0,0 +1,160 @@
+<!--
+ * @Descripttion: 分销管理
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-09 16:08:16
+ * @LastEditors: zzx
+ * @LastEditTime: 2024-11-13 16:08:16
+-->
+<template>
+    <div class="app-container">
+        <el-card class="filter-container" shadow="never">
+            <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-form-item>
+                <el-form-item label="二级返佣比例%:" prop="secondLevel">
+                    <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-form-item>
+            </el-form>
+            <el-divider content-position="left"></el-divider>
+            <div style="display: flex;align-items: center;justify-content: center;">
+                <el-button type="primary" @click="submitForm" size="medium">保存</el-button>
+            </div>
+        </el-card>
+        <el-dialog title="查看说明" :visible.sync="forbiddenDialogVisible" width="50%">
+            <div class="title">关于返佣比例的说明:</div>
+            <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 × (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>
+            </div>
+        </el-dialog>
+    </div>
+</template>
+<script>
+import { systemconfig,distributionSet } from "@/api/distribution";
+const defaultAdmin = {
+    firstLevel: null,
+    secondLevel: null,
+    maxUserCount: null
+};
+export default {
+    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'
+            }],
+            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' }],
+            },
+        }
+    },
+    created() {
+        this.get_systemconfig()
+    },
+    computed: {
+    },
+    methods: {
+        submitForm(){
+            this.$confirm("是否确认提交?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+            }).then(() => {
+                let updateData = {
+                    id: this.admin.id,
+                    firstLevel: this.admin.firstLevel,
+                    secondLevel: this.admin.secondLevel,
+                    maxUserCount: this.admin.maxUserCount,
+                };
+                distributionSet({ ...updateData }).then((response) => {
+                    if (response.code == 200) {
+                        this.$message({
+                            message:"提交成功!",
+                            type: "success",
+                        });
+                        this.get_systemconfig()
+                    } else {
+                        this.$message({
+                            message: response.msg,
+                            type: "error",
+                        });
+                    }
+                });
+            });
+        },
+
+        // 获取系统配置
+        get_systemconfig(){
+            systemconfig().then((response) => {
+                if (response.code == 200) {
+                    this.admin = response.data;
+                }
+            })
+        }
+    },
+}
+</script>
+<style lang="scss" scoped>
+.blSet {
+    display: flex;
+    align-items: center;
+
+    &>span {
+        margin-left: 300px;
+        color: #409EFF;
+        font-size: 14px;
+    }
+}
+.text1 {
+    margin-top: 10px;
+    margin-left: 20px;
+}
+.text2 {
+    margin-top: 8px;
+    margin-left: 30px;
+}
+.text3 {
+    margin-top: 8px;
+    margin-left: 62px;
+}
+</style>

+ 285 - 0
src/views/distribution/peopleManage/index.vue

@@ -0,0 +1,285 @@
+<template>
+     
+    <div class="app-container">
+        <el-card class="filter-container" shadow="never">
+            <div>
+                <i class="el-icon-search"></i>
+                <span>筛选搜索</span>
+                <el-button style="float: right" type="primary" @click="handleSearchList()" size="small">
+                    查询搜索
+                </el-button>
+                <el-button style="float: right; margin-right: 15px" @click="handleResetSearch()" size="small">
+                    重置
+                </el-button>
+            </div>
+            <div style="margin-top: 15px">
+                <el-form :inline="true" :model="listQuery" size="small" label-width="140px">
+                    <el-form-item label="分销员姓名:">
+                        <el-input v-model="listQuery.userName" class="input-width" placeholder="请输入用户名称"
+                            clearable></el-input>
+                    </el-form-item>
+                    <el-form-item label="手机号:">
+                        <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-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 label="更新时间:">
+                        <el-date-picker v-model="date" size="small" value-format="yyyy-MM-dd"
+                            class="item-width-350 ml10" type="datetimerange" range-separator="至"
+                            start-placeholder="开始日期" end-placeholder="结束日期">
+                        </el-date-picker>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </el-card>
+        <el-card class="operate-container" shadow="never">
+            <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="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" 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" 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-column label="更新人" align="center" prop="updateBy"></el-table-column>
+                <el-table-column label="更新时间" align="center" prop="updateTime"></el-table-column>
+                <el-table-column label="操作" width="300" align="center">
+                    <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="info" plain @click="userEdit(scope.row)">编辑</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </div>
+        <div class="pagination-container">
+            <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                layout="total, sizes,prev, pager, next,jumper" :current-page.sync="listQuery.pageNum"
+                :page-size="listQuery.pageSize" :page-sizes="[10, 15, 20]" :total="total">
+            </el-pagination>
+        </div>
+        <el-dialog title="编辑分销员" :visible.sync="forbiddenDialogVisible" width="30%">
+            <el-form :model="admin" ref="adminForm" label-width="150px" size="small">
+                <el-form-item label="分销员编号:">
+                    <el-input disabled v-model="admin.number" style="width: 250px"></el-input>
+                </el-form-item>
+                <el-form-item label="分销员姓名:">
+                    <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-form-item>
+                <el-form-item label="手机号:">
+                    <el-input v-model="admin.phone" 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>
+                </el-form-item>
+                <el-form-item label="银行卡号:">
+                    <el-input v-model="admin.bankCard" type="text" :rows="5" style="width: 250px"></el-input>
+                </el-form-item>
+                <el-form-item label="开户行:">
+                    <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-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>
+            </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>
+        </el-dialog>
+    </div>
+</template>
+<script>
+import { peopleList,getJuniorList,getQrcode } from "@/api/distribution";
+import { formatDate } from "@/utils/date";
+
+const defaultListQuery = {
+    pageNum: 1,
+    pageSize: 10,
+    userName: null,
+    phone: null,
+    startTime: '',
+    endTime: '',
+    value: ''
+};
+const juniorListQuery = {
+    pageNum: 1,
+    pageSize: 10,
+    userId: null,
+};
+const defaultAdmin = {
+    id: null,
+    username: null,
+    password: null,
+    nickName: null,
+    email: null,
+    note: null,
+    status: 1,
+};
+export default {
+    name: "upCheck",
+    data() {
+        return {
+            date: "",
+            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: '二级'
+            }],
+        };
+    },
+    watch: {
+        date(val) {
+            if (val) {
+                this.listQuery.startTime = Date.parse(val[0]);
+                this.listQuery.endTime = Date.parse(val[1]);
+            } else {
+                this.listQuery.startTime = "";
+                this.listQuery.endTime = "";
+            }
+        },
+    },
+    created() {
+        this.getList();
+    },
+    filters: {
+        formatDateTime(time) {
+            if (time == null || time === "") {
+                return "N/A";
+            }
+            let date = new Date(time);
+            return formatDate(date, "yyyy-MM-dd hh:mm:ss");
+        },
+    },
+    methods: {
+        // 编辑
+        userEdit(row){
+            this.forbiddenDialogVisible= true;
+            this.admin=row;
+        },
+
+        // 查看二维码
+        checkQrCode(row){
+            this.checkQrCodeDialogVisible = true;
+            getQrcode({adminUserId:row.adminUserId,userId:row.id}).then((res) => {
+                if (res.code == 200) {
+                    
+                }
+            })
+        },
+        // 查看下级
+        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;
+                }
+            })
+        },
+        handleResetSearch() {
+            this.listQuery = Object.assign({}, defaultListQuery);
+        },
+        handleSearchList() {
+            this.listQuery.pageNum = 1;
+            this.getList();
+        },
+        handleSizeChange(val) {
+            this.listQuery.pageNum = 1;
+            this.listQuery.pageSize = val;
+            this.getList();
+        },
+        handleCurrentChange(val) {
+            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) => {
+                this.listLoading = false;
+                this.list = response.data.list;
+                this.total = response.data.total;
+            });
+        },
+    },
+};
+</script>
+<style scoped>
+.peoplePagination{
+    margin-top: 10px;
+    display: flex;
+    justify-content: right;
+}
+</style>

+ 215 - 0
src/views/distribution/records/index.vue

@@ -0,0 +1,215 @@
+<template>
+     
+    <div class="app-container">
+        <el-card class="filter-container" shadow="never">
+            <div>
+                <i class="el-icon-search"></i>
+                <span>筛选搜索</span>
+                <el-button style="float: right" type="primary" @click="handleSearchList()" size="small">
+                    查询搜索
+                </el-button>
+                <el-button style="float: right; margin-right: 15px" @click="handleResetSearch()" size="small">
+                    重置
+                </el-button>
+            </div>
+            <div style="margin-top: 15px">
+                <el-form :inline="true" :model="listQuery" size="mini" label-width="140px">
+                    <el-form-item label="分销员姓名:">
+                        <el-input v-model="listQuery.ecName" class="input-width" placeholder="请输入用户名称"
+                            clearable></el-input>
+                    </el-form-item>
+                    <el-form-item label="分销员手机号:">
+                        <el-input v-model="listQuery.phone" class="input-width" placeholder="请输入手机号码"
+                            clearable></el-input>
+                    </el-form-item>
+                    <el-form-item label="结算状态:">
+                        <el-select v-model="value" 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 label="充电订单编号:">
+                        <el-input v-model="listQuery.phone" class="input-width" placeholder="请输入订单编号"
+                            clearable></el-input>
+                    </el-form-item>
+                    <el-form-item label="完成时间:">
+                        <el-date-picker v-model="date" size="mini" value-format="yyyy-MM-dd" class="item-width-350 ml10"
+                            type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item label="提现时间:">
+                        <el-date-picker v-model="date" size="mini" value-format="yyyy-MM-dd" class="item-width-350 ml10"
+                            type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
+                        </el-date-picker>
+                    </el-form-item>
+                    <el-form-item label="结算时间:">
+                        <el-date-picker v-model="date" size="mini" value-format="yyyy-MM-dd" class="item-width-350 ml10"
+                            type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
+                        </el-date-picker>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </el-card>
+        <el-card class="operate-container" shadow="never">
+            <div class="title">
+                <div class="titleContent">
+                    <i class="el-icon-tickets"></i>
+                    <span>数据列表</span>
+                </div>
+                <div>
+                    <el-button class="ml10" type="info" size="small" :loading="downloadLoading" icon="el-icon-printer"
+                        @click="exportAllExcel">导出</el-button>
+                    <el-button class="ml10" type="warning" size="small" :loading="downloadLoading"
+                        icon="el-icon-success" @click="">财务已结算</el-button>
+                </div>
+            </div>
+        </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="authCode"></el-table-column>
+                <el-table-column label="订单金额/元" align="center" prop="ecName"></el-table-column>
+                <el-table-column label="服务费金额/元" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.money || "--" }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="订单完成时间" align="center" prop="updateBy">
+                    <template slot-scope="scope">
+                        {{ "--" }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="一级分销员" align="center" prop="updateBy"></el-table-column>
+                <el-table-column label="一级分销员手机号" align="center" prop="updateBy"></el-table-column>
+                <el-table-column label="一级分销员佣金" align="center" prop="updateBy"></el-table-column>
+                <el-table-column label="二级分销员" align="center" prop="updateBy"></el-table-column>
+                <el-table-column label="二级分销员手机号" align="center" prop="updateBy"></el-table-column>
+                <el-table-column label="二级分销员佣金" align="center" prop="updateBy"></el-table-column>
+                <el-table-column label="结算状态" align="center" prop="updateBy"></el-table-column>
+                <el-table-column label="提现时间" align="center" prop="updateBy"></el-table-column>
+                <el-table-column label="结算时间" align="center" prop="updateBy"></el-table-column>
+            </el-table>
+        </div>
+        <div class="pagination-container">
+            <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                layout="total, sizes,prev, pager, next,jumper" :current-page.sync="listQuery.pageNum"
+                :page-size="listQuery.pageSize" :page-sizes="[10, 15, 20]" :total="total">
+            </el-pagination>
+        </div>
+        <el-dialog title="提现申请" :visible.sync="forbiddenDialogVisible" width="40%">
+            <el-descriptions border>
+                <el-descriptions-item label="分销员姓名">kooriookami</el-descriptions-item>
+                <el-descriptions-item label="分销员手机号">18100000000</el-descriptions-item>
+                <el-descriptions-item label="本次提现订单数/笔">苏州市</el-descriptions-item>
+                <el-descriptions-item label="本次提现金额/元">
+                    <el-tag size="small">学校</el-tag>
+                </el-descriptions-item>
+            </el-descriptions>
+            <div style="margin-top: 10px; font-size: 14px">
+                说明:提现的订单为今天(2024-11-14)之前
+            </div>
+            <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>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+<script>
+import { upCheckList } from "@/api/channel";
+import { formatDate } from "@/utils/date";
+
+const defaultListQuery = {
+    pageNum: 1,
+    pageSize: 10,
+    ecName: null,
+    phone: null,
+    startTime: "",
+    endTime: "",
+    value: "",
+};
+export default {
+    name: "upCheck",
+    data() {
+        return {
+            date: "",
+            listQuery: Object.assign({}, defaultListQuery),
+            list: null,
+            total: null,
+            listLoading: false,
+            forbiddenDialogVisible: false,
+            options: [
+                {
+                    value: 1,
+                    label: "未提现",
+                },
+                {
+                    value: 2,
+                    label: "待结算",
+                },
+                {
+                    value: 3,
+                    label: "已结算",
+                },
+            ],
+        };
+    },
+    watch: {
+        date(val) {
+            if (val) {
+                this.listQuery.startTime = Date.parse(val[0]);
+                this.listQuery.endTime = Date.parse(val[1]);
+            } else {
+                this.listQuery.startTime = "";
+                this.listQuery.endTime = "";
+            }
+        },
+    },
+    created() {
+        this.getList();
+    },
+    filters: {
+        formatDateTime(time) {
+            if (time == null || time === "") {
+                return "N/A";
+            }
+            let date = new Date(time);
+            return formatDate(date, "yyyy-MM-dd hh:mm:ss");
+        },
+    },
+    methods: {
+        handleResetSearch() {
+            this.listQuery = Object.assign({}, defaultListQuery);
+        },
+        handleSearchList() {
+            this.listQuery.pageNum = 1;
+            this.getList();
+        },
+        handleSizeChange(val) {
+            this.listQuery.pageNum = 1;
+            this.listQuery.pageSize = val;
+            this.getList();
+        },
+        handleCurrentChange(val) {
+            this.listQuery.pageNum = val;
+            this.getList();
+        },
+        getList() {
+            this.listLoading = true;
+            upCheckList(this.listQuery).then((response) => {
+                this.listLoading = false;
+                this.list = response.data.list;
+                this.total = response.data.total;
+            });
+        },
+    },
+};
+</script>
+<style scoped lang="scss">
+.title {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+</style>

+ 212 - 0
src/views/distribution/statistics/index.vue

@@ -0,0 +1,212 @@
+<template>
+     
+    <div class="app-container">
+        <el-card class="filter-container" shadow="never">
+            <div>
+                <i class="el-icon-search"></i>
+                <span>筛选搜索</span>
+                <el-button style="float: right" type="primary" @click="handleSearchList()" size="small">
+                    查询搜索
+                </el-button>
+                <el-button style="float: right; margin-right: 15px" @click="handleResetSearch()" size="small">
+                    重置
+                </el-button>
+            </div>
+            <div style="margin-top: 15px">
+                <el-form :inline="true" :model="listQuery" size="small" label-width="140px">
+                    <el-form-item label="分销员姓名:">
+                        <el-input v-model="listQuery.userName" class="input-width" placeholder="请输入用户名称"
+                            clearable></el-input>
+                    </el-form-item>
+                    <el-form-item label="分销员手机号:">
+                        <el-input v-model="listQuery.phone" class="input-width" placeholder="请输入手机号码"
+                            clearable></el-input>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </el-card>
+        <el-card class="operate-container" shadow="never">
+            <div class="title">
+                <div class="titleContent">
+                    <i class="el-icon-tickets"></i>
+                    <span>数据列表</span>
+                    <span class="tips">提现说明:限每月10号-15号提交提现申请,且只能提交一次</span>
+                </div>
+                <el-button class="ml10" type="info" size="small" :loading="downloadLoading" icon="el-icon-printer"
+                    @click="exportAllExcel">导出</el-button>
+            </div>
+        </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="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="userRefundAllMoney"></el-table-column>
+                <el-table-column label="待结算佣金/元" align="center" prop="unSettleAccountMoney"></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)">
+                            提现申请
+                        </el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </div>
+        <div class="pagination-container">
+            <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                layout="total, sizes,prev, pager, next,jumper" :current-page.sync="listQuery.pageNum"
+                :page-size="listQuery.pageSize" :page-sizes="[10, 15, 20]" :total="total">
+            </el-pagination>
+        </div>
+        <el-dialog title="提现申请" :visible.sync="forbiddenDialogVisible" width="40%">
+            <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.unSettleAccountMoney }}</el-descriptions-item>
+            </el-descriptions>
+            <div style="margin-top: 10px;font-size: 14px;">说明:提现的订单为今天(2024-11-14)之前</div>
+            <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>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+<script>
+import { performanceList } from "@/api/distribution";
+import { formatDate } from "@/utils/date";
+import FileSaver from 'file-saver';
+import XLSX from 'xlsx';
+const defaultListQuery = {
+    pageNum: 1,
+    pageSize: 10,
+    userName: null,
+    phone: null,
+    startTime: '',
+    endTime: ''
+};
+export default {
+    name: "upCheck",
+    data() {
+        return {
+            downloadLoading: false,
+            date: "",
+            listQuery: Object.assign({}, defaultListQuery),
+            list: null,
+            total: null,
+            listLoading: false,
+            forbiddenDialogVisible: false,
+            dialogQuery: {}
+        };
+    },
+    watch: {
+        date(val) {
+            if (val) {
+                this.listQuery.startTime = Date.parse(val[0]);
+                this.listQuery.endTime = Date.parse(val[1]);
+            } else {
+                this.listQuery.startTime = "";
+                this.listQuery.endTime = "";
+            }
+        },
+    },
+    created() {
+        this.getList();
+    },
+    filters: {
+        formatDateTime(time) {
+            if (time == null || time === "") {
+                return "N/A";
+            }
+            let date = new Date(time);
+            return formatDate(date, "yyyy-MM-dd hh:mm:ss");
+        },
+    },
+    methods: {
+        // 导出
+        exportAllExcel() {
+            this.downloadLoading = true
+            const allData = [];
+            let query = JSON.parse(JSON.stringify(this.listQuery))
+            query.pageSize = this.total
+            query.page = 0
+            performanceList(query).then(res => {
+                this.downloadLoading = false
+                if (res.code == 200) {
+                    allData.push(...res.data.list);
+                    this.exportExcel(allData);
+                }
+            });
+        },
+
+        // 导出数据处理
+        exportExcel(r) {
+            const data = r.map((item) => {
+                return {
+                    "分销员姓名":item.userName,
+                    "分销员手机号":item.phone,
+                    "用户购券金额/元":item.userTopAllMoney,
+                    "待清算佣金/元":item.unconsumedMoney,
+                    "用户退款金额/元":item.userRefundAllMoney,
+                    "待结算佣金/元": item.unSettleAccountMoney,
+                    "已结算佣金/元":item.settleAccountMoney,
+                }
+            })
+            const worksheet = XLSX.utils.json_to_sheet(data);
+            const workbook = { Sheets: { data: worksheet }, SheetNames: ['data'] };
+            const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
+            const blob = new Blob([excelBuffer], { type: 'application/octet-stream' });
+            FileSaver.saveAs(blob, '统计表.xlsx');
+        },
+
+        // 结算申请
+        withdrawApplyfor(row) {
+            this.forbiddenDialogVisible = true;
+            this.dialogQuery = row;
+        },
+
+        handleResetSearch() {
+            this.listQuery = Object.assign({}, defaultListQuery);
+        },
+        handleSearchList() {
+            this.listQuery.pageNum = 1;
+            this.getList();
+        },
+        handleSizeChange(val) {
+            this.listQuery.pageNum = 1;
+            this.listQuery.pageSize = val;
+            this.getList();
+        },
+        handleCurrentChange(val) {
+            this.listQuery.pageNum = val;
+            this.getList();
+        },
+        getList() {
+            this.listLoading = true;
+            performanceList(this.listQuery).then((response) => {
+                this.listLoading = false;
+                this.list = response.data.list;
+                this.total = response.data.total;
+            });
+        },
+    },
+};
+</script>
+<style scoped lang="scss">
+.title {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+
+    .titleContent {
+        .tips {
+            font-size: 13px;
+            color: #ff0000;
+            margin-left: 20px;
+        }
+    }
+}
+</style>

+ 195 - 0
src/views/distribution/userList/index.vue

@@ -0,0 +1,195 @@
+<template>
+     
+    <div class="app-container">
+        <el-card class="filter-container" shadow="never">
+            <div>
+                <i class="el-icon-search"></i>
+                <span>筛选搜索</span>
+                <el-button style="float: right" type="primary" @click="handleSearchList()" size="small">
+                    查询搜索
+                </el-button>
+                <el-button style="float: right; margin-right: 15px" @click="handleResetSearch()" size="small">
+                    重置
+                </el-button>
+            </div>
+            <div style="margin-top: 15px">
+                <el-form :inline="true" :model="listQuery" size="small" label-width="140px">
+                    <el-form-item label="用户姓名:">
+                        <el-input v-model="listQuery.nickName" class="input-width" placeholder="请输入用户名称"
+                            clearable></el-input>
+                    </el-form-item>
+                    <el-form-item label="手机号:">
+                        <el-input v-model="listQuery.phone" class="input-width" placeholder="请输入手机号码"
+                            clearable></el-input>
+                    </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="至"
+                            start-placeholder="开始日期" end-placeholder="结束日期">
+                        </el-date-picker>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </el-card>
+        <el-card class="operate-container" shadow="never">
+            <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="属性" align="center" prop="updateBy">
+                    <template slot-scope="scope">
+                        <el-tag v-if="scope.row.type == 1" 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>
+                </el-table-column>
+                <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)">
+                            查看绑定用户
+                        </el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </div>
+        <div class="pagination-container">
+            <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+                layout="total, sizes,prev, pager, next,jumper" :current-page.sync="listQuery.pageNum"
+                :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="listLoading" 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>
+        </el-dialog>
+    </div>
+</template>
+<script>
+import { userList,settingType } from "@/api/distribution";
+import { formatDate } from "@/utils/date";
+
+const defaultListQuery = {
+    pageNum: 1,
+    pageSize: 10,
+    nickName: null,
+    admin_user_id: null,
+    phone: null,
+    startTime: '',
+    endTime: ''
+};
+export default {
+    name: "upCheck",
+    data() {
+        return {
+            date: "",
+            listQuery: Object.assign({}, defaultListQuery),
+            list: null,
+            total: null,
+            listLoading: false,
+            forbiddenDialogVisible: false
+        };
+    },
+    watch: {
+        date(val) {
+            if (val) {
+                this.listQuery.startTime = Date.parse(val[0]);
+                this.listQuery.endTime = Date.parse(val[1]);
+            } else {
+                this.listQuery.startTime = "";
+                this.listQuery.endTime = "";
+            }
+        },
+    },
+    created() {
+        this.getList();
+    },
+    filters: {
+        formatDateTime(time) {
+            if (time == null || time === "") {
+                return "N/A";
+            }
+            let date = new Date(time);
+            return formatDate(date, "yyyy-MM-dd hh:mm:ss");
+        },
+    },
+    methods: {
+        // 设置分销
+        get_settingType(idnex,row){
+            this.$confirm("是否确认提交?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+            }).then(() => {
+                let updateData = {
+                    cuserInfoId: row.id,
+                };
+                settingType({ ...updateData }).then((response) => {
+                    if (response.code == 200) {
+                        this.$message({
+                            message:"设置成功!",
+                            type: "success",
+                        });
+                        this.getList()
+                    } else {
+                        this.$message({
+                            message: response.msg,
+                            type: "error",
+                        });
+                    }
+                });
+            });
+        },
+
+        // 查看绑定用户
+        checkBindUser(index, row) {
+            this.listQuery.admin_user_id = row.id;
+            this.forbiddenDialogVisible = true;
+            this.getList();
+        },
+        handleResetSearch() {
+            this.listQuery = Object.assign({}, defaultListQuery);
+        },
+        handleSearchList() {
+            this.listQuery.pageNum = 1;
+            this.getList();
+        },
+        handleSizeChange(val) {
+            this.listQuery.pageNum = 1;
+            this.listQuery.pageSize = val;
+            this.getList();
+        },
+        handleCurrentChange(val) {
+            this.listQuery.pageNum = val;
+            this.getList();
+        },
+        getList() {
+            this.listLoading = true;
+            userList(this.listQuery).then((response) => {
+                this.listLoading = false;
+                this.list = response.data.list;
+                this.total = response.data.total;
+            });
+        },
+    },
+};
+</script>
+<style scoped>
+.icon {
+    width: 60px;
+    height: 60px;
+}
+</style>

+ 1 - 1
src/views/login/index.vue

@@ -9,7 +9,7 @@
         <div style="text-align: center">
           <svg-icon icon-class="channel" style="width: 56px;height: 56px;color: #2836FE"></svg-icon>
         </div>
-        <h2 class="login-title color-main">中数电动渠道管理后台</h2>
+        <h2 class="login-title color-main">中数电动管理平台</h2>
         <el-form-item prop="username">
           <el-input name="username"
                     type="text"

+ 1 - 1
src/views/ums/menu/index.vue

@@ -96,7 +96,7 @@
         listLoading: true,
         listQuery: {
           pageNum: 1,
-          pageSize: 5
+          pageSize:30
         },
         parentId: 0
       }

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä