2 Commits 259d796d8a ... c44c30e501

Auteur SHA1 Message Date
  学习?学个屁 c44c30e501 更改提交信息 il y a 2 mois
  学习?学个屁 3289ff2de4 更换提交信息 il y a 2 mois
46 fichiers modifiés avec 4366 ajouts et 6 suppressions
  1. 83 0
      README.md
  2. 5 0
      build/utils.js
  3. 7 0
      config/dev.env.js
  4. 5 0
      config/prod.env.js
  5. 788 6
      package-lock.json
  6. 16 0
      package.json
  7. 16 0
      src/api/channel.js
  8. 83 0
      src/api/distribution.js
  9. 3 0
      src/api/oss.js
  10. BIN
      src/assets/images/qrCode_bg.jpg
  11. 66 0
      src/components/Upload/uploadImg.vue
  12. 13 0
      src/components/backButton/index.vue
  13. 8 0
      src/main.js
  14. 53 0
      src/permission.js
  15. 59 0
      src/router/index.js
  16. 9 0
      src/store/index.js
  17. 30 0
      src/store/modules/cache.js
  18. 92 0
      src/store/modules/user.js
  19. 17 0
      src/styles/index.scss
  20. 6 0
      src/styles/sidebar.scss
  21. 12 0
      src/utils/common.js
  22. 100 0
      src/utils/request.js
  23. 288 0
      src/views/channel/info/index.vue
  24. 21 0
      src/views/channel/upCheck/index.vue
  25. 102 0
      src/views/channel/useCondition/index.vue
  26. 15 0
      src/views/distribution/changePwd/index.vue
  27. 55 0
      src/views/distribution/distributionSet/index.vue
  28. 281 0
      src/views/distribution/finance/index.vue
  29. 360 0
      src/views/distribution/peopleManage/batchSetting.vue
  30. 190 0
      src/views/distribution/peopleManage/firstSetPrice.vue
  31. 228 0
      src/views/distribution/peopleManage/index.vue
  32. 18 0
      src/views/distribution/peopleManage/junior.vue
  33. 253 0
      src/views/distribution/peopleManage/setCommission.vue
  34. 182 0
      src/views/distribution/peopleManage/settingsPrice.vue
  35. 163 0
      src/views/distribution/records/index.vue
  36. 100 0
      src/views/distribution/statistics/index.vue
  37. 23 0
      src/views/distribution/userList/index.vue
  38. 23 0
      src/views/home/index.vue
  39. 8 0
      src/views/login/index.vue
  40. 282 0
      src/views/ums/admin/index.vue
  41. 19 0
      src/views/ums/menu/add.vue
  42. 154 0
      src/views/ums/menu/index.vue
  43. 10 0
      src/views/ums/menu/update.vue
  44. 99 0
      src/views/ums/role/allocMenu.vue
  45. 13 0
      src/views/ums/role/allocResource.vue
  46. 8 0
      src/views/ums/role/index.vue

+ 83 - 0
README.md

@@ -1 +1,84 @@
+<<<<<<< HEAD
+@version:1.0.0
+@Author: zzx
+@Date: 2024-11-12 16:09:38
+connection:tigerzouzx@foxmail.com
 
+## 项目介绍
+```
+中数电动渠道分销后台管理系统,用于超管、分销商、分销员等角色进行管理操作
+```
+
+## 项目结构
+```
+├── api
+│   ├── index.js
+│   ├── distribution.js
+│   ├── user.js
+├── assets
+│   ├── css
+│   ├── js
+├── components
+│   ├── common
+│   ├── layout
+│   ├── page
+├── router
+│   ├── index.js
+├── store
+│   ├── index.js
+├── utils
+│   ├── index.js
+├── views
+│   ├── index.vue
+├── App.vue
+├── main.js
+├── package.json
+└── README.md
+```
+
+## 项目启动
+```
+npm run dev
+```
+
+## 项目打包
+```
+npm run build
+```
+
+## 项目部署
+```
+将打包后的文件部署到服务器上
+```
+
+## node环境
+```
+node版本:v12.17.0
+```
+
+## 项目依赖
+```
+axios
+vue
+vue-router
+vuex
+element-ui
+```
+
+## 项目截图
+```
+项目截图
+```
+
+## 项目贡献
+```
+zzx tigerzouzx@foxmail.com
+```
+
+## 项目维护
+```
+zzx tigerzouzx@foxmail.com
+```
+=======
+
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 5 - 0
build/utils.js

@@ -47,7 +47,12 @@ exports.cssLoaders = function (options) {
     if (options.extract) {
       return ExtractTextPlugin.extract({
         use: loaders,
+<<<<<<< HEAD
+        fallback: 'vue-style-loader',
+        publicPath: '../../'            //解决ele小图标出不来问题
+=======
         fallback: 'vue-style-loader'
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
       })
     } else {
       return ['vue-style-loader'].concat(loaders)

+ 7 - 0
config/dev.env.js

@@ -4,7 +4,14 @@ const prodEnv = require('./prod.env')
 
 module.exports = merge(prodEnv, {
   NODE_ENV: '"development"',
+<<<<<<< HEAD
+  BASE_API: '"http://channel.admin.dev.zonelife.cn/zs/channel/admin"'
+  // BASE_API: '"https://xskjsci.com/zs/channel/admin"'
+  // BASE_API: '"http://192.168.110.241:9120/zs/channel/admin"'
+  // BASE_API: '"http://192.168.1.34:9120/zs/channel/admin"'
+=======
   // BASE_API: '"http://192.168.110.241:9120/zs/channel/admin"'
   BASE_API: '"http://192.168.2.21:9120/zs/channel/admin"'
   // BASE_API: '"https://channel.admin.dev.zonelife.cn"'
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 })

+ 5 - 0
config/prod.env.js

@@ -1,5 +1,10 @@
 'use strict'
 module.exports = {
   NODE_ENV: '"production"',
+<<<<<<< HEAD
+  // BASE_API: '"http://channel.admin.dev.zonelife.cn/zs/channel/admin"'
+  BASE_API: '"https://channel-api.zonelife.cn/zs/channel/admin"'
+=======
   BASE_API: '"https://admin-api.macrozheng.com"'
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 }

Fichier diff supprimé car celui-ci est trop grand
+ 788 - 6
package-lock.json


+ 16 - 0
package.json

@@ -2,7 +2,11 @@
   "name": "channel-admin",
   "version": "1.0.0",
   "description": "channel后台管理前端",
+<<<<<<< HEAD
+  "author": "tigerzouzx@foxmail.com",
+=======
   "author": "macro",
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
   "private": true,
   "scripts": {
     "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
@@ -12,12 +16,24 @@
   "dependencies": {
     "ali-oss": "^6.21.0",
     "axios": "^0.18.0",
+<<<<<<< HEAD
+    "big.js": "^6.2.2",
     "echarts": "^4.2.0-rc.2",
     "element-ui": "^2.3.7",
     "file-saver": "^2.0.5",
+    "html2canvas": "^1.4.1",
     "js-cookie": "^2.2.0",
     "normalize.css": "^8.0.0",
     "nprogress": "^0.2.0",
+    "pnpm": "^10.5.2",
+=======
+    "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",
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     "sass": "^1.32.8",
     "v-charts": "^1.19.0",
     "v-distpicker": "^1.0.20",

+ 16 - 0
src/api/channel.js

@@ -12,7 +12,11 @@ export function channelList(params) {
   //渠道列表编辑
 export function editList(data) {
   return request({
+<<<<<<< HEAD
+    url:'/pms/cThirdPartyInfo/updateThirdPartyInfo',
+=======
     url:'/pms/cThirdPartyInfo/update',
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     method:'post',
     data:data
   })
@@ -61,4 +65,16 @@ export function upTheAccount(data) {
     method:'post',
     data:data
   })
+<<<<<<< HEAD
+}
+
+// 上账/结算
+export function createChannel(data) {
+  return request({
+    url:'pms/cThirdPartyInfo/saveThirdPartyInfo',
+    method:'post',
+    data:data
+  })
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 }

+ 83 - 0
src/api/distribution.js

@@ -92,11 +92,19 @@ export function recordsList(params) {
 }
 
 // 更新财务结算状态
+<<<<<<< HEAD
+export function updateStatus(id,params) {
+  return request({
+    url: "/ums/umsAdminUser/financialSettlement?settleRecordIds="+id,
+    method: "post",
+    params: params,
+=======
 export function updateStatus(data) {
   return request({
     url: "/ums/umsAdminUser/financialSettlement",
     method: "post",
     data: data,
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
   });
 }
 
@@ -117,3 +125,78 @@ export function updatePassword(data) {
     data:data
   })
 }
+<<<<<<< HEAD
+
+// 结算记录列表
+export function financeList(params) {
+  return request({
+    url: "/ums/umsAdminUser/getSettleRecordList",
+    method: "get",
+    params: params,
+  });
+}
+
+// 充电桩列表
+export function chargeList(params) {
+  return request({
+    url: "/pms/cChargeStation/list",
+    method: "get",
+    params: params,
+  });
+}
+
+// 分销站时间段销售价
+export function priceList(params) {
+  return request({
+    url: "/ums/distributionStationTimePrice/getStationTimePrice",
+    method: "get",
+    params: params,
+  });
+}
+
+// 设置时段佣金
+export function settingsPrice(data) {
+  return request({
+    url:'/ums/distributionStationTimePrice/setDistributionPrice',
+    method:'post',
+    data:data
+  })
+}
+
+// 获取全部分销员
+export function getpeopleList(params) {
+  return request({
+    url: "/ums/umsAdminUser/listAll",
+    method: "get",
+    params: params,
+  });
+}
+
+// 获取所属平台
+export function getTerraceList(params) {
+  return request({
+    url: "/pms/cChargeStation/getStationType",
+    method: "get",
+    params: params,
+  });
+}
+
+// 根据平台名称获取电站信息
+export function getPowerhouseList(params) {
+  return request({
+    url: `/pms/cChargeStation/getStationTimePriceList/?equipmentOwnerNames=${params}`,
+    method: "get",
+    params: params,
+  });
+}
+
+// 批量设置时段佣金
+export function batchSettingsPrice(data) {
+  return request({
+    url:'/ums/distributionStationTimePrice/beachSetDistributionPrice',
+    method:'post',
+    data:data
+  })
+}
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 3 - 0
src/api/oss.js

@@ -3,9 +3,12 @@ export function policy(data) {
   return request({
     url:'/ums/fileCtl/upload',
     method:'post',
+<<<<<<< HEAD
+=======
     headers:{
       "Content-Type":"multipart/form-data",
     },
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     data:data
   })
 }

BIN
src/assets/images/qrCode_bg.jpg


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

@@ -1,3 +1,25 @@
+<<<<<<< HEAD
+<!--
+ * @Descripttion: 图片上传组件
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-09 16:08:16
+ * @LastEditors: zzx tigerzouzx@foxmail.com
+ * @LastEditTime: 2024-11-21 18:00:00   
+-->
+<template>
+    <div>
+        <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" :modal="false">
+            <img width="100%" :src="imgUrl.url" alt />
+        </el-dialog>
+        <!-- <Button text="上 传" type="add_u" style="margin-top: 10px;" @click.native="submitUpload"></Button> -->
+=======
 <template>
     <div>
             <!-- :on-change="uploadFile" -->
@@ -11,13 +33,18 @@
                 <img width="100%" :src="imgUrl.url" alt />
             </el-dialog>
             <!-- <Button text="上 传" type="add_u" style="margin-top: 10px;" @click.native="submitUpload"></Button> -->
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     </div>
 </template>
 
 <script>
 //引入上传图片接口
+<<<<<<< HEAD
+import { policy } from '@/api/oss'
+=======
   import {policy} from '@/api/oss'
 // import { uploadImg } from "@/api/public/api";
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 export default {
     props: {
         limit: Number,
@@ -28,6 +55,14 @@ export default {
         return {
             showUpload: false, //控制limit最大值之后 关闭上传按钮
             dialogVisible: false, //查看图片弹出框
+<<<<<<< HEAD
+            imgUrl: {}, //上传图片后地址合集
+        };
+    },
+    watch: {
+        fileList(newName, oldName) {
+            if (newName.length == this.limit) this.showUpload = false;
+=======
             imgUrl: [], //上传图片后地址合集
         };
     },
@@ -35,6 +70,7 @@ export default {
     watch: {
         fileList(newName, oldName) {
             if (newName.length == this.limit) this.showUpload = true;
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             else this.showUpload = false;
         },
     },
@@ -42,16 +78,27 @@ export default {
         //文件列表移除文件时的函数
         handleRemove(file, fileList) {
             const index = this.fileList.findIndex((item) => item === file.uid);
+<<<<<<< HEAD
+            // this.imgUrl.splice();
+=======
             this.imgUrl.splice(index, 1);
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             this.$emit("delUrl", this.imgUrl);
             if (fileList.length < this.limit) this.showUpload = false;
         },
         //点击文件列表中已上传的文件时的函数
         handlePictureCardPreview(file) {
+<<<<<<< HEAD
+            this.imgUrl = file;
+            this.dialogVisible = true;
+        },
+        //不需要直接上传而是通过按钮上传的方法
+=======
             this.imgUrl.url = file.url;
             this.dialogVisible = true;
         },
         //这里是不需要直接上传而是通过按钮上传的方法
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         submitUpload() {
             this.$refs.upload.submit();
         },
@@ -71,6 +118,16 @@ export default {
                     file.type === "image/jpeg"
                 )
             ) {
+<<<<<<< HEAD
+                this.$message.warning("请上传格式为image/png, image/gif, image/jpg, image/jpeg的图片");
+            } else if (size > 2) {
+                this.$message.warning("图片大小必须小于2M");
+                // this.$notify.warning({
+                //     title: "警告",
+                //     message:
+                //         "请上传格式为image/png, image/gif, image/jpg, image/jpeg的图片",
+                // });
+=======
                 this.$notify.warning({
                     title: "警告",
                     message:
@@ -81,13 +138,19 @@ export default {
                     title: "警告",
                     message: "图片大小必须小于2M",
                 });
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             } else {
                 if (this.limit == 1) this.imgUrl = []; //此处判断为一张的时候需要清空数组
                 const params = new FormData();
                 params.append("fileMut", file);
                 policy(params).then((res) => {
+<<<<<<< HEAD
+                    //修改为自己接口的状态码
+                    if (res.code === 200) {
+=======
                     //这里返回的数据结构(根据自己返回结构进行修改)
                     if (res.code ===200 ) {
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                         this.$message.success("上传成功");
                         this.imgUrl = res.data;
                         //调用父组件的方法来传递图片参数
@@ -96,7 +159,10 @@ export default {
                 });
             }
         },
+<<<<<<< HEAD
+=======
         //文件超出个数限制时的函数
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         handleExceed(files, fileList) {
             this.$message.info(`最多只允许上传${this.limit}张图片`);
         },

+ 13 - 0
src/components/backButton/index.vue

@@ -0,0 +1,13 @@
+<template>
+    <el-button size="small" type="primary" plain icon="el-icon-back" @click="comeBack">返回</el-button>
+</template>
+<script>
+export default {
+  name: 'backButton',
+  methods: {
+    comeBack() {
+      this.$router.back();
+    }
+  }
+};
+</script>

+ 8 - 0
src/main.js

@@ -6,6 +6,10 @@ import ElementUI from 'element-ui'
 import 'element-ui/lib/theme-chalk/index.css'
 import locale from 'element-ui/lib/locale/lang/zh-CN' // lang i18n
 import VCharts from 'v-charts'
+<<<<<<< HEAD
+import backButton from './components/BackButton/index.vue';
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 
 import '@/styles/index.scss' // global css
 
@@ -18,6 +22,10 @@ import '@/permission' // permission control
 
 Vue.use(ElementUI, { locale })
 Vue.use(VCharts)
+<<<<<<< HEAD
+Vue.component('backButton', backButton);
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 
 Vue.config.productionTip = false
 

+ 53 - 0
src/permission.js

@@ -1,3 +1,41 @@
+<<<<<<< HEAD
+import router from "./router";
+import store from "./store";
+import NProgress from "nprogress"; // Progress 进度条
+import "nprogress/nprogress.css"; // Progress 进度条样式
+import { Message } from "element-ui";
+import { getToken } from "@/utils/auth"; // 验权
+
+const whiteList = ["/login"]; // 不重定向白名单
+router.beforeEach((to, from, next) => {
+  NProgress.start();
+  if (getToken()) {
+    if (to.path === "/login") {
+      next({ path: "/" });
+      NProgress.done(); // if current page is dashboard will not trigger	afterEach hook, so manually handle it
+    } else {
+      if (store.getters.roles.length === 0) {
+        store
+          .dispatch("GetInfo")
+          .then((res) => {
+            // 拉取用户信息
+            let menus = res.data.menus;
+            let username = res.data.username;
+            store.dispatch("GenerateRoutes", { menus, username }).then(() => {
+              // 生成可访问的路由表
+              router.addRoutes(store.getters.addRouters); // 动态添加可访问路由表
+              next({ ...to, replace: true });
+            });
+          })
+          .catch((err) => {
+            store.dispatch("FedLogOut").then(() => {
+              Message.error(err || "Verification failed, please login again");
+              next({ path: "/" });
+            });
+          });
+      } else {
+        next();
+=======
 import router from './router'
 import store from './store'
 import NProgress from 'nprogress' // Progress 进度条
@@ -29,10 +67,24 @@ router.beforeEach((to, from, next) => {
         })
       } else {
         next()
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
       }
     }
   } else {
     if (whiteList.indexOf(to.path) !== -1) {
+<<<<<<< HEAD
+      next();
+    } else {
+      next("/login");
+      NProgress.done();
+    }
+  }
+});
+
+router.afterEach(() => {
+  NProgress.done(); // 结束Progress
+});
+=======
       next()
     } else {
       next('/login')
@@ -44,3 +96,4 @@ router.beforeEach((to, from, next) => {
 router.afterEach(() => {
   NProgress.done() // 结束Progress
 })
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 59 - 0
src/router/index.js

@@ -21,6 +21,21 @@ 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},
+<<<<<<< HEAD
+  {
+    path: '',
+    component: Layout,
+    redirect: '/home',
+    meta: {title: '首页', icon: 'home'},
+    children: [{
+      path: 'home',
+      name: 'home',
+      component: () => import('@/views/home/index'),
+      meta: {title: '首页', icon: 'home'}
+    },] 
+  }
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 
 ]
 
@@ -54,7 +69,11 @@ export const asyncRouterMap = [
   {
     path: '/distribution',
     component: Layout,
+<<<<<<< HEAD
+    redirect: '/distribution/userList',
+=======
     redirect: '/distribution/distributionSet',
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     name: 'distribution',
     meta: {title: '分销管理', icon: 'total-yesterday'},
     children: [{
@@ -83,6 +102,37 @@ export const asyncRouterMap = [
       hidden: true
     },
     {
+<<<<<<< HEAD
+      path: 'setCommission',
+      name: 'setCommission',
+      component: () => import('@/views/distribution/peopleManage/setCommission'),
+      meta: {title: '电站列表', icon: 'peopleChannel'},
+      hidden: true
+    },
+    {
+      path: 'settingsPrice',
+      name: 'settingsPrice',
+      component: () => import('@/views/distribution/peopleManage/settingsPrice'),
+      meta: {title: '价格设置', icon: 'peopleChannel'},
+      hidden: true
+    },
+    {
+      path: 'firstSetPrice',
+      name: 'firstSetPrice',
+      component: () => import('@/views/distribution/peopleManage/firstSetPrice'),
+      meta: {title: '价格设置', icon: 'peopleChannel'},
+      hidden: true
+    },
+    {
+      path: 'batchSetting',
+      name: 'batchSetting',
+      component: () => import('@/views/distribution/peopleManage/batchSetting'),
+      meta: {title: '批量设置分销佣金'},
+      hidden: true
+    },
+    {
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
       path: 'statistics',
       name: 'statistics',
       component: () => import('@/views/distribution/statistics/index'),
@@ -95,6 +145,15 @@ export const asyncRouterMap = [
       meta: {title: '分销记录', icon: 'example'}
     },
     {
+<<<<<<< HEAD
+      path: 'finance',
+      name: 'finance',
+      component: () => import('@/views/distribution/finance/index'),
+      meta: {title: '结算记录', icon: 'order-return-reason'}
+    },
+    {
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
       path: 'changePwd',
       name: 'changePwd',
       component: () => import('@/views/distribution/changePwd/index'),

+ 9 - 0
src/store/index.js

@@ -3,6 +3,10 @@ import Vuex from 'vuex'
 import app from './modules/app'
 import user from './modules/user'
 import permission from './modules/permission'
+<<<<<<< HEAD
+import cacheModule from './modules/cache';
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 import getters from './getters'
 
 Vue.use(Vuex)
@@ -11,7 +15,12 @@ const store = new Vuex.Store({
   modules: {
     app,
     user,
+<<<<<<< HEAD
+    permission,
+    cache: cacheModule
+=======
     permission
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
   },
   getters
 })

+ 30 - 0
src/store/modules/cache.js

@@ -0,0 +1,30 @@
+// 引入localStorage
+const state = {
+  isAdmin: parseInt(localStorage.getItem("isAdmin")) || null,
+};
+
+const mutations = {
+  setIsAdmin(state, isAdmin) {
+    if (isAdmin === null) {
+      state.isAdmin = null;
+      localStorage.removeItem("isAdmin");
+    } else {
+      state.isAdmin = parseInt(isAdmin);
+      localStorage.setItem("isAdmin", isAdmin.toString());
+    }
+  },
+};
+
+// 取
+const getters = {
+  getIsAdmin: (state) => {
+    return state.isAdmin;
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  getters,
+};

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

@@ -1,3 +1,14 @@
+<<<<<<< HEAD
+import { login, logout, getInfo } from "@/api/login";
+import { getToken, setToken, removeToken } from "@/utils/auth";
+import { mapMutations } from "vuex";
+const user = {
+  state: {
+    token: getToken(),
+    name: "",
+    avatar: "",
+    roles: [],
+=======
 import { login, logout, getInfo } from '@/api/login'
 import { getToken, setToken, removeToken } from '@/utils/auth'
 
@@ -7,10 +18,24 @@ const user = {
     name: '',
     avatar: '',
     roles: []
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
   },
 
   mutations: {
     SET_TOKEN: (state, token) => {
+<<<<<<< HEAD
+      state.token = token;
+    },
+    SET_NAME: (state, name) => {
+      state.name = name;
+    },
+    SET_AVATAR: (state, avatar) => {
+      state.avatar = avatar;
+    },
+    SET_ROLES: (state, roles) => {
+      state.roles = roles;
+    },
+=======
       state.token = token
     },
     SET_NAME: (state, name) => {
@@ -22,11 +47,28 @@ const user = {
     SET_ROLES: (state, roles) => {
       state.roles = roles
     }
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
   },
 
   actions: {
     // 登录
     Login({ commit }, userInfo) {
+<<<<<<< HEAD
+      const username = userInfo.username.trim();
+      return new Promise((resolve, reject) => {
+        login(username, userInfo.password)
+          .then((response) => {
+            const data = response.data;
+            const tokenStr = data.tokenHead + data.token;
+            setToken(tokenStr);
+            commit("SET_TOKEN", tokenStr);
+            resolve();
+          })
+          .catch((error) => {
+            reject(error);
+          });
+      });
+=======
       const username = userInfo.username.trim()
       return new Promise((resolve, reject) => {
         login(username, userInfo.password).then(response => {
@@ -39,11 +81,32 @@ const user = {
           reject(error)
         })
       })
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     },
 
     // 获取用户信息
     GetInfo({ commit, state }) {
       return new Promise((resolve, reject) => {
+<<<<<<< HEAD
+        getInfo()
+          .then((response) => {
+            const data = response.data;
+            if (data.roles && data.roles.length > 0) {
+              // 验证返回的roles是否是一个非空数组
+              commit("SET_ROLES", data.roles);
+              commit("cache/setIsAdmin", data.type);
+            } else {
+              reject("getInfo: roles must be a non-null array !");
+            }
+            commit("SET_NAME", data.username);
+            commit("SET_AVATAR", data.icon);
+            resolve(response);
+          })
+          .catch((error) => {
+            reject(error);
+          });
+      });
+=======
         getInfo().then(response => {
           const data = response.data
           localStorage.setItem("isAdmin",data.type);
@@ -59,11 +122,26 @@ const user = {
           reject(error)
         })
       })
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     },
 
     // 登出
     LogOut({ commit, state }) {
       return new Promise((resolve, reject) => {
+<<<<<<< HEAD
+        logout(state.token)
+          .then(() => {
+            commit("SET_TOKEN", "");
+            commit("SET_ROLES", []);
+            commit("cache/setIsAdmin", null);
+            removeToken();
+            resolve();
+          })
+          .catch((error) => {
+            reject(error);
+          });
+      });
+=======
         logout(state.token).then(() => {
           commit('SET_TOKEN', '')
           commit('SET_ROLES', [])
@@ -73,10 +151,23 @@ const user = {
           reject(error)
         })
       })
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     },
 
     // 前端 登出
     FedLogOut({ commit }) {
+<<<<<<< HEAD
+      return new Promise((resolve) => {
+        commit("SET_TOKEN", "");
+        removeToken();
+        resolve();
+      });
+    },
+  },
+};
+
+export default user;
+=======
       return new Promise(resolve => {
         commit('SET_TOKEN', '')
         removeToken()
@@ -87,3 +178,4 @@ const user = {
 }
 
 export default user
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 17 - 0
src/styles/index.scss

@@ -1,8 +1,16 @@
+<<<<<<< HEAD
+@use './variables.scss' as *;
+@use './mixin.scss' as *;
+@use './transition.scss' as *;
+@use './element-ui.scss' as *;
+@use './sidebar.scss' as *;
+=======
 @import './variables.scss';
 @import './mixin.scss';
 @import './transition.scss';
 @import './element-ui.scss';
 @import './sidebar.scss';
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 
 body {
   -moz-osx-font-smoothing: grayscale;
@@ -157,3 +165,12 @@ a:hover {
   color: #909399;
 }
 
+<<<<<<< HEAD
+.tips{
+  font-size: 14px;
+  color: red;
+  margin-left: 20px;
+}
+
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 6 - 0
src/styles/sidebar.scss

@@ -69,9 +69,15 @@
   .sidebar-container .nest-menu .el-submenu>.el-submenu__title,
   .sidebar-container .el-submenu .el-menu-item {
     min-width: 180px !important;
+<<<<<<< HEAD
+    background-color:#1f2d3d !important;
+    &:hover {
+      background-color:#001528 !important;
+=======
     background-color: $subMenuBg !important;
     &:hover {
       background-color: $menuHover !important;
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     }
   }
   .el-menu--collapse .el-menu .el-submenu {

+ 12 - 0
src/utils/common.js

@@ -0,0 +1,12 @@
+//消除js计算误差,add、reduce是传入的加减数字,reduce是被加数(被减数),s是加减符号
+export function addAndsub(add,reduce, s, num){
+	let m = Math.pow(10, num); //num是10的次幂
+	let res = s == '+' ? (add * m + reduce * m) / m : (add * m - reduce * m) / m;
+	return Math.round(res * m) / m;
+}
+
+// 导出一个函数,用于判断一个对象是否为空
+export function isEmpty(obj) {
+	// 使用Object.keys()方法获取对象的所有键,并判断其长度是否为0
+	return Object.keys(obj).length === 0;
+  }

+ 100 - 0
src/utils/request.js

@@ -1,11 +1,110 @@
+<<<<<<< HEAD
+import axios from "axios";
+import { Message, MessageBox } from "element-ui";
+import store from "../store";
+import { getToken } from "@/utils/auth";
+=======
 import axios from 'axios'
 import { Message, MessageBox } from 'element-ui'
 import store from '../store'
 import { getToken } from '@/utils/auth'
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 
 // 创建axios实例
 const service = axios.create({
   baseURL: process.env.BASE_API, // api的base_url
+<<<<<<< HEAD
+  timeout: 15000, // 请求超时时间
+});
+
+// request拦截器
+service.interceptors.request.use(
+  (config) => {
+    if (store.getters.token) {
+      config.headers["Authorization"] = getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
+    }
+    return config;
+  },
+  (error) => {
+    // Do something with request error
+    console.log(error); // for debug
+    Promise.reject(error);
+    
+  }
+);
+
+// respone拦截器
+service.interceptors.response.use(
+  (response) => {
+    /**
+     * code为非200是抛错 可结合自己业务进行修改
+     */
+    const res = response.data;
+    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;
+      }
+    } else {
+      return response;
+    }
+  },
+  (error) => {
+    if (error.response) {
+      if (error.response.status === 500) {
+        if(error.response.data.code==401){
+          MessageBox.confirm(
+            "你已被登出,可以取消继续留在该页面,或者重新登录",
+            "确定登出",
+            {
+              confirmButtonText: "重新登录",
+              cancelButtonText: "取消",
+              type: "warning",
+            }
+          ).then(() => {
+            store.dispatch("FedLogOut").then(() => {
+              location.reload();
+            });
+          });
+        }else{
+          Message({
+            message:'服务器错误:' +error.message,
+            type: "error",
+            duration: 3 * 1000,
+          });
+        }
+      }
+    }
+    console.log("err" + error); // for debug
+    return Promise.reject(error);
+  }
+);
+
+export default service;
+=======
   timeout: 15000 // 请求超时时间
 })
 
@@ -68,3 +167,4 @@ service.interceptors.response.use(
 )
 
 export default service
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 288 - 0
src/views/channel/info/index.vue

@@ -4,7 +4,11 @@
  * @Author: zzx
  * @Date: 2024-11-09 16:08:16
  * @LastEditors: zzx tigerzouzx@foxmail.com
+<<<<<<< HEAD
+ * @LastEditTime: 2025-01-08 12:00:00
+=======
  * @LastEditTime: 2024-11-19 16:08:16
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 -->
 <template>
   <div class="app-container">
@@ -25,7 +29,11 @@
             <el-input v-model="listQuery.ecName" class="input-width" placeholder="请输入渠道名称" clearable></el-input>
           </el-form-item>
           <el-form-item label="创建时间:">
+<<<<<<< HEAD
+            <el-date-picker v-model="date" size="small" value-format="yyyy-MM-dd HH:mm:ss" class="item-width-350 ml10"
+=======
             <el-date-picker v-model="date" size="small" value-format="yyyy-MM-dd" class="item-width-350 ml10"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
               type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
             </el-date-picker>
           </el-form-item>
@@ -39,6 +47,71 @@
     </el-card>
     <div class="table-container">
       <el-table ref="adminTable" :data="list" style="width: 100%" v-loading="listLoading" border>
+<<<<<<< HEAD
+        <el-table-column label="渠道编号(key)" align="center" prop="appId"></el-table-column>
+        <el-table-column label="app_id" align="center" prop="authCode"></el-table-column>
+        <el-table-column label="渠道名称" align="center" prop="ecName"></el-table-column>
+        <el-table-column label="合作模式" align="center" prop="serviceMoneyType">
+          <template slot-scope="scope">
+            <span v-if="scope.row.serviceMoneyType == 1">{{ '统一服务费' || '--' }}</span>
+            <span v-if="scope.row.serviceMoneyType == 2">{{ '服务费抽成' || '--' }}</span>
+            <span v-if="scope.row.serviceMoneyType == 3">{{ '分时段服务费' || '--' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="抽成比例" align="center">
+          <template slot-scope="scope">{{ scope.row.commissionServiceMoney || "--" }}</template>
+        </el-table-column>
+        <el-table-column label="分时段服务费(元/度)" align="center">
+          <template slot-scope="scope">
+            <div style="color: rgb(245,108,108);">峰:{{ scope.row.timeServiceMoney &&
+              scope.row.timeServiceMoney['1'] || '--' }}</div>
+            <div style="color: rgb(230, 162, 10);">平:{{ scope.row.timeServiceMoney &&
+              scope.row.timeServiceMoney['2'] || '--' }}</div>
+            <div style="color: rgb(103, 194, 58);">谷:{{ scope.row.timeServiceMoney &&
+              scope.row.timeServiceMoney['3'] || '--' }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="统一服务费(元/度)" align="center">
+          <template slot-scope="scope">{{ scope.row.serviceMoney || "--" }}</template>
+        </el-table-column>
+        <!-- <el-table-column label="联系人" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.contactName || "--" }}
+          </template>
+        </el-table-column> -->
+        <!-- <el-table-column label="手机号" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.contactPhone || "--" }}
+          </template>
+        </el-table-column> -->
+        <!-- <el-table-column label="渠道服务费/元" width="160" align="center" prop="serviceMoney"></el-table-column> -->
+        <el-table-column label="使用状态" width="160" align="center">
+          <template slot-scope="scope">
+            <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="创建人" width="140" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.createBy || "--" }}
+          </template>
+        </el-table-column>
+        <el-table-column label="创建时间" width="140" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.createTime || "--" }}
+          </template>
+        </el-table-column>
+        <el-table-column label="更新人" width="140" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.updateBy || "--" }}
+          </template>
+        </el-table-column> -->
+        <el-table-column label="更新时间" width="140" align="center">
+          <template slot-scope="scope">
+            {{ scope.row.updateTime || "--" }}
+          </template>
+        </el-table-column>
+=======
         <el-table-column label="渠道编号" width="100" align="center" prop="appId"></el-table-column>
         <el-table-column label="渠道名称" align="center" prop="ecName"></el-table-column>
         <el-table-column label="联系人" align="center" prop="contactName"></el-table-column>
@@ -54,6 +127,7 @@
         <el-table-column label="创建时间" width="140" align="center" prop="createTime"></el-table-column>
         <el-table-column label="更新人" width="140" align="center" prop="updateBy"></el-table-column>
         <el-table-column label="更新时间" width="140" align="center" prop="updateTime"></el-table-column>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         <el-table-column label="操作" width="180" align="center">
           <template slot-scope="scope">
             <el-button size="mini" type="primary" plain @click="handleUpdate(scope.$index, scope.row)">
@@ -70,6 +144,61 @@
       </el-pagination>
     </div>
     <el-dialog :title="isEdit ? '编辑' : '添加'" :visible.sync="dialogVisible" width="40%">
+<<<<<<< HEAD
+      <el-form :model="admin" ref="adminForm" label-width="150px" size="small" :rules="rules">
+        <el-form-item label="渠道编号(key):">
+          <el-input disabled v-model="admin.appId" style="width: 250px"></el-input>
+        </el-form-item>
+        <el-form-item label="app_id:">
+          <el-input disabled v-model="admin.authCode" style="width: 250px"></el-input>
+        </el-form-item>
+        <el-form-item label="渠道名称:" prop="ecName">
+          <el-input v-model="admin.ecName" style="width: 250px"></el-input>
+        </el-form-item>
+        <el-form-item label="联系人:" prop="contactName">
+          <el-input v-model="admin.contactName" style="width: 250px"></el-input>
+        </el-form-item>
+        <el-form-item label="手机号:" prop="contactPhone">
+          <el-input v-model="admin.contactPhone" type="number" style="width: 250px"></el-input>
+        </el-form-item>
+        <el-form-item label="合作模式:" prop="serviceMoneyType">
+          <el-radio-group v-model="admin.serviceMoneyType" @input="changeCooperation">
+            <el-radio :label="1" :disabled="isEdit && admin.serviceMoneyType !=1">统一服务费</el-radio>
+            <el-radio :label="2" :disabled="isEdit && admin.serviceMoneyType !=2">服务费抽成</el-radio>
+            <el-radio :label="3" :disabled="isEdit && admin.serviceMoneyType !=3">分时段服务费</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label=" 渠道服务费(元/度):" prop="serviceMoney" v-if="admin.serviceMoneyType == 1">
+          <el-input v-model="admin.serviceMoney" :disabled="isEdit" type="number" style="width: 250px"></el-input>
+          <div>当前平台服务费为0.1元/度</div>
+        </el-form-item>
+        <el-form-item label=" 抽成比例:" prop="commissionServiceMoney" v-if="admin.serviceMoneyType == 2">
+          <el-input v-model="admin.commissionServiceMoney" :disabled="isEdit" type="number" style="width: 250px"></el-input> %
+        </el-form-item>
+        <div class="serviceMoney-box" v-if="admin.serviceMoneyType == 3">
+          <el-form-item label="峰" prop="peakServiceMoney">
+            <div class="serviceMoney-item">
+              <el-input v-model="admin.peakServiceMoney" :disabled="isEdit" type="number" style="width:100px"></el-input>
+              <div class="serviceMoney-item-unit">元/度</div>
+            </div>
+          </el-form-item>
+          <el-form-item label="平" prop="flatServiceMoney">
+            <div class="serviceMoney-item">
+              <el-input v-model="admin.flatServiceMoney" :disabled="isEdit" type="number" style="width:100px"></el-input>
+              <div class="serviceMoney-item-unit">元/度</div>
+            </div>
+          </el-form-item>
+          <el-form-item label="谷" prop="valleyServiceMoney">
+            <div class="serviceMoney-item">
+              <el-input v-model="admin.valleyServiceMoney" :disabled="isEdit" type="number" style="width:100px"></el-input>
+              <div class="serviceMoney-item-unit">元/度</div>
+            </div>
+          </el-form-item>
+        </div>
+        <el-form-item label="使用状态:">
+          <el-switch v-model="switchStatus" @change="changeSwitch">
+          </el-switch>
+=======
       <el-form :model="admin" ref="adminForm" label-width="150px" size="small">
         <el-form-item label="渠道编号:">
           <el-input disabled v-model="admin.appId" style="width: 250px"></el-input>
@@ -86,6 +215,7 @@
         <el-form-item label="渠道服务费:">
           <el-input v-model="admin.serviceMoney" type="text" :rows="5" style="width: 250px"></el-input>
           <div>当前平台服务费为0.1</div>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         </el-form-item>
       </el-form>
       <span slot="footer" class="dialog-footer">
@@ -96,16 +226,41 @@
   </div>
 </template>
 <script>
+<<<<<<< HEAD
+import { channelList, editList, createChannel } from "@/api/channel";
+import { formatDate } from "@/utils/date";
+import { isEmpty } from "@/utils/common";
+=======
 import {
   createAdmin,
 } from "@/api/login";
 import { channelList, editList } from "@/api/channel";
 import { formatDate } from "@/utils/date";
 
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 const defaultListQuery = {
   pageNum: 1,
   pageSize: 10,
   ecName: null,
+<<<<<<< HEAD
+  startTime: "",
+  endTime: "",
+};
+const defaultAdmin = {
+  appId: null,
+  authCode: null,
+  ecName: null,
+  contactName: null,
+  contactPhone: null,
+  serviceMoneyType: null,
+  status: null,
+  serviceMoney: null,
+  thirdPartyId: null,
+  commissionServiceMoney: null, //抽成比例
+  peakServiceMoney: null, //峰
+  flatServiceMoney: null, //平
+  valleyServiceMoney: null, //谷
+=======
   startTime: '',
   endTime: ''
 };
@@ -117,12 +272,17 @@ const defaultAdmin = {
   email: null,
   note: null,
   status: 1,
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 };
 export default {
   name: "info",
   data() {
     return {
+<<<<<<< HEAD
+      date: "",
+=======
       date: '',
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
       listQuery: Object.assign({}, defaultListQuery),
       list: null,
       total: null,
@@ -134,6 +294,23 @@ export default {
       allocRoleIds: [],
       allRoleList: [],
       allocAdminId: null,
+<<<<<<< HEAD
+      switchStatus: true,
+      rules: {
+        ecName: [{ required: true, message: "请输入渠道名称", trigger: "blur" }],
+        contactName: [{ required: true, message: "请输入联系人", trigger: "blur" }],
+        contactPhone: [{ required: true, message: "请输入联系电话", trigger: "blur" },
+        { pattern: /^1[3-9]\d{9}$/, message: '请输入正确手机号', trigger: 'blur' },
+        ],
+        serviceMoneyType: [{ required: true, message: "请选择服务费类型", trigger: "blur" }],
+        serviceMoney: [{ required: true, message: "请输入服务费", trigger: "blur" }],
+        commissionServiceMoney: [{ required: true, message: "请输入抽成比例", trigger: "blur" }],
+        peakServiceMoney: [{ required: true, message: "请输入峰值服务费", trigger: "blur" }],
+        flatServiceMoney: [{ required: true, message: "请输入平峰服务费", trigger: "blur" }],
+        valleyServiceMoney: [{ required: true, message: "请输入谷值服务费", trigger: "blur" }],
+      }
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     };
   },
   watch: {
@@ -160,8 +337,33 @@ export default {
     },
   },
   methods: {
+<<<<<<< HEAD
+    // 是否禁用
+    changeSwitch(val) {
+      if (val == true) {
+        this.admin.status = 1
+      } else {
+        this.admin.status = 2
+      }
+    },
+
+    // 合作方式
+    changeCooperation(val) {
+      this.admin.serviceMoneyType = val
+      this.admin.serviceMoney = ''
+      this.admin.commissionServiceMoney = ''
+      this.admin.peakServiceMoney = ''
+      this.admin.flatServiceMoney = ''
+      this.admin.valleyServiceMoney = ''
+    },
+
+    // 重置搜索框
+    handleResetSearch() {
+      this.date = "";
+=======
     // 重置搜索框
     handleResetSearch() {
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
       this.listQuery = Object.assign({}, defaultListQuery);
     },
 
@@ -188,6 +390,10 @@ export default {
     handleAdd() {
       this.dialogVisible = true;
       this.isEdit = false;
+<<<<<<< HEAD
+      this.switchStatus = true;
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
       this.admin = Object.assign({}, defaultAdmin);
     },
 
@@ -195,11 +401,73 @@ export default {
     handleUpdate(index, row) {
       this.dialogVisible = true;
       this.isEdit = true;
+<<<<<<< HEAD
+      if (row.status == 1) {
+        this.switchStatus = true;
+      } else {
+        this.switchStatus = false;
+      }
+      let timeServiceMoneyObj = {}
+      if (isEmpty(row.timeServiceMoney||{}) == false) {
+        timeServiceMoneyObj = {
+          peakServiceMoney: row.timeServiceMoney[1],
+          flatServiceMoney: row.timeServiceMoney[2],
+          valleyServiceMoney: row.timeServiceMoney[3]
+        }
+        this.admin = {
+          ...this.admin,
+          ...row,
+          ...timeServiceMoneyObj
+        };
+      } else {
+        this.admin = {
+          ...this.admin,
+          ...row
+        };
+      }
+      this.admin.thirdPartyId = row.id
+=======
       this.admin = Object.assign({}, row);
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     },
 
     // 编辑或增加确定回调
     handleDialogConfirm() {
+<<<<<<< HEAD
+      this.$refs.adminForm.validate(valid => {
+        if (valid) {
+          this.$confirm("是否要确认?", "提示", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning",
+          }).then(() => {
+            if (this.isEdit) {
+              editList(this.admin).then((response) => {
+                if (response.code == 200) {
+                  this.$message({
+                    message: "修改成功!",
+                    type: "success",
+                  });
+                  this.dialogVisible = false;
+                  this.getList();
+                }
+              });
+            } else {
+              createChannel(this.admin).then((response) => {
+                if (response.code == 200) {
+                  this.$message({
+                    message: "添加成功!",
+                    type: "success",
+                  });
+                  this.dialogVisible = false;
+                  this.getList();
+                }
+              });
+            }
+          });
+        }
+      })
+=======
       this.$confirm("是否要确认?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
@@ -237,6 +505,7 @@ export default {
           });
         }
       });
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     },
 
     // 获取列表
@@ -244,6 +513,12 @@ export default {
       this.listLoading = true;
       channelList(this.listQuery).then((response) => {
         this.listLoading = false;
+<<<<<<< HEAD
+        response.data.list.map(item => {
+          item.timeServiceMoney = JSON.parse(item.timeServiceMoney);
+        })
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         this.list = response.data.list;
         this.total = response.data.total;
       });
@@ -251,4 +526,17 @@ export default {
   },
 };
 </script>
+<<<<<<< HEAD
+<style>
+.serviceMoney-item {
+  display: flex;
+}
+
+.serviceMoney-item-unit {
+  width: 50px;
+  margin-left: 5px;
+}
+</style>
+=======
 <style></style>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 21 - 0
src/views/channel/upCheck/index.vue

@@ -4,7 +4,11 @@
  * @Author: zzx
  * @Date: 2024-11-09 16:08:16
  * @LastEditors: zzx
+<<<<<<< HEAD
+ * @LastEditTime: 2024-12-05 16:08:16
+=======
  * @LastEditTime: 2024-11-19 16:08:16
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 -->
 <template>
     <div class="app-container">
@@ -26,7 +30,11 @@
                             clearable></el-input>
                     </el-form-item>
                     <el-form-item label="操作时间:">
+<<<<<<< HEAD
+                        <el-date-picker v-model="date" size="small" value-format="yyyy-MM-dd HH:mm:ss"
+=======
                         <el-date-picker v-model="date" size="small" value-format="yyyy-MM-dd"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                             class="item-width-350 ml10" type="datetimerange" range-separator="至"
                             start-placeholder="开始日期" end-placeholder="结束日期">
                         </el-date-picker>
@@ -44,6 +52,14 @@
                 <el-table-column label="渠道名称" align="center" prop="ecName"></el-table-column>
                 <el-table-column label="渠道上账金额/元" align="center">
                     <template slot-scope="scope">
+<<<<<<< HEAD
+                        <span v-if="scope.row.type==1" style="color:#15BD39;">{{ scope.row.money||"--" }}</span>
+                        <span v-if="scope.row.type==2" style="color: #FE9900;">{{ '-'+scope.row.money||"--" }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="操作人" align="center" prop="updateBy"></el-table-column>
+                <el-table-column label="操作时间" width="160" align="center" prop="createTime"></el-table-column>
+=======
                         {{ scope.row.money||"--" }}
                     </template>
                 </el-table-column>
@@ -54,6 +70,7 @@
                 </el-table-column>
                 <el-table-column label="操作人" align="center" prop="updateBy"></el-table-column>
                 <el-table-column label="操作时间" width="160" align="center" prop="updateTime"></el-table-column>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             </el-table>
         </div>
         <div class="pagination-container">
@@ -115,6 +132,10 @@ export default {
     },
     methods: {
         handleResetSearch() {
+<<<<<<< HEAD
+            this.date="",
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             this.listQuery = Object.assign({}, defaultListQuery);
         },
         handleSearchList() {

+ 102 - 0
src/views/channel/useCondition/index.vue

@@ -4,7 +4,11 @@
  * @Author: zzx
  * @Date: 2024-11-09 16:08:16
  * @LastEditors: zzx
+<<<<<<< HEAD
+ * @LastEditTime: 2024-11-21 18:00:00   
+=======
  * @LastEditTime: 2024-11-19 16:08:16
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 -->
 <template>
     <div class="app-container">
@@ -25,12 +29,15 @@
                         <el-input v-model="listQuery.ecName" class="input-width" placeholder="请输入渠道名称"
                             clearable></el-input>
                     </el-form-item>
+<<<<<<< HEAD
+=======
                     <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>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                 </el-form>
             </div>
         </el-card>
@@ -73,13 +80,21 @@
                             v-else>
                             结算
                         </el-button>
+<<<<<<< HEAD
+                        <!-- <el-button size="mini" type="danger" plain @click="forbiddenStatus(scope.$index, scope.row)"
+=======
                         <el-button size="mini" type="danger" plain @click="forbiddenStatus(scope.$index, scope.row)"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                             v-if="scope.row.status === 1">
                             禁用
                         </el-button>
                         <el-button size="mini" type="warning" plain @click="enable(scope.$index, scope.row)" v-else>
                             启用
+<<<<<<< HEAD
+                        </el-button> -->
+=======
                         </el-button>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                     </template>
                 </el-table-column>
             </el-table>
@@ -120,6 +135,17 @@
                         admin.totalPayable || "0"
                             }}</span></template>
                 </el-form-item>
+<<<<<<< HEAD
+                <el-form-item label="本次上账金额/元:" prop="money">
+                    <el-input v-model="admin.money" placeholder="请输入上账金额" type="number" :rows="5"
+                        style="width: 250px"></el-input>
+                    <el-checkbox v-if="!isEdit" v-model="admin.checked">负数</el-checkbox>
+                </el-form-item>
+                <!-- <el-form-item label="上传凭证:">
+                    <uploadImg :limit="1" :file-list="fileList" @getUrl="getUrl($event)" @delUrl="delUrl($event)"
+                        :disabled="false"></uploadImg>
+                </el-form-item> -->
+=======
                 <el-form-item label="本次上账金额/元:" prop="upAccount">
                     <el-input v-model="admin.money" placeholder="请输入上账金额" type="text" :rows="5"
                         style="width: 250px"></el-input>
@@ -129,6 +155,7 @@
                     <uploadImg :limit="2" :file-list="fileList" @getUrl="getUrl($event)" @delUrl="delUrl($event)"
                         :disabled="false"></uploadImg>
                 </el-form-item>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             </el-form>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="dialogVisible = false" size="small">取 消</el-button>
@@ -140,13 +167,20 @@
 <script>
 import { useConditionList, updateStatus, upTheAccount } from "@/api/channel";
 import { formatDate } from "@/utils/date";
+<<<<<<< HEAD
+// import uploadImg from '@/components/Upload/uploadImg'
+=======
 import uploadImg from '@/components/Upload/uploadImg'
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 const defaultListQuery = {
     pageNum: 1,
     pageSize: 10,
     ecName: null,
+<<<<<<< HEAD
+=======
     startTime: "",
     endTime: "",
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 };
 const defaultAdmin = {
     id: null,
@@ -159,6 +193,14 @@ const defaultAdmin = {
 };
 export default {
     name: "useCondition",
+<<<<<<< HEAD
+    // components: { uploadImg },
+    data() {
+        return {
+            fileList: [],
+            upImg: '',
+            setQuery: {},
+=======
     components: { uploadImg },
     data() {
         return {
@@ -166,6 +208,7 @@ export default {
             upImg:'',
             setQuery: {},
             date: "",
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             isforbidden: false,
             forbiddenDialogVisible: false,
             listQuery: Object.assign({}, defaultListQuery),
@@ -179,6 +222,14 @@ export default {
             allRoleList: [],
             allocAdminId: null,
             rules: {
+<<<<<<< HEAD
+                money: [{ required: true, message: "请输入金额", trigger: "blur" },
+                { validator: this.handleInput, trigger: 'blur' }],
+            },
+        };
+    },
+    watch: {},
+=======
                 upAccount: [{ required: true, message: "请输入金额", trigger: "blur" }],
             },
         };
@@ -194,6 +245,7 @@ export default {
             }
         },
     },
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     created() {
         this.getList();
     },
@@ -207,6 +259,19 @@ export default {
         },
     },
     methods: {
+<<<<<<< HEAD
+        handleInput(rule, value, callback) {
+            if (value < 0) {
+                callback(new Error('请输入正数'));
+            } else {
+                callback();
+            }
+        },
+        //函数
+        // getUrl(getUrl) {
+        //     this.upImg = getUrl;
+        // },
+=======
         //函数
         getUrl(getUrl) {
             this.upImgUrl = getUrl;
@@ -214,6 +279,7 @@ export default {
         delUrl(getUrl) {
             console.log(getUrl,'----删除')
         },
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 
         // 启用
         enable(index, row) {
@@ -280,6 +346,41 @@ export default {
         },
 
         handleDialogConfirm() {
+<<<<<<< HEAD
+            this.$refs.adminForm.validate(valid => {
+                if (valid) {
+                    this.$confirm("是否要确认?", "提示", {
+                        confirmButtonText: "确定",
+                        cancelButtonText: "取消",
+                        type: "warning",
+                    }).then(() => {
+                        let updateData = {
+                            money: this.admin.money,
+                            thirdPartyInfoId: this.admin.thirdPartyId,
+                            type: this.isEdit == true ? 1 : 2,
+                            voucherPic: this.upImg,
+                        };
+                        upTheAccount({ ...updateData }).then((response) => {
+                            if (response.code == 200) {
+                                this.$message({
+                                    message: this.isEdit == true ? "上账成功!" : "结算成功!",
+                                    type: "success",
+                                });
+                                this.fileList = [];
+                                this.$refs["adminForm"].resetFields();
+                                this.dialogVisible = false;
+                                this.getList();
+                            } else {
+                                this.$message({
+                                    message: response.msg,
+                                    type: "error",
+                                });
+                            }
+                        });
+                    });
+                }
+            })
+=======
             this.$confirm("是否要确认?", "提示", {
                 confirmButtonText: "确定",
                 cancelButtonText: "取消",
@@ -307,6 +408,7 @@ export default {
                     }
                 });
             });
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         },
         getList() {
             this.listLoading = true;

+ 15 - 0
src/views/distribution/changePwd/index.vue

@@ -1,7 +1,11 @@
 <template>
     <div class="app-container">
         <el-card class="filter-container" shadow="hover">
+<<<<<<< HEAD
+            <back-button></back-button>
+=======
             <el-button size="small" type="info" icon="el-icon-back" @click="comeBack">返回</el-button>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         </el-card>
         <el-card class="filter-container" style="margin-top: 20px;" shadow="hover">
             <el-form :model="admin" ref="admin" label-width="150px" :rules="rules" size="small">
@@ -16,11 +20,19 @@
                         style="width: 250px"></el-input>
                 </el-form-item>
                 <el-form-item label="新密码:" prop="pwd">
+<<<<<<< HEAD
+                    <el-input v-model="admin.pwd" clearable placeholder="请输入新密码" type="" number
+                        style="width: 250px"></el-input>
+                </el-form-item>
+                <el-form-item label="确认密码:" prop="newPassword">
+                    <el-input v-model="admin.newPassword" clearable placeholder="请确认密码" type="" number
+=======
                     <el-input v-model="admin.pwd" clearable placeholder="请输入新密码" type="number" number
                         style="width: 250px"></el-input>
                 </el-form-item>
                 <el-form-item label="确认密码:" prop="newPassword">
                     <el-input v-model="admin.newPassword" clearable placeholder="请确认密码" type="number" number
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                         style="width: 250px"></el-input>
                 </el-form-item>
             </el-form>
@@ -66,11 +78,14 @@ export default {
     computed: {
     },
     methods: {
+<<<<<<< HEAD
+=======
         // 返回上一级
         comeBack() {
             this.$router.back()
         },
 
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         submitForm() {
             let data = {
                 oldPassword: this.admin.oldPassword,

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

@@ -7,15 +7,24 @@
  * @LastEditTime: 2024-11-20 16:32:51
 -->
 <template>
+<<<<<<< HEAD
+    <div>
+        <el-card class="form-container" shadow="hover">
+=======
     <div class="app-container">
         <el-card class="filter-container" shadow="hover">
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             <el-form :model="admin" ref="admin" label-width="150px" :rules="rules" size="small">
                 <div class="blSet">
                     <h4>返佣比例设置</h4>
                     <span @click="forbiddenDialogVisible = true">查看说明</span>
                 </div>
                 <el-form-item label="一级返佣比例%:" prop="firstLevel">
+<<<<<<< HEAD
+                    <el-input v-model="admin.firstLevel" placeholder="请输入一级返佣比例" type="number"
+=======
                     <el-input v-model="admin.firstLevel" clearable placeholder="请输入一级返佣比例" type="number"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                         style="width: 250px"></el-input>
                 </el-form-item>
                 <el-form-item label="二级返佣比例%:" prop="secondLevel">
@@ -40,6 +49,20 @@
             <div class="text1">1.一级返佣比例,是指一级分销员所获得的返佣比例;二级分佣比例,是指二级分销员所获得的返佣比例。</div>
             <div class="text1">2.计算公式:</div>
             <div class="text2">举例:某电站的计费策略如下图,一级返佣比例为10%,二级返佣比例为90%,某用户在9点开始充电,11点结束,消耗2度电。</div>
+<<<<<<< HEAD
+            <div class="text2">(1)只有一级分销员,由一级分销员直接发展的用户。一级分销员的返佣总金额 = 订单中服务费金额/元 × 一级返佣比例。</div>
+            <div class="text2">(2)有两级分销员:</div>
+            <div class="text3">二级分销员的返佣总金额 = 订单中的服务费金额/元 × 一级返佣比例 × 二级返佣比例。</div>
+            <div class="text3">一级分销员的返佣总金额 = 订单中的服务费金额/元 × 一级返佣比例 ×(1 - 二级返佣比例/度)。</div>
+            <div class="text2">举例:一级分销员的返佣总金额 = 0.56 × 0.1 ×(1 - 0.9) = 0.0056元。</div>
+            <div class="text3">二级分销员的返佣总金额 = 0.56 × 0.1 × 0.9 = 0.0504 元。</div>
+            <div style="margin-top: 20px;">
+                <el-table ref="adminTable" :data="list" border>
+                    <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>
+=======
             <div class="text2">只有一级分销员,由一级分销员直接发展的用户。一级分销员的返佣总金额 = 运营服务费/度 × 一级返佣比例/度 × 用户充电度数举例:0.13 × 0.1 × 2 = 0.026
                 元</div>
             <div class="text2">(2)有两级分销员。二级分销员的返佣总金额 = 运营服务费/度 × 一级返佣比例/度 × 二级返佣比例度 × 用户充电度数一级分销员的返佣总金额 = 运营服务费/度 ×
@@ -54,6 +77,7 @@
                     <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>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                 </el-table>
             </div>
         </el-dialog>
@@ -74,6 +98,20 @@ export default {
             forbiddenDialogVisible: false,
             setLoading: false,
             list: [{
+<<<<<<< HEAD
+                times: 'TLD241024224843367449',
+                electricity: '2.73',
+                service: '0.56',
+                total: '2024-10-24 16:00:00',
+            }],
+            rules: {
+                firstLevel: [{ required: true, message: '请输入一级返佣比例', trigger: 'blur' },
+                { pattern: /^\d+(\.\d{0,2})?$/, message: '最多保留两位小数', trigger: 'blur' },
+                {validator:this.handleInput, trigger: 'blur'}],
+                secondLevel: [{ required: true, message: '请输入二级返佣比例', trigger: 'blur' },
+                { pattern: /^\d+(\.\d{0,2})?$/, message: '最多保留两位小数', trigger: 'blur' },
+                {validator:this.handleInput, trigger: 'blur'}],
+=======
                 times: '09:00-12:00',
                 electricity: '0.82',
                 service: '0.24',
@@ -91,6 +129,7 @@ export default {
             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' }],
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                 maxUserCount: [{ required: true, message: '请输入人数限制', trigger: 'blur' }],
             },
         }
@@ -101,6 +140,16 @@ export default {
     computed: {
     },
     methods: {
+<<<<<<< HEAD
+        handleInput(rule, value, callback) {
+            if (value<=0||value>100) {
+                callback(new Error('比例必须在0-100之间'));
+            }else{
+                callback();
+            }
+        },
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         submitForm() {
             this.$refs.admin.validate(valid => {
                 if (valid) {
@@ -115,9 +164,15 @@ export default {
                             secondLevel: this.admin.secondLevel,
                             maxUserCount: this.admin.maxUserCount,
                         };
+<<<<<<< HEAD
+                        this.setLoading = true
+                        distributionSet({ ...updateData }).then((response) => {
+                            this.setLoading = false
+=======
                         this.setLoading= true
                         distributionSet({ ...updateData }).then((response) => {
                             this.setLoading= false
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                             if (response.code == 200) {
                                 this.$message({
                                     message: "提交成功!",

+ 281 - 0
src/views/distribution/finance/index.vue

@@ -0,0 +1,281 @@
+<!--
+ * @Descripttion: 分销记录
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-09 16:08:16
+ * @LastEditors: zzx
+ * @LastEditTime: 2024-11-21 18:00:00
+-->
+<template>
+    <div class="app-container">
+        <el-card class="filter-container" shadow="hover">
+            <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.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.status" 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="txDate" size="mini" value-format="yyyy-MM-dd HH:mm:ss"
+                            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="colseDate" size="mini" value-format="yyyy-MM-dd HH:mm:ss"
+                            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="hover">
+            <div class="title">
+                <div class="titleContent">
+                    <i class="el-icon-tickets"></i>
+                    <span>数据列表</span>
+                </div>
+                <div>
+                    <el-button class="ml10" type="info" size="small" :disabled="exportDisabled" :loading="downloadLoading" icon="el-icon-printer"
+                        @click="exportAllExcel">导出</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 label="分销员" align="center">
+                    <template slot-scope="scope">
+                    <span>{{ scope.row.userName || '--' }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="分销员手机号" align="center">
+                    <template slot-scope="scope">
+                    <span>{{ scope.row.phone || '--' }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="结算金额(直属用户)/元" align="center">
+                    <template slot-scope="scope">
+                    <span  class="pushRecords" @click="pushRecords(scope.row)">{{ scope.row.firstMoney || '--' }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="结算金额(下级分销)/元" align="center">
+                    <template slot-scope="scope">
+                    <span>{{ scope.row.secondMoney || '--' }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="结算金额(总额)/元" align="center">
+                    <template slot-scope="scope">
+                    <span>{{ scope.row.money || '--' }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="结算状态" align="center">
+                    <template slot-scope="scope">
+                        <el-tag type="success" v-if="scope.row.status === 2">已结算</el-tag>
+                        <el-tag type="danger" v-else>待结算</el-tag>
+                    </template>
+                </el-table-column>
+                <el-table-column label="提现时间" align="center" prop="withdrawTime"></el-table-column>
+                <el-table-column label="结算时间" align="center" prop="settleTime"></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>
+    </div>
+</template>
+<script>
+import { financeList } from "@/api/distribution";
+import { formatDate } from "@/utils/date";
+import FileSaver from 'file-saver';
+import XLSX from 'xlsx';
+const defaultListQuery = {
+    pageNum: 1,
+    pageSize: 10,
+    status: null,
+    startSettleTime: "",
+    endSettleTime: "",
+    startWithdrawTime: "",
+    endWithdrawTime: "",
+};
+export default {
+    name: "finance",
+    data() {
+        return {
+            colseDate: '',
+            txDate: '',
+            exportDisabled: false,
+            downloadLoading: false,
+            listQuery: Object.assign({}, defaultListQuery),
+            list: null,
+            total: null,
+            listLoading: false,
+            options: [{
+                value: 1,
+                label: "待结算",
+            },
+            {
+                value: 2,
+                label: "已结算",
+            },
+            ],
+        };
+    },
+    watch: {
+        txDate(val) {
+            if (val) {
+                this.listQuery.startWithdrawTime = Date.parse(val[0]);
+                this.listQuery.endWithdrawTime = Date.parse(val[1]);
+            } else {
+                this.listQuery.startWithdrawTime = "";
+                this.listQuery.endWithdrawTime = "";
+            }
+        },
+        colseDate(val) {
+            if (val) {
+                this.listQuery.startSettleTime = Date.parse(val[0]);
+                this.listQuery.endSettleTime = Date.parse(val[1]);
+
+            } else {
+                this.listQuery.startSettleTime = "";
+                this.listQuery.endSettleTime = "";
+
+            }
+        },
+    },
+    created() {
+        this.getList();
+        if (this.$route) {
+            this.listQuery.adminUserId = this.$route.query.adminUserId
+        }
+    },
+    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: {
+        // 跳转至记录列表
+        pushRecords(row) {
+            this.$router.push({
+                path: "/distribution/records",
+                query: {
+                    adminUserId: row.adminUserId,
+                    recordId: row.id,
+                },
+            });
+        },
+        // 导出
+        exportAllExcel() {
+            this.downloadLoading = true
+            const allData = [];
+            let query = JSON.parse(JSON.stringify(this.listQuery))
+            query.pageSize = this.total
+            query.page = 0
+            financeList(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.firstMoney||'--',
+                    "结算金额(下级分销)/元": item.secondMoney||'--',
+                    "身份证号": item.card||'--',
+                    "银行卡号":item.bankCard||'--',
+                    "开户行": item.depositBank||'--',
+                    "结算金额/元": item.money||'--',
+                    "结算状态": item.status == 2 ? "已结算" : "待结算",
+                    "提现时间": item.withdrawTime,
+                    "结算时间": item.settleTime,
+                }
+            })
+            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');
+        },
+
+        handleResetSearch() {
+            this.colseDate='',
+            this.txDate='',
+            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;
+            financeList(this.listQuery).then((response) => {
+                this.listLoading = false;
+                this.list = response.data.list;
+                this.total = response.data.total;
+                if(this.list.length<=0){
+                    this.exportDisabled = true
+                }else{
+                    this.exportDisabled = false
+                }
+            });
+        },
+    },
+};
+</script>
+<style scoped lang="scss">
+.title {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+
+.pushRecords {
+    color: #409EFF;
+    cursor: pointer;
+}
+</style>

+ 360 - 0
src/views/distribution/peopleManage/batchSetting.vue

@@ -0,0 +1,360 @@
+<!--
+ * @Descripttion: 批量设置分销佣金
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2025-02-08 10:18:00
+ * @LastEditors: zzx tigerzouzx@foxmail.com
+ * @LastEditTime: 2025-02-08 18:00:00
+-->
+<template>
+    <div class="app-container">
+        <el-card class="operate-container" shadow="hover">
+            <i class="el-icon-tickets"></i>
+            <span>批量设置分销佣金</span>
+            <back-button style="float: right; margin-right: 15px"></back-button>
+        </el-card>
+        <div class="table-container" style="background-color: #fff;">
+            <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+                <el-form-item :label="identities" prop="checkedCities">
+                    <el-checkbox :indeterminate="isIndeterminate" v-model="ruleForm.checkAll"
+                        @change="handleCheckAllChange">全选</el-checkbox>
+                    <div class="check-layout">
+                        <el-checkbox-group v-model="ruleForm.checkedCities" @change="handleCheckedCitiesChange">
+                            <el-checkbox v-for="city in cities" :label="city.adminUserId" :key="city.id" name="type">{{
+                                city.userName || '暂无姓名信息' }} {{ city.phone || '暂无电话信息' }}</el-checkbox>
+                        </el-checkbox-group>
+                    </div>
+                </el-form-item>
+                <el-form-item label="设备所属方" prop="checkedBelonging">
+                    <el-checkbox-group v-model="ruleForm.checkedBelonging" @change="handleBelongingChange">
+                        <el-checkbox v-for="belong in belongingList" :label="belong.equipmentOwnerName"
+                            :key="belong.equipmentOwnerName" name="belonging">{{
+                                belong.equipmentOwnerName }}</el-checkbox>
+                    </el-checkbox-group>
+                </el-form-item>
+            </el-form>
+            <div style="margin-top: 15px;" v-for="(list, index) in dialogList" :key="index">
+                <div class="table-tips">
+                    <div>
+                        {{ list.equipmentOwnerName }}的充电时段及费用信息
+                    </div>
+                    <div>
+                        提示:设置成功后,勾选的分销员的渠道所有站点都将修改为下表中的代理价
+                    </div>
+                </div>
+                <el-table v-if="isAmdin==0" ref="adminTable" :data="list.distributionStationTimePriceVOS" style="width: 100%" border>
+                    <el-table-column label="时间段" align="center" prop="time"></el-table-column>
+                    <el-table-column label="电费(元/度)" align="center" prop="electrovalence"></el-table-column>
+                    <el-table-column label="结算服务费(元)" align="center" prop="servicePrice"></el-table-column>
+                    <el-table-column label="结算费合计(元)" align="center" prop="eprice"></el-table-column>
+                    <el-table-column label="运营服务费(元)" align="center" prop="addServicePrice"></el-table-column>
+                    <el-table-column label="销售合计价(元)" align="center" prop="platformPrice"></el-table-column>
+                    <el-table-column :label="isAmdin == 0 ? '一级代理价(元)' : '二级代理价(元)'" align="center" prop="">
+                        <template slot-scope="scope">
+                            <el-tooltip class="item" v-if="scope.row.isEdit === false" effect="dark" content="单击编辑"
+                                placement="left">
+                                <span class="edit" @click="toggleEdit(scope.row)">{{
+                                    scope.row.firstLevelPrice }}</span>
+                            </el-tooltip>
+                            <el-input v-else v-model="editInput" size="small"
+                                oninput="value=value.replace(/[^\d.]/g,'')" style="width: 200px;">
+                                <i slot="suffix" size="small" class="el-icon-check" @click="confrimEdit(scope.row)"></i>
+                                <i slot="suffix" size="small" class="el-icon-close" @click="cancelEdit(scope.row)"></i>
+                            </el-input>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <el-table v-if="isAmdin==2" ref="adminTable" :data="list.distributionStationTimePriceVOS" style="width: 100%" border>
+                    <el-table-column label="时间段" align="center" prop="time"></el-table-column>
+                    <el-table-column label="销售合计价(元)" align="center" prop="platformPrice"></el-table-column>
+                    <el-table-column label="一级代理价(元)" align="center" prop="firstLevelPrice"
+                        v-if="isAdmin != 3"></el-table-column>
+                    <el-table-column label="二级代理价(元)" align="center" prop="secondLevelPrice"
+                        v-if="isAdmin == 3"></el-table-column>
+                    <el-table-column label="二级代理价(元)" align="center" v-else>
+                        <template slot-scope="scope">
+                            <el-tooltip class="item" v-if="scope.row.isEdit === false" effect="dark" content="单击编辑"
+                                placement="left">
+                                <span class="edit" @click="toggleEdit(scope.row)">{{ scope.row.secondLevelPrice
+                                    }}</span>
+                            </el-tooltip>
+                            <el-input v-else v-model="editInput" size="small"
+                                oninput="value=value.replace(/[^\d.]/g,'')" style="width: 200px;"
+                                @blur="saveEdit(scope.row)">
+                                <i slot="suffix" size="small" class="el-icon-check" @click="firstconfrimEdit(scope.row)"></i>
+                                <i slot="suffix" size="small" class="el-icon-close" @click="cancelEdit(scope.row)"></i>
+                            </el-input>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+        </div>
+        <div style="margin-top: 20px" align="center">
+            <el-button size="small" type="primary" @click="confirmSetting">确定</el-button>
+            <el-button size="small" @click="cancelSetting">取消</el-button>
+        </div>
+    </div>
+</template>
+<script>
+import { getpeopleList, getTerraceList, getPowerhouseList, batchSettingsPrice } from "@/api/distribution";
+import Big from 'big.js';
+export default {
+    data() {
+        return {
+            isAmdin: null,
+            // 多选start
+            cities: [],
+            isIndeterminate: false,
+            checkAll: false,
+            identities: '',
+            // 多选end
+            // 设备选择start
+            belongingList: [],
+            ruleForm: {
+                checkedCities: [],
+                checkedBelonging: [],
+
+            },
+            rules: {
+                checkedCities: [
+                    { type: 'array', required: true, message: '请至少选择一个分销员', trigger: 'change' }
+                ],
+                checkedBelonging: [
+                    { type: 'array', required: true, message: '请至少选择一个设备所属方', trigger: 'change' }
+                ]
+            },
+            // 设备选择end
+            // 渠道商电费列表数据start
+            dialogList: null,
+            editInput: null,
+            currentEditingRow: null, //用于记录当前正在编辑的行
+            adminUserIdList: [],
+            postArray: [],
+            // 渠道商电费列表数据end
+        }
+    },
+    created() {
+        this.isAmdin = localStorage.getItem("isAdmin");
+        if (this.isAmdin == 0) {
+            this.identities = '一级分销员'
+        } else {
+            this.identities = '二级分销员'
+        }
+        this.getList()
+        this.get_terraceList()
+    },
+    computed: {
+    },
+    methods: {
+        // 分销员全选
+        handleCheckAllChange(val) {
+            this.ruleForm.checkedCities = val ? this.cities.map(city => city.adminUserId) : [];
+            this.isIndeterminate = false;
+            if (val) {
+                this.adminUserIdList = [];
+                this.cities.forEach(item => {
+                    this.adminUserIdList.push(item.adminUserId);
+                })
+
+            } else {
+                this.adminUserIdList = [];
+            }
+        },
+
+        // 分销员单选
+        handleCheckedCitiesChange(value) {
+            let checkedCount = value.length;
+            this.ruleForm.checkAll = checkedCount === this.cities.length;
+            this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length;
+            if (value.length > 0) {
+                this.adminUserIdList = value
+            } else {
+                this.adminUserIdList = []
+            }
+        },
+
+        // 编辑价格
+        toggleEdit(row) {
+            if (this.currentEditingRow) {
+                this.currentEditingRow.isEdit = false;
+            }
+            row.isEdit = !row.isEdit;
+            if(this.isAmdin==0){
+                this.editInput = row.firstLevelPrice;
+            }else if(this.isAmdin==2){
+            this.editInput = row.secondLevelPrice;
+            }
+            if (row.isEdit) {
+                this.currentEditingRow = row;
+
+            } else {
+                this.currentEditingRow = null;
+            }
+        },
+
+        // 确定修改
+        confrimEdit(row) {
+            if (this.editInput >= row.platformPrice) {
+                return this.$message.error('价格必须小于平台价格');
+            }
+            if (this.editInput <= row.platformPrice - row.addServicePrice) {
+                return this.$message.error('一级代理价不合理,不在底价和销售价区间');
+            }
+            if (this.editInput <= 0) {
+                return this.$message.error('价格不能小于0');
+            }
+            if (this.isAmdin == 0) {
+            row.firstLevelPrice = this.editInput;
+            }else if (this.isAmdin == 2) {
+            row.secondLevelPrice = this.editInput;
+            }
+            row.isEdit = false
+            //置空当前编辑行记录
+            this.currentEditingRow = null;
+        },
+        firstconfrimEdit(row) {
+            if (this.editInput >= row.platformPrice) {
+                return this.$message.error('价格必须小于平台价格');
+            }
+            if (this.editInput <= row.firstLevelPrice) {
+                return this.$message.error('不能小于一级代理价');
+            }
+            if(this.editInput<=0){
+                return this.$message.error('价格不能小于0');
+            }
+            row.secondLevelPrice = this.editInput
+            row.isEdit = false
+            this.currentEditingRow = null;
+        },
+
+        // 取消
+        cancelEdit(row) {
+            this.editInput = 0;
+            row.isEdit = false
+            //置空当前编辑行记录
+            this.currentEditingRow = null;
+        },
+        // 设备商选择
+        handleBelongingChange(val) {
+            this.get_powerhouseList(val)
+        },
+
+        // 取消编辑
+        cancelSetting() {
+            this.$router.go(-1);
+        },
+
+        // 提交
+        confirmSetting() {
+            this.$refs.ruleForm.validate(valid => {
+                if (valid) {
+                    this.$confirm("是否要确认?", "提示", {
+                        confirmButtonText: "确定",
+                        cancelButtonText: "取消",
+                        type: "warning",
+                    }).then(() => {
+                        this.get_batchSettingsPrice()
+                    });
+                }
+            })
+        },
+
+        get_batchSettingsPrice() {
+            this.postArray = this.ruleForm.checkedBelonging.map(belonging => {
+                let newArray = [];
+                this.dialogList.forEach(e => {
+                    if (e.equipmentOwnerName === belonging) {
+                        newArray = e.distributionStationTimePriceVOS.map(item => ({
+                            firstLevelPrice: item.firstLevelPrice,
+                            id: item.id,
+                            platformPrice: item.platformPrice,
+                            secondLevelPrice: item.secondLevelPrice,
+                            servicePrice: new Big(item.platformPrice).minus(new Big(this.isAmdin == 0?item.firstLevelPrice:item.secondLevelPrice)).toNumber(),
+                            time: item.time
+                        }));
+                    }
+                })
+                return {
+                    equipmentOwnerName: belonging,
+                    adminUserIdList: this.adminUserIdList,
+                    distributionStationTimePriceDtoList: newArray
+                };
+            });
+            batchSettingsPrice(this.postArray).then((response) => {
+                if (response.code == 200) {
+                    this.$message.success('设置成功');
+                    this.$router.go(-1);
+                }
+            })
+        },
+
+        // 获取电站信息
+        get_powerhouseList(item) {
+            getPowerhouseList(item).then((response) => {
+                if (response.code == 200) {
+                    this.dialogList = response.data;
+                    this.dialogList.forEach(item => {
+                        item.distributionStationTimePriceVOS.map(e => {
+                            this.$set(e, 'isEdit', false); //初始化为false
+                        })
+                    })
+                }
+            });
+        },
+
+        // 获取所属平台
+        get_terraceList() {
+            getTerraceList().then((response) => {
+                if (response.code == 200) {
+                    this.belongingList = response.data;
+                }
+            });
+        },
+
+        // 分销商列表
+        getList() {
+            getpeopleList().then((response) => {
+                if (response.code == 200) {
+                    this.cities = response.data;
+                }
+            });
+        },
+    },
+}
+</script>
+<style lang="scss" scoped>
+.check-layout {
+    margin-top: 15px;
+    border: 1px solid #dcdfe6;
+    padding-left: 10px;
+}
+
+.table-tips {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    font-size: 14px;
+    margin-bottom: 10px;
+
+    &>div:last-child {
+        color: #f70000;
+    }
+}
+
+.edit {
+    color: #409EFF;
+    cursor: pointer;
+}
+
+.el-icon-check {
+    font-size: 22px;
+    font-weight: 1000;
+    color: rgb(103, 194, 58);
+}
+
+.el-icon-close {
+    font-size: 22px;
+    font-weight: 1000;
+    color: rgba(240, 10, 10, 0.6);
+}
+</style>

+ 190 - 0
src/views/distribution/peopleManage/firstSetPrice.vue

@@ -0,0 +1,190 @@
+<!--
+ * @Descripttion: 设置代理价
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-27 16:08:16
+ * @LastEditors: zzx tigerzouzx@foxmail.com
+ * @LastEditTime: 2024-12-02 18:00
+-->
+<template>
+    <div class="app-container">
+        <el-card class="operate-container" shadow="hover">
+            <div style="
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+        ">
+                <div style="display: flex; align-items: center">
+                    <div>
+                        <i class="el-icon-tickets"></i>
+                        <span>数据列表</span>
+                    </div>
+                    <div style="margin-left: 20px">
+                        <el-descriptions class="margin-top" :column="3" size="medium" border>
+                            <el-descriptions-item label="电站">{{ name }}</el-descriptions-item>
+                        </el-descriptions>
+                    </div>
+                </div>
+                <div>
+                    <back-button></back-button>
+                </div>
+            </div>
+        </el-card>
+        <div class="table-container">
+            <el-table ref="adminTable" :data="dialogList" style="width: 100%" v-loading="dialogListLoading" border>
+                <el-table-column label="时间段" align="center" prop="time"></el-table-column>
+                <el-table-column label="销售合计价(元)" align="center" prop="platformPrice"></el-table-column>
+                <el-table-column label="一级代理价(元)" align="center" prop="firstLevelPrice" v-if="isAdmin!=3"></el-table-column>
+                <el-table-column label="二级代理价(元)" align="center" prop="secondLevelPrice" v-if="isAdmin==3"></el-table-column>
+                <el-table-column label="二级代理价(元)" align="center" v-else>
+                    <template slot-scope="scope">
+                        <el-tooltip class="item" v-if="scope.row.isEdit === false" effect="dark" content="单击编辑" placement="left">
+                            <span class="edit" @click="toggleEdit(scope.row)">{{ scope.row.secondLevelPrice }}</span>
+                        </el-tooltip>
+                        <el-input v-else v-model="editInput" size="small" oninput="value=value.replace(/[^\d.]/g,'')" style="width: 200px;" @blur="saveEdit(scope.row)">
+                            <i slot="suffix" size="small" class="el-icon-check" @click="confrimEdit(scope.row)"></i>
+                            <i slot="suffix" size="small" class="el-icon-close" @click="cancelEdit(scope.row)"></i>
+                        </el-input>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </div>
+        <el-divider v-if="isAdmin!=3"></el-divider>
+        <el-card class="operate-container" shadow="hover" v-if="isAdmin!=3">
+            <div style="text-align: center;">
+                <el-button type="primary" size="small" :loading="confirmLoading" @click="confirmForbidden">提交</el-button>
+                <el-button type="info" size="small" @click="cancelForbidden">恢复默认</el-button>
+            </div>
+        </el-card>
+    </div>
+</template>
+<script>
+import { priceList, settingsPrice } from "@/api/distribution";
+import Big from 'big.js';
+const defaultListQuery = {
+    adminUserId: null,
+    stationId: null,
+};
+export default {
+    name: "settingsPrice",
+    data() {
+        return {
+            isAdmin: null,
+            name: null,
+            listQuery: Object.assign({}, defaultListQuery),
+            forbiddenForm: {},
+            dialogList: null,
+            dialogListLoading: false,
+            total: null,
+            editInput: null,
+            currentEditingRow: null, //用于记录当前正在编辑的行
+            confirmLoading: false
+        };
+    },
+    watch: {},
+    created() {
+        this.name = this.$route.query.name;
+        this.listQuery.adminUserId = this.$route.query.adminUserId;
+        this.listQuery.stationId = this.$route.query.stationId;
+        this.isAdmin = localStorage.getItem("isAdmin");
+        this.getList();
+    },
+    methods: {
+        toggleEdit(row) {
+            if (this.currentEditingRow) {
+                this.currentEditingRow.isEdit = false;
+            }
+            row.isEdit = !row.isEdit;
+            this.editInput = row.secondLevelPrice;
+            if (row.isEdit) {
+                this.currentEditingRow = row;
+                
+            } else {
+                this.currentEditingRow = null;
+            }
+        },
+        confrimEdit(row) {
+            if (this.editInput >= row.platformPrice) {
+                return this.$message.error('价格必须小于平台价格');
+            }
+            if (this.editInput <= row.firstLevelPrice) {
+                return this.$message.error('不能小于一级代理价');
+            }
+            if(this.editInput<=0){
+                return this.$message.error('价格不能小于0');
+            }
+            row.secondLevelPrice = this.editInput
+            row.isEdit = false
+            this.currentEditingRow = null;
+        },
+        cancelEdit(row) {
+            row.isEdit = false
+            this.editInput =0;
+            this.currentEditingRow = null;
+        },
+        saveEdit(row) {
+            // if (row.secondLevelPrice >= row.platformPrice) {
+            //     row.secondLevelPrice = 0
+            //     return this.$message.error('分销价格必须小于平台价格');
+            // }
+            // if (row.secondLevelPrice <= row.firstLevelPrice) {
+            //     row.secondLevelPrice = 0
+            //     return this.$message.error('二级代理价不能小于一级代理价');
+            // }
+            // row.secondLevelPrice = this.editInput
+            // console.log(this.editInput,'---输入框');
+            // console.log(row.secondLevelPrice,'---默认');
+            // row.isEdit = false
+        },
+        confirmForbidden() {
+            const newArray = this.dialogList.map(item => ({
+                adminUserId: this.listQuery.adminUserId,
+                firstLevelPrice: item.firstLevelPrice,
+                id: item.id,
+                platformPrice: item.platformPrice,
+                secondLevelPrice: item.secondLevelPrice,
+                servicePrice: new Big(item.platformPrice).minus(new Big(item.secondLevelPrice)).toNumber(),
+                stationId: this.listQuery.stationId,
+                time: item.time
+            }))
+            this.confirmLoading = true
+            settingsPrice(newArray).then((res) => {
+                this.confirmLoading = false
+                if (res.code == 200) {
+                    this.$message.success('设置成功');
+                    this.getList();
+                }
+            })
+        },
+        cancelForbidden() {
+            this.getList();
+        },
+        getList() {
+            this.dialogListLoading = true;
+            priceList(this.listQuery).then((response) => {
+                this.dialogListLoading = false;
+                this.dialogList = response.data;
+                this.dialogList.map(item => {
+                    this.$set(item, 'isEdit', false); //初始化为false
+                })
+            });
+        },
+    },
+};
+</script>
+<style scoped>
+.edit{
+    color: #409EFF;
+    cursor: pointer;
+}
+.el-icon-check{
+    font-size: 22px;
+    font-weight: 1000;
+    color: rgb(103,194,58);
+}
+.el-icon-close{
+    font-size: 22px;
+    font-weight: 1000;
+    color: rgba(240, 10, 10,0.6);
+}
+</style>

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

@@ -4,7 +4,11 @@
  * @Author: zzx
  * @Date: 2024-11-09 16:08:16
  * @LastEditors: zzx tigerzouzx@foxmail.com
+<<<<<<< HEAD
+ * @LastEditTime: 2025-01-08 16:08:16
+=======
  * @LastEditTime: 2024-11-19 16:08:16
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 -->
 <template>
     <div class="app-container">
@@ -37,7 +41,11 @@
                         </el-select>
                     </el-form-item>
                     <el-form-item label="更新时间:">
+<<<<<<< HEAD
+                        <el-date-picker v-model="date" size="small" value-format="yyyy-MM-dd HH:mm:ss"
+=======
                         <el-date-picker v-model="date" size="small" value-format="yyyy-MM-dd"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                             class="item-width-350 ml10" type="datetimerange" range-separator="至"
                             start-placeholder="开始日期" end-placeholder="结束日期">
                         </el-date-picker>
@@ -48,11 +56,23 @@
         <el-card class="operate-container" shadow="hover">
             <i class="el-icon-tickets"></i>
             <span>数据列表</span>
+<<<<<<< HEAD
+            <el-button v-if="isAdmin!=3" style="float: right; margin-right: 15px" @click="gotoBachSetting()" size="small">批量设置分销佣金</el-button>
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         </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>
+<<<<<<< HEAD
+                <el-table-column label="分销员姓名" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.userName||'--' }}
+                    </template>
+                </el-table-column>
+=======
                 <el-table-column label="分销员姓名" align="center" prop="userName"></el-table-column>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                 <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>
@@ -61,6 +81,46 @@
                     </template>
                 </el-table-column>
                 <el-table-column label="手机号" align="center" prop="phone"></el-table-column>
+<<<<<<< HEAD
+                <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">
+                    <template slot-scope="scope">
+                        {{ scope.row.depositBank||'--' }}
+                    </template>
+                </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="400" 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)"
+                            v-if="scope.row.type != 3">查看下级</el-button>
+                        <el-button :disabled="scope.row.isWithdraw == 0 ? isWithdraw = false : isWithdraw = true" size="mini"
+                            v-if="scope.row.isSelf == 1" type="info" plain @click="userEdit(scope.row)">编辑</el-button>
+                        <span v-if="isAdmin != 3">
+                            <el-button size="mini" v-if="scope.row.isSelf != 1" type="warning" plain
+                                @click="settingsCommission(scope.row)">
+                                设置分销佣金
+                            </el-button>
+                        </span>
+                        <span v-if="isAdmin == 3">
+                            <el-button size="mini" v-if="scope.row.isSelf==1" type="warning" plain
+                                @click="settingsCommission(scope.row)">
+                                查看分销佣金
+                            </el-button>
+                        </span>
+=======
                 <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>
@@ -74,6 +134,7 @@
                         <el-button size="mini" type="success" plain
                             @click="checkJunior(scope.$index, scope.row)">查看下级</el-button>
                         <el-button size="mini" :disabled="scope.row.isSelf==0" type="info" plain @click="userEdit(scope.row)">编辑</el-button>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                     </template>
                 </el-table-column>
             </el-table>
@@ -84,12 +145,22 @@
                 :page-size="listQuery.pageSize" :page-sizes="[10, 15, 20]" :total="total">
             </el-pagination>
         </div>
+<<<<<<< HEAD
+        <el-dialog title="编辑分销员" :visible.sync="forbiddenDialogVisible" width="40%" :before-close="handleClose">
+            <div class="tips" style="margin-bottom: 20px;margin-left: 52px;">请仔细核对个人信息,提现一次后,则不能进行修改,信息不对,会造成打款失败</div>
+            <el-form :model="admin" ref="adminForm" :rules="rules" 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="分销员姓名:" prop="userName">
+=======
         <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="分销员姓名:">
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                     <el-input v-model="admin.userName" style="width: 250px"></el-input>
                 </el-form-item>
                 <el-form-item label="分销员层级:">
@@ -103,6 +174,36 @@
                 <el-form-item label="手机号:">
                     <el-input v-model="admin.phone" disabled type="number" style="width: 250px"></el-input>
                 </el-form-item>
+<<<<<<< HEAD
+                <el-form-item label="身份证号码:" prop="card">
+                    <el-input v-model="admin.card" type="text" :rows="5" style="width: 250px"></el-input>
+                </el-form-item>
+                <el-form-item label="银行卡号:" prop="bankCard">
+                    <el-input v-model="admin.bankCard" type="text" :rows="5" style="width: 250px"></el-input>
+                </el-form-item>
+                <el-form-item label="开户行:" prop="depositBank">
+                    <el-input v-model="admin.depositBank" type="text" :rows="5" style="width: 250px"></el-input>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="cancelEdit" size="small">取 消</el-button>
+                <el-button type="primary" @click="confirmEdit" size="small">确 定</el-button>
+            </span>
+        </el-dialog>
+        <el-dialog title="查看二维码" :visible.sync="checkQrCodeDialogVisible" width="40%">
+            <div ref="posterContainer" class="qrCodeBox">
+                <div class="bigImgBox">
+                    <img :src="qrCode_bg" class="qrCodeBg">
+                    <el-image class="qrCode" style="" :src="qrCodeImg">
+                        <div slot="error" class="image-slot">
+                            <i class="el-icon-loading"></i>
+                        </div>
+                    </el-image>
+                </div>
+            </div>
+            <div style="text-align: center;margin-top: 20px;">
+                <el-button type="success" @click="downloadQrCode" :loading="downloadingQrCode" lazy size="mini">下载二维码</el-button>
+=======
                 <el-form-item label="身份证号码:">
                     <el-input v-model="admin.card" type="text" :rows="5" style="width: 250px"></el-input>
                 </el-form-item>
@@ -131,13 +232,21 @@
             </div>
             <div style="text-align: center;margin-top: 20px;">
                 <el-button type="success" @click="downloadQrCode" lazy size="mini">下载二维码</el-button>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             </div>
         </el-dialog>
     </div>
 </template>
 <script>
+<<<<<<< HEAD
+import { peopleList, getQrcode, peopleEdit } from "@/api/distribution";
+import { formatDate } from "@/utils/date";
+import html2canvas from 'html2canvas';
+import qrCode_bg from '@/assets/images/qrCode_bg.jpg'
+=======
 import { peopleList, getQrcode,peopleEdit } from "@/api/distribution";
 import { formatDate } from "@/utils/date";
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 
 const defaultListQuery = {
     pageNum: 1,
@@ -161,6 +270,11 @@ export default {
     name: "peopleManage",
     data() {
         return {
+<<<<<<< HEAD
+            isAdmin: null,
+            isWithdraw: false,
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             date: "",
             qrCodeImg: "",
             listQuery: Object.assign({}, defaultListQuery),
@@ -177,6 +291,17 @@ export default {
                 value: 3,
                 label: '二级'
             }],
+<<<<<<< HEAD
+            qrCode_bg,
+            downloadingQrCode: false,
+            rules: {
+                userName: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
+                card: [{ required: true, message: '请输入身份证号', trigger: 'blur' }],
+                bankCard: [{ required: true, message: '请输入银行卡号', trigger: 'blur' }],
+                depositBank: [{ required: true, message: '请输入开户行', trigger: 'blur' }],
+            }
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         };
     },
     watch: {
@@ -191,6 +316,10 @@ export default {
         },
     },
     created() {
+<<<<<<< HEAD
+        this.isAdmin = localStorage.getItem("isAdmin");
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         this.getList();
     },
     filters: {
@@ -203,11 +332,53 @@ export default {
         },
     },
     methods: {
+<<<<<<< HEAD
+        // 批量设置分销佣金
+        gotoBachSetting() {
+            this.$router.push({
+                name: "batchSetting",
+            });
+        },
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         // 编辑
         userEdit(row) {
             this.forbiddenDialogVisible = true;
             this.admin = row;
         },
+<<<<<<< HEAD
+        cancelEdit() {
+            this.$refs["adminForm"].resetFields();
+            this.forbiddenDialogVisible = false;
+        },
+        handleClose() {
+            this.$refs["adminForm"].resetFields();
+            this.forbiddenDialogVisible = false;
+        },
+        confirmEdit() {
+            this.$refs.adminForm.validate(valid => {
+                if (valid) {
+                    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();
+                        }
+                    })
+                }
+            })
+
+=======
         confirmEdit(){
             let data={
                 userName: this.admin.userName,
@@ -226,6 +397,7 @@ export default {
                     this.getList();
                 }
             })
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         },
 
         // 查看二维码
@@ -240,12 +412,29 @@ export default {
 
         // 下载
         downloadQrCode() {
+<<<<<<< HEAD
+            this.downloadingQrCode = true;
+            const posterContainer = this.$refs.posterContainer;
+            html2canvas(posterContainer, {
+                scale: 4 //图片分辨率
+            }).then(canvas => {
+                this.downloadingQrCode = false;
+                const dataURL = canvas.toDataURL('image/png');
+                const a = document.createElement('a');
+                a.href = dataURL;
+                a.download = '二维码海报.jpg';
+                document.body.appendChild(a);
+                a.click();
+                document.body.removeChild(a);
+            });
+=======
             const a = document.createElement('a');
             a.href = this.qrCodeImg;
             a.download = '二维码.jpg'; // 下载后的文件名
             document.body.appendChild(a);
             a.click();
             document.body.removeChild(a);
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         },
 
         // 查看下级
@@ -257,7 +446,20 @@ export default {
                 },
             });
         },
+<<<<<<< HEAD
+        settingsCommission(row) {
+            this.$router.push({
+                name: "setCommission",
+                query: {
+                    adminUserId: row.adminUserId,
+                }
+            })
+        },
+        handleResetSearch() {
+            this.date = ''
+=======
         handleResetSearch() {
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             this.listQuery = Object.assign({}, defaultListQuery);
         },
         handleSearchList() {
@@ -285,6 +487,31 @@ export default {
 };
 </script>
 <style scoped>
+<<<<<<< HEAD
+.qrCodeBox {
+    display: flex;
+    align-items: center;
+    justify-self: center;
+}
+
+.bigImgBox {
+    position: relative;
+    width: 260px;
+}
+
+.qrCodeBg {
+    width: 260px;
+    height: auto;
+    /* border-radius: 6px; */
+}
+
+.qrCode {
+    width: 100px;
+    height: 100px;
+    position: absolute;
+    top: 242px;
+    left: 80px;
+=======
 .peoplePagination {
     margin-top: 10px;
     display: flex;
@@ -295,5 +522,6 @@ export default {
     width: 110px;
     height: 110px;
     border-radius: 6px;
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 }
 </style>

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

@@ -9,12 +9,24 @@
 <template>
     <div class="app-container">
         <el-card class="filter-container" shadow="hover">
+<<<<<<< HEAD
+            <back-button></back-button>
+=======
             <el-button size="small" type="info" icon="el-icon-back" @click="comeBack">返回</el-button>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         </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>
+<<<<<<< HEAD
+                <el-table-column label="分销员姓名" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.userName||'--' }}
+                    </template>
+                </el-table-column>
+=======
                 <el-table-column label="分销员姓名" align="center" prop="userName"></el-table-column>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                 <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>
@@ -34,11 +46,14 @@
                     </template>
                 </el-table-column>
                 <el-table-column label="开户行" align="center" prop="depositBank"></el-table-column>
+<<<<<<< HEAD
+=======
                 <el-table-column label="佣金比例%" align="center" prop="level">
                     <template slot-scope="scope">
                         {{ scope.row.level ||'--' }}
                     </template>
                 </el-table-column>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             </el-table>
         </div>
         <div class="pagination-container">
@@ -71,10 +86,13 @@ export default {
         this.getList();
     },
     methods: {
+<<<<<<< HEAD
+=======
         // 返回上一级
         comeBack() {
             this.$router.back()
         },
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         juniorhandleSizeChange(val) {
             this.juniorQuery.pageNum = 1;
             this.juniorQuery.pageSize = val;

+ 253 - 0
src/views/distribution/peopleManage/setCommission.vue

@@ -0,0 +1,253 @@
+<!--
+ * @Descripttion: 设置分销佣金
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-27 16:08:16
+ * @LastEditors: zzx tigerzouzx@foxmail.com
+ * @LastEditTime: 2024-12-02 18:00
+-->
+<template>
+    <div class="app-container">
+        <el-card class="filter-container" shadow="hover">
+            <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-select v-model="listQuery.stationStatus" 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="充电站ID:">
+                        <el-input v-model="listQuery.stationId" type="number" class="input-width" placeholder="请输入充电站ID"
+                            clearable></el-input>
+                    </el-form-item>
+                    <el-form-item label="充电站名称:">
+                        <el-input v-model="listQuery.stationName" class="input-width" placeholder="请输入充电站名称"
+                            clearable></el-input>
+                    </el-form-item>
+                </el-form>
+            </div>
+        </el-card>
+        <el-card class="operate-container" shadow="hover">
+            <div style="display: flex;align-items: center;justify-content: space-between;">
+                <div style="display: flex;align-items: center;">
+                    <div>
+                        <i class="el-icon-tickets"></i>
+                        <span>数据列表</span>
+                    </div>
+                    <div style="margin-left:20px;">
+                        <el-descriptions class="margin-top" :column="3" size="medium" border>
+                            <el-descriptions-item label="可设置电站总数"> {{ noSetCount + haveSetCount || '0' }}</el-descriptions-item>
+                        </el-descriptions>
+                    </div>
+                </div>
+                <div>
+                    <back-button></back-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 label="充电站ID" width="100" align="center">
+                    <template slot-scope="scope">{{ scope.row.id || '--' }}</template>
+                </el-table-column>
+                <el-table-column label="充电站名称" align="center">
+                    <template slot-scope="scope">{{ scope.row.name || '--' }}</template>
+                </el-table-column>
+                <el-table-column label="是否使用" align="center" prop="showStatus">
+                    <template slot-scope="scope">
+                        <!-- 1可用,0不可用 -->
+                         <el-tag v-if="scope.row.showStatus == 1" type="success">使用中</el-tag>
+                         <el-tag v-if="scope.row.showStatus == 0" type="danger">不可用</el-tag>
+                    </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="equipmentOwnerName"></el-table-column>
+                <el-table-column label="详细地址" align="center" prop="addr"></el-table-column>
+                <el-table-column label="场所类型" align="center">
+                    <!-- 站点类型(1公共,50个人,100公交专用,101环卫专用,102物流专用,103出租车专用,255其他) -->
+                    <template slot-scope="scope">
+                        <el-tag v-if="scope.row.stationType == 1">公共</el-tag>
+                        <el-tag type="success" v-if="scope.row.stationType == 50">个人</el-tag>
+                        <el-tag type="info" v-if="scope.row.stationType == 100">公交专用</el-tag>
+                        <el-tag type="warning" v-if="scope.row.stationType == 101">环卫专用</el-tag>
+                        <el-tag type="danger" v-if="scope.row.stationType == 102">物流专用</el-tag>
+                        <el-tag effect="plain" type="success" v-if="scope.row.stationType == 103">出租车专用</el-tag>
+                        <el-tag effect="plain" type="warning" v-if="scope.row.stationType == 255">其他</el-tag>
+                    </template>
+                </el-table-column>
+                <el-table-column label="充电终端数量" align="center" prop="equipmentnum"></el-table-column>
+                <el-table-column label="站点状态" align="center">
+                    <template slot-scope="scope">
+                            {{ scope.row.stationStatus | stationStatusFilter }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="服务电话" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.serviceTel||'--' }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="更新时间" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.updateTime||'--' }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="操作" align="center">
+                    <template slot-scope="scope">
+                        <el-button size="mini" v-if="isAdmin == 0" type="success" plain
+                            @click="get_settingType(scope.row)">
+                            修改分销佣金
+                        </el-button>
+                        <el-button v-if="isAdmin == 2" size="mini" type="success" plain
+                            @click="settingsFirst(scope.row)">
+                            修改分销佣金
+                        </el-button>
+                        <el-button v-if="isAdmin == 3" size="mini" type="success" plain
+                            @click="settingsFirst(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>
+    </div>
+</template>
+<script>
+import { chargeList } from "@/api/distribution";
+const defaultListQuery = {
+    pageNum: 1,
+    pageSize: 10,
+    adminUserId: null,
+    stationId: null,
+    stationName: null,
+    stationStatus: null,
+};
+export default {
+    name: "setCommission",
+    data() {
+        return {
+            noSetCount: null,
+            haveSetCount: null,
+            isAdmin: null,
+            listQuery: Object.assign({}, defaultListQuery),
+            list: null,
+            listLoading: false,
+            total: null,
+            options: [{
+                value: 0,
+                label: '未知'
+            }, {
+                value: 1,
+                label: '建设中'
+            },{
+                value: 5,
+                label: '关闭下线'
+            },{
+                value: 6,
+                label: '维护中'
+            },{
+                value: 50,
+                label: '正常使用'
+            }],
+        };
+    },
+    created() {
+        this.isAdmin = localStorage.getItem("isAdmin");
+        this.listQuery.adminUserId = this.$route.query.adminUserId;
+        this.getList();
+    },
+    filters: {
+        stationStatusFilter(value) {
+            // 0未知,1建设中,5关闭下线,6维护中,50正常使用
+            switch (value) {
+                case 0:
+                    return "未知";
+                case 1:
+                    return "建设中";
+                case 5:
+                    return "关闭下线";
+                case 6:
+                    return "维护中";
+                case 50:
+                    return "正常使用";
+                default:
+                    return "未知";
+            }
+        }
+    },
+    methods: {
+        get_settingType(row) {
+            this.$router.push({
+                name: "settingsPrice",
+                query: {
+                    adminUserId: this.listQuery.adminUserId,
+                    stationId: row.id,
+                    name: row.name,
+                }
+            })
+        },
+        settingsFirst(row) {
+            this.$router.push({
+                name: "firstSetPrice",
+                query: {
+                    adminUserId: this.listQuery.adminUserId,
+                    stationId: row.id,
+                    name: row.name,
+                }
+            })
+        },
+
+        handleResetSearch() {
+            this.listQuery.stationStatus= null
+            this.listQuery.stationId = null
+            this.listQuery.stationName = null
+        },
+        handleSearchList() {
+            this.listQuery.userId = null
+            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;
+            chargeList(this.listQuery).then((response) => {
+                this.listLoading = false;
+                this.list = response.data.page.records;
+                this.total = response.data.page.total;
+                this.noSetCount = response.data.noSetCount;
+                this.haveSetCount = response.data.haveSetCount;
+            });
+        },
+    },
+};
+</script>
+<style scoped>
+</style>

+ 182 - 0
src/views/distribution/peopleManage/settingsPrice.vue

@@ -0,0 +1,182 @@
+<!--
+ * @Descripttion: 设置代理价
+ * @version: 1.0
+ * @Author: zzx
+ * @Date: 2024-11-27 16:08:16
+ * @LastEditors: zzx tigerzouzx@foxmail.com
+ * @LastEditTime: 2024-12-02 18:00
+-->
+<template>
+    <div class="app-container">
+        <el-card class="operate-container" shadow="hover">
+            <div style="
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+        ">
+                <div style="display: flex; align-items: center">
+                    <div>
+                        <i class="el-icon-tickets"></i>
+                        <span>数据列表</span>
+                    </div>
+                    <div style="margin-left: 20px">
+                        <el-descriptions class="margin-top" :column="3" size="medium" border>
+                            <el-descriptions-item label="电站">{{ name }}</el-descriptions-item>
+                        </el-descriptions>
+                    </div>
+                </div>
+                <div>
+                    <back-button></back-button>
+                </div>
+            </div>
+        </el-card>
+        <div class="table-container">
+            <el-table ref="adminTable" :data="dialogList" style="width: 100%" v-loading="dialogListLoading" border>
+                <el-table-column label="时间段" align="center" prop="time"></el-table-column>
+                <el-table-column label="电费(元/度)" align="center" prop="electrovalence"></el-table-column>
+                <el-table-column label="结算服务费(元)" align="center" prop="servicePrice"></el-table-column>
+                <el-table-column label="结算费合计(元)" align="center" prop="eprice"></el-table-column>
+                <el-table-column label="运营服务费(元)" align="center" prop="addServicePrice"></el-table-column>
+                <el-table-column label="销售合计价(元)" align="center" prop="platformPrice"></el-table-column>
+                <el-table-column label="一级代理价(元)" align="center" prop="">
+                    <template slot-scope="scope">
+                        <el-tooltip class="item" v-if="scope.row.isEdit === false" effect="dark" content="单击编辑" placement="left">
+                            <span class="edit" @click="toggleEdit(scope.row)">{{
+                            scope.row.firstLevelPrice }}</span>
+                        </el-tooltip>
+                        <el-input v-else v-model="editInput" size="small" oninput="value=value.replace(/[^\d.]/g,'')" style="width: 200px;">
+                            <i slot="suffix" size="small" class="el-icon-check" @click="confrimEdit(scope.row)"></i>
+                            <i slot="suffix" size="small" class="el-icon-close" @click="cancelEdit(scope.row)"></i>
+                        </el-input>
+                    </template>
+                </el-table-column>
+            </el-table>
+        </div>
+        <el-divider></el-divider>
+        <el-card class="operate-container" shadow="hover">
+            <div style="text-align: center;">
+                <el-button type="primary" size="small" @click="confirmForbidden">提交</el-button>
+                <el-button type="info" size="small" @click="cancelForbidden">恢复默认</el-button>
+            </div>
+        </el-card>
+    </div>
+</template>
+<script>
+import { priceList, settingsPrice } from "@/api/distribution";
+import Big from 'big.js';
+const defaultListQuery = {
+    adminUserId: null,
+    stationId: null,
+};
+export default {
+    name: "settingsPrice",
+    data() {
+        return {
+            isDisabled: true,
+            name: null,
+            listQuery: Object.assign({}, defaultListQuery),
+            forbiddenForm: {},
+            dialogList: null,
+            dialogListLoading: false,
+            total: null,
+            editInput: null,
+            currentEditingRow: null, //用于记录当前正在编辑的行
+            confirmLoading: false
+        };
+    },
+    watch: {},
+    created() {
+        this.name = this.$route.query.name;
+        this.listQuery.adminUserId = this.$route.query.adminUserId;
+        this.listQuery.stationId = this.$route.query.stationId;
+        this.getList();
+    },
+    methods: {
+        toggleEdit(row) {
+            if (this.currentEditingRow) {
+                this.currentEditingRow.isEdit = false;
+            }
+            row.isEdit = !row.isEdit;
+            this.editInput = row.firstLevelPrice;
+            if (row.isEdit) {
+                this.currentEditingRow = row;
+                
+            } else {
+                this.currentEditingRow = null;
+            }
+        },
+        confrimEdit(row) {
+            if (this.editInput >= row.platformPrice) {
+                return this.$message.error('价格必须小于平台价格');
+            }
+            if(this.editInput<=row.platformPrice-row.addServicePrice){
+              return this.$message.error('一级代理价不合理,不在底价和销售价区间');
+            }
+            if (this.editInput <= 0) {
+                return this.$message.error('价格不能小于0');
+            }
+            row.firstLevelPrice = this.editInput;
+            row.isEdit = false
+            //置空当前编辑行记录
+            this.currentEditingRow = null;
+        },
+        cancelEdit(row) {
+            this.editInput =0;
+            row.isEdit = false
+            //置空当前编辑行记录
+            this.currentEditingRow = null;
+        },
+        confirmForbidden() {
+            const newArray = this.dialogList.map(item => ({
+                adminUserId: this.listQuery.adminUserId,
+                firstLevelPrice: item.firstLevelPrice,
+                id: item.id,
+                platformPrice: item.platformPrice,
+                secondLevelPrice: item.secondLevelPrice,
+                servicePrice: new Big(item.platformPrice).minus(new Big(item.firstLevelPrice)).toNumber(),
+                stationId: this.listQuery.stationId,
+                time: item.time
+            }))
+            this.confirmLoading = true;
+            settingsPrice(newArray).then((res) => {
+                this.confirmLoading = false;
+                if (res.code == 200) {
+                    this.$message.success('设置成功');
+                    this.getList();
+                }
+            })
+        },
+        cancelForbidden() {
+            this.getList();
+        },
+        getList() {
+            this.dialogListLoading = true;
+            priceList(this.listQuery).then((response) => {
+                this.dialogListLoading = false;
+                this.dialogList = response.data;
+                this.dialogList.map(item => {
+                    this.$set(item, 'isEdit', false); //初始化为false
+                })
+            });
+        },
+    },
+};
+</script>
+<style scoped>
+.edit {
+    color: #409EFF;
+    cursor: pointer;
+}
+
+.el-icon-check {
+    font-size: 22px;
+    font-weight: 1000;
+    color: rgb(103, 194, 58);
+}
+
+.el-icon-close {
+    font-size: 22px;
+    font-weight: 1000;
+    color: rgba(240, 10, 10, 0.6);
+}
+</style>

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

@@ -21,11 +21,19 @@
             </div>
             <div style="margin-top: 15px">
                 <el-form :inline="true" :model="listQuery" size="mini" label-width="140px">
+<<<<<<< HEAD
+                    <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-form-item label="分销员姓名:">
                         <el-input v-model="listQuery.userName" class="input-width" placeholder="请输入用户名称"
                             clearable></el-input>
                     </el-form-item>
                     <el-form-item label="分销员手机号:">
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                         <el-input v-model="listQuery.phone" class="input-width" placeholder="请输入手机号码"
                             clearable></el-input>
                     </el-form-item>
@@ -41,19 +49,31 @@
                             clearable></el-input>
                     </el-form-item>
                     <el-form-item label="完成时间:">
+<<<<<<< HEAD
+                        <el-date-picker v-model="completeDate" size="mini" value-format="yyyy-MM-dd HH:mm:ss"
+=======
                         <el-date-picker v-model="completeDate" size="mini" value-format="yyyy-MM-dd"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                             class="item-width-350 ml10" type="datetimerange" range-separator="至"
                             start-placeholder="开始日期" end-placeholder="结束日期">
                         </el-date-picker>
                     </el-form-item>
                     <el-form-item label="提现时间:">
+<<<<<<< HEAD
+                        <el-date-picker v-model="withdrawDate" size="mini" value-format="yyyy-MM-dd HH:mm:ss"
+=======
                         <el-date-picker v-model="withdrawDate" size="mini" value-format="yyyy-MM-dd"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                             class="item-width-350 ml10" type="datetimerange" range-separator="至"
                             start-placeholder="开始日期" end-placeholder="结束日期">
                         </el-date-picker>
                     </el-form-item>
                     <el-form-item label="结算时间:">
+<<<<<<< HEAD
+                        <el-date-picker v-model="colseDate" size="mini" value-format="yyyy-MM-dd HH:mm:ss"
+=======
                         <el-date-picker v-model="colseDate" size="mini" value-format="yyyy-MM-dd"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                             class="item-width-350 ml10" type="datetimerange" range-separator="至"
                             start-placeholder="开始日期" end-placeholder="结束日期">
                         </el-date-picker>
@@ -68,9 +88,15 @@
                     <span>数据列表</span>
                 </div>
                 <div>
+<<<<<<< HEAD
+                    <el-button class="ml10" type="info" size="small" :disabled="exportDisabled" :loading="downloadLoading" icon="el-icon-printer"
+                        @click="exportAllExcel">导出</el-button>
+                    <el-button class="ml10" v-if="isAdmin==0" type="warning" :disabled="disabled" size="small" :loading="updateLoading" icon="el-icon-success"
+=======
                     <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="updateLoading" icon="el-icon-success"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                         @click="financeStatus">财务已结算</el-button>
                 </div>
             </div>
@@ -79,7 +105,11 @@
             <el-table ref="adminTable" :data="list" style="width: 100%" v-loading="listLoading" border>
                 <el-table-column label="充电订单编号" width="100" align="center" prop="chargeOrderNo"></el-table-column>
                 <el-table-column label="订单金额/元" align="center" prop="realCost"></el-table-column>
+<<<<<<< HEAD
+                <!-- <el-table-column label="服务费金额/元" align="center" prop="realServiceCost"></el-table-column> -->
+=======
                 <el-table-column label="服务费金额/元" align="center" prop="realServiceCost"></el-table-column>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                 <el-table-column label="订单完成时间" align="center" prop="endTime"></el-table-column>
                 <el-table-column label="一级分销员" align="center" prop="firstLevelUserName"></el-table-column>
                 <el-table-column label="一级分销员手机号" align="center" prop="firstLevelPhone"></el-table-column>
@@ -101,8 +131,14 @@
                 </el-table-column>
                 <el-table-column label="结算状态" align="center" prop="updateBy">
                     <template slot-scope="scope">
+<<<<<<< HEAD
+                        <el-tag type="info" v-if="scope.row.status == 0">未提现</el-tag>
+                        <el-tag type="wanning" v-if="scope.row.status == 1">待结算</el-tag>
+                        <el-tag type="success" v-if="scope.row.status == 2">已结算</el-tag>
+=======
                         <el-tag :type="scope.row.status == 2 ? 'success' : 'danger'">{{ scope.row.status == 2 ? '已结算' :
                             '待结算' }}</el-tag>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                     </template>
                 </el-table-column>
                 <el-table-column label="提现时间" align="center">
@@ -146,18 +182,47 @@ const defaultListQuery = {
     withdrawEndTime: "",
     status: "",
     chargeOrderNo: "",
+<<<<<<< HEAD
+    adminUserId: null,
+    recordId: null
+=======
     adminUserId: "",
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 };
 export default {
     name: "records",
     data() {
         return {
+<<<<<<< HEAD
+            disabled: false,
+            exportDisabled: false,
+            isAdmin: null,
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             completeDate: "",
             withdrawDate: "",
             colseDate: "",
             downloadLoading: false,
             updateLoading: false,
             listQuery: Object.assign({}, defaultListQuery),
+<<<<<<< HEAD
+            list:[],
+            financeList: [],
+            total: null,
+            listLoading: false,
+            forbiddenDialogVisible: false,
+            options: [{
+                value: 0,
+                label: "未提现",
+            },{
+                value: 1,
+                label: "待结算",
+            },
+            {
+                value: 2,
+                label: "已结算",
+            },
+=======
             list: null,
             total: null,
             listLoading: false,
@@ -175,6 +240,7 @@ export default {
                     value: 2,
                     label: "已结算",
                 },
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             ],
         };
     },
@@ -190,6 +256,18 @@ export default {
         },
         withdrawDate(val) {
             if (val) {
+<<<<<<< HEAD
+                this.listQuery.withdrawStartTime = Date.parse(val[0]);
+                this.listQuery.withdrawEndTime = Date.parse(val[1]);
+            } else {
+                this.listQuery.withdrawStartTime = "";
+                this.listQuery.withdrawEndTime = "";
+            }
+        },
+        colseDate(val) {
+            if (val) {
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                 this.listQuery.settleStartTime = Date.parse(val[0]);
                 this.listQuery.settleEndTime = Date.parse(val[1]);
             } else {
@@ -197,6 +275,15 @@ export default {
                 this.listQuery.settleEndTime = "";
             }
         },
+<<<<<<< HEAD
+    },
+    created() {
+        this.isAdmin = localStorage.getItem("isAdmin");
+        this.getList();
+        if (this.$route) {
+            this.listQuery.adminUserId = this.$route.query.adminUserId
+            this.listQuery.recordId = this.$route.query.recordId
+=======
         colseDate(val) {
             if (val) {
                 this.listQuery.withdrawStartTime = Date.parse(val[0]);
@@ -211,6 +298,7 @@ export default {
         this.getList();
         if(this.$route){
             this.listQuery.adminUserId = this.$route.query.adminUserId
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         }
     },
     filters: {
@@ -225,6 +313,40 @@ export default {
     methods: {
         // 更新结算状态
         financeStatus() {
+<<<<<<< HEAD
+            let query = JSON.parse(JSON.stringify(this.listQuery))
+            query.pageSize = this.total
+            query.page = 0
+            query.status = 1
+            recordsList(query).then((response) => {
+                this.financeList.push(...response.data.list);
+                // settleRecordId去重
+                let updateList = Object.values(this.financeList.reduce((acc, r) => {
+                    acc[r.settleRecordId] = r
+                    return acc
+                }, {}))
+                this.financeList = updateList.map(item => item.settleRecordId)
+                if(this.financeList.length <= 0) return this.$message.error('暂无待结算数据')
+                this.updateLoading = true
+                updateStatus(this.financeList).then((res) => {
+                    this.updateLoading = false
+                    if (res.code === 200) {
+                        this.$message({
+                            message: "更新成功",
+                            type: "success",
+                        });
+                        this.getList();
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error",
+                        })
+                    }
+                })
+            });
+        },
+
+=======
             this.updateLoading = true
             updateStatus().then((res) => {
             this.updateLoading = false
@@ -242,13 +364,17 @@ export default {
                 }
             })
         },
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         // 导出
         exportAllExcel() {
             this.downloadLoading = true
             const allData = [];
             let query = JSON.parse(JSON.stringify(this.listQuery))
             query.pageSize = this.total
+<<<<<<< HEAD
+=======
             query.page = 0
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             recordsList(query).then(res => {
                 this.downloadLoading = false
                 if (res.code == 200) {
@@ -261,10 +387,25 @@ export default {
         // 导出数据处理
         exportExcel(r) {
             const data = r.map((item) => {
+<<<<<<< HEAD
+                let status = "";
+                if(item.status==0){
+                    status='未提现'
+                }else if(item.status==1){
+                    status='待结算'
+                }else if(item.status==2){
+                    status='已结算'
+                }
+                return {
+                    "充电订单编号": item.chargeOrderNo,
+                    "订单金额/元": item.realCost,
+                    // "服务费金额/元": item.realServiceCost,
+=======
                 return {
                     "充电订单编号": item.chargeOrderNo,
                     "订单金额/元": item.realCost,
                     "服务费金额/元": item.realServiceCost,
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                     "订单完成时间": item.endTime,
                     "一级分销员": item.firstLevelUserName,
                     "一级分销员手机号": item.firstLevelPhone,
@@ -272,10 +413,16 @@ export default {
                     "二级分销员": item.secondLevelUserName || '--',
                     "二级分销员手机号": item.secondLevelPhone || '--',
                     "二级分销员佣金": item.secondLevelCommission || '--',
+<<<<<<< HEAD
+                    "结算状态":status,
+                    "提现时间": item.withdrawTime || '--',
+                    "结算时间": item.settleTime || '--',
+=======
                     "结算状态": item.status == 1 ? '已结算' : '未结算',
                     "提现时间": item.withdrawTime || '--',
                     "结算时间": item.settleTime || '--',
 
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                 }
             })
             const worksheet = XLSX.utils.json_to_sheet(data);
@@ -286,6 +433,12 @@ export default {
         },
 
         handleResetSearch() {
+<<<<<<< HEAD
+            this.completeDate=''
+            this.withdrawDate=''
+            this.colseDate=''
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             this.listQuery = Object.assign({}, defaultListQuery);
         },
         handleSearchList() {
@@ -307,6 +460,16 @@ export default {
                 this.listLoading = false;
                 this.list = response.data.list;
                 this.total = response.data.total;
+<<<<<<< HEAD
+                if (this.list.length <= 0) {
+                    this.disabled=true
+                    this.exportDisabled = true;
+                }else{
+                    this.disabled=false
+                    this.exportDisabled = false;
+                }
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             });
         },
     },

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

@@ -39,12 +39,43 @@
                     <span>数据列表</span>
                     <span class="tips">提现说明:限每月10号-15号提交提现申请,且只能提交一次</span>
                 </div>
+<<<<<<< HEAD
+                <el-button class="ml10" type="info" size="small" :loading="downloadLoading" :disabled="exportDisabled" icon="el-icon-printer"
+=======
                 <el-button class="ml10" type="info" size="small" :loading="downloadLoading" icon="el-icon-printer"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                     @click="exportAllExcel">导出</el-button>
             </div>
         </el-card>
         <div class="table-container">
             <el-table ref="adminTable" :data="list" style="width: 100%" v-loading="listLoading" border>
+<<<<<<< HEAD
+                <el-table-column label="上级分销员手机号" align="center" prop="superiorsPhone">
+                    <template slot-scope="scope">
+                        {{ scope.row.superiorsPhone || '无上级' }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="分销员层级" align="center" prop="">
+                    <template slot-scope="scope">
+                        <el-tag v-if="scope.row.type==2" type="success">一级</el-tag>
+                        <el-tag v-if="scope.row.type==3" type="warning">二级</el-tag>
+                    </template>
+                </el-table-column>
+                <el-table-column label="分销员姓名" align="center" prop="">
+                    <template slot-scope="scope">
+                        <span>{{ scope.row.userName || '--' }}</span>
+                    </template>
+                </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="userConsumeAllMoney"></el-table-column>
+                <el-table-column label="未提现佣金/元" align="center" prop="unWithdrawMoney"></el-table-column>
+                <el-table-column label="待结算佣金/元" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.unSettleAccountMoney || '0' }}
+=======
                 <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>
@@ -54,17 +85,27 @@
                     <template slot-scope="scope">
                         <span class="pushRecords" @click="pushRecords(scope.row)">{{ scope.row.unSettleAccountMoney ||
                             '0' }}</span>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                     </template>
                 </el-table-column>
                 <el-table-column label="已结算佣金/元" align="center">
                     <template slot-scope="scope">
+<<<<<<< HEAD
+                        {{ scope.row.settleAccountMoney || '0' }}
+=======
                         <span class="pushRecords" @click="pushRecords(scope.row)">{{ scope.row.settleAccountMoney ||
                             '0' }}</span>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                     </template>
                 </el-table-column>
                 <el-table-column label="操作" width="180" align="center">
                     <template slot-scope="scope">
+<<<<<<< HEAD
+                        <el-button v-if="isAdmin != 0" size="mini" type="warning" plain
+                            @click="withdrawApplyfor(scope.row)">
+=======
                         <el-button v-if="isAdmin!=0" size="mini" type="warning" plain @click="withdrawApplyfor(scope.row)">
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                             提现申请
                         </el-button>
                     </template>
@@ -81,6 +122,17 @@
             <el-descriptions border>
                 <el-descriptions-item label="分销员姓名">{{ dialogQuery.userName }}</el-descriptions-item>
                 <el-descriptions-item label="分销员手机号">{{ dialogQuery.phone }}</el-descriptions-item>
+<<<<<<< HEAD
+                <el-descriptions-item label="本次提现订单数/笔">{{ dialogQuery.orderCount || '--' }}</el-descriptions-item>
+                <el-descriptions-item label="本次提现金额/元">{{ dialogQuery.unWithdrawMoney }}</el-descriptions-item>
+            </el-descriptions>
+            <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" :loading="requestLoading" size="small">确定</el-button>
+=======
                 <el-descriptions-item label="本次提现订单数/笔">{{ dialogQuery.orderCount||'--' }}</el-descriptions-item>
                 <el-descriptions-item label="本次提现金额/元">{{ dialogQuery.unSettleAccountMoney }}</el-descriptions-item>
             </el-descriptions>
@@ -89,6 +141,7 @@
                 <el-button @click="forbiddenDialogVisible = false" size="small">取 消</el-button>
                 <el-button type="primary" @click="confirmRequest" size="small">确
                     定</el-button>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             </span>
         </el-dialog>
     </div>
@@ -110,8 +163,15 @@ export default {
     name: "statistics",
     data() {
         return {
+<<<<<<< HEAD
+            exportDisabled: false,
+            isAdmin: null,
+            downloadLoading: false,
+            requestLoading: false,
+=======
             isAdmin:null,
             downloadLoading: false,
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             date: "",
             listQuery: Object.assign({}, defaultListQuery),
             list: null,
@@ -133,7 +193,11 @@ export default {
         },
     },
     created() {
+<<<<<<< HEAD
+        this.isAdmin = localStorage.getItem("isAdmin");
+=======
         this.isAdmin= localStorage.getItem("isAdmin");
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         this.getList();
     },
     filters: {
@@ -147,6 +211,16 @@ export default {
     },
     methods: {
         // 跳转至记录列表
+<<<<<<< HEAD
+        // pushRecords(row) {
+        //     this.$router.push({
+        //         path: "/distribution/records",
+        //         query: {
+        //             adminUserId: row.adminUserId,
+        //         },
+        //     });
+        // },
+=======
         pushRecords(row) {
             this.$router.push({
                 path: "/distribution/records",
@@ -155,6 +229,7 @@ export default {
                 },
             });
         },
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         // 导出
         exportAllExcel() {
             this.downloadLoading = true
@@ -175,11 +250,20 @@ export default {
         exportExcel(r) {
             const data = r.map((item) => {
                 return {
+<<<<<<< HEAD
+                    "上级分销员手机号": item.superiorsPhone || '无上级',
+                    "分销员层级": item.type == 2 ? '一级' : '二级',
+                    "分销员姓名": item.userName|| '--',
+                    "分销员手机号": item.phone,
+                    "用户消费金额/元": item.userConsumeAllMoney,
+                    "未提现佣金/元": item.unWithdrawMoney,
+=======
                     "分销员姓名": item.userName,
                     "分销员手机号": item.phone,
                     "用户购券金额/元": item.userTopAllMoney,
                     "待清算佣金/元": item.unconsumedMoney,
                     "用户退款金额/元": item.userRefundAllMoney,
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                     "待结算佣金/元": item.unSettleAccountMoney,
                     "已结算佣金/元": item.settleAccountMoney,
                 }
@@ -199,6 +283,14 @@ export default {
 
         // 确认
         confirmRequest() {
+<<<<<<< HEAD
+            this.requestLoading = true;
+            setTimeout(() => {
+                this.requestLoading = false;
+                
+            },1000)
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             withdrawRequest({ adminUserId: this.dialogQuery.adminUserId }).then(res => {
                 if (res.code == 200) {
                     this.$message({
@@ -233,6 +325,14 @@ export default {
                 this.listLoading = false;
                 this.list = response.data.list;
                 this.total = response.data.total;
+<<<<<<< HEAD
+                if(this.list.length <= 0){
+                    this.exportDisabled = true;
+                }else{
+                    this.exportDisabled = false;
+                }
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             });
         },
     },

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

@@ -4,7 +4,11 @@
  * @Author: zzx
  * @Date: 2024-11-09 16:08:16
  * @LastEditors: zzx tigerzouzx@foxmail.com
+<<<<<<< HEAD
+ * @LastEditTime: 2024-11-22 18:00
+=======
  * @LastEditTime: 2024-11-20 18:00
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 -->
 <template>
     <div class="app-container">
@@ -21,7 +25,11 @@
             </div>
             <div style="margin-top: 15px">
                 <el-form :inline="true" :model="listQuery" size="small" label-width="140px">
+<<<<<<< HEAD
+                    <el-form-item label="用户昵称:">
+=======
                     <el-form-item label="用户姓名:">
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                         <el-input v-model="listQuery.nickName" class="input-width" placeholder="请输入用户名称"
                             clearable></el-input>
                     </el-form-item>
@@ -30,7 +38,11 @@
                             clearable></el-input>
                     </el-form-item>
                     <el-form-item label="注册时间:">
+<<<<<<< HEAD
+                        <el-date-picker v-model="date" size="small" value-format="yyyy-MM-dd HH:mm:ss"
+=======
                         <el-date-picker v-model="date" size="small" value-format="yyyy-MM-dd"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                             class="item-width-350 ml10" type="datetimerange" range-separator="至"
                             start-placeholder="开始日期" end-placeholder="结束日期">
                         </el-date-picker>
@@ -188,11 +200,14 @@ export default {
                             type: "success",
                         });
                         this.getList()
+<<<<<<< HEAD
+=======
                     } else {
                         this.$message({
                             message: response.msg,
                             type: "error",
                         });
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
                     }
                 });
             });
@@ -206,6 +221,10 @@ export default {
             this.getList();
         },
         handleResetSearch() {
+<<<<<<< HEAD
+            this.date=''
+=======
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             this.listQuery = Object.assign({}, defaultListQuery);
         },
         handleSearchList() {
@@ -259,6 +278,9 @@ export default {
     },
 };
 </script>
+<<<<<<< HEAD
+<style scoped></style>
+=======
 <style scoped>
 .tips{
     font-size: 14px;
@@ -266,3 +288,4 @@ export default {
     margin-left: 20px;
 }
 </style>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 23 - 0
src/views/home/index.vue

@@ -1,5 +1,10 @@
 <template>
   <div class="app-container">
+<<<<<<< HEAD
+    <el-card class="filter-container" shadow="hover">
+      <span>欢迎使用中数电动,后续将在首页逐步添加入口、数据看板等功能</span>
+    </el-card>
+=======
     <div class="total-layout">
       <el-row :gutter="20">
         <el-col :span="6">
@@ -206,10 +211,13 @@
         </el-col>
       </el-row>
     </div>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
   </div>
 </template>
 
 <script>
+<<<<<<< HEAD
+=======
   import {str2Date} from '@/utils/date';
   import img_home_order from '@/assets/images/home_order.png';
   import img_home_today_amount from '@/assets/images/home_today_amount.png';
@@ -234,10 +242,20 @@
       {date: '2018-11-15', orderCount: 40, orderAmount: 4293}
     ]
   };
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
   export default {
     name: 'home',
     data() {
       return {
+<<<<<<< HEAD
+
+      }
+    },
+    created(){
+    },
+    methods:{
+
+=======
         pickerOptions: {
           shortcuts: [{
             text: '最近一周',
@@ -304,10 +322,14 @@
           this.loading = false
         }, 1000)
       }
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     }
   }
 </script>
 
+<<<<<<< HEAD
+<style scoped></style>
+=======
 <style scoped>
   .app-container {
     margin-top: 40px;
@@ -405,3 +427,4 @@
     font-size: 18px
   }
 </style>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 8 - 0
src/views/login/index.vue

@@ -88,7 +88,11 @@
       this.loginForm.username = getCookie("username");
       this.loginForm.password = getCookie("password");
       if(this.loginForm.username === undefined||this.loginForm.username==null||this.loginForm.username===''){
+<<<<<<< HEAD
+        this.loginForm.username = '';
+=======
         this.loginForm.username = 'admin';
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
       }
       if(this.loginForm.password === undefined||this.loginForm.password==null){
         this.loginForm.password = '';
@@ -110,7 +114,11 @@
               this.loading = false;
               setCookie("username",this.loginForm.username,15);
               setCookie("password",this.loginForm.password,15);
+<<<<<<< HEAD
+              this.$router.push({path: '/'}).catch(() =>{})
+=======
               this.$router.push({path: '/distribution/userList'})
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             }).catch(() => {
               this.loading = false
             })

+ 282 - 0
src/views/ums/admin/index.vue

@@ -4,6 +4,12 @@
       <div>
         <i class="el-icon-search"></i>
         <span>筛选搜索</span>
+<<<<<<< HEAD
+        <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
           style="float:right"
           type="primary"
@@ -15,6 +21,7 @@
           style="float:right;margin-right: 15px"
           @click="handleResetSearch()"
           size="small">
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
           重置
         </el-button>
       </div>
@@ -32,6 +39,30 @@
       <el-button size="mini" class="btn-add" @click="handleAdd()" style="margin-left: 20px">添加</el-button>
     </el-card>
     <div class="table-container">
+<<<<<<< HEAD
+      <el-table ref="adminTable" :data="list" style="width: 100%;" v-loading="listLoading" border>
+        <el-table-column label="编号" width="100" align="center">
+          <template slot-scope="scope">{{ scope.row.id }}</template>
+        </el-table-column>
+        <el-table-column label="帐号" align="center">
+          <template slot-scope="scope">{{ scope.row.username }}</template>
+        </el-table-column>
+        <el-table-column label="姓名" 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.email }}</template>
+        </el-table-column>
+        <el-table-column label="添加时间" width="160" align="center">
+          <template slot-scope="scope">{{ scope.row.createTime | formatDateTime }}</template>
+        </el-table-column>
+        <el-table-column label="最后登录" width="160" align="center">
+          <template slot-scope="scope">{{ scope.row.loginTime | formatDateTime }}</template>
+        </el-table-column>
+        <el-table-column label="是否启用" width="140" align="center">
+          <template slot-scope="scope">
+            <el-switch @change="handleStatusChange(scope.$index, scope.row)" :active-value="1" :inactive-value="0"
+=======
       <el-table ref="adminTable"
                 :data="list"
                 style="width: 100%;"
@@ -60,12 +91,21 @@
               @change="handleStatusChange(scope.$index, scope.row)"
               :active-value="1"
               :inactive-value="0"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
               v-model="scope.row.status">
             </el-switch>
           </template>
         </el-table-column>
         <el-table-column label="操作" width="180" align="center">
           <template slot-scope="scope">
+<<<<<<< HEAD
+            <el-button size="mini" type="text" @click="handleSelectRole(scope.$index, scope.row)">分配角色
+            </el-button>
+            <el-button size="mini" type="text" @click="handleUpdate(scope.$index, scope.row)">
+              编辑
+            </el-button>
+            <el-button size="mini" type="text" @click="handleDelete(scope.$index, scope.row)">删除
+=======
             <el-button size="mini"
                        type="text"
                        @click="handleSelectRole(scope.$index, scope.row)">分配角色
@@ -78,12 +118,36 @@
             <el-button size="mini"
                        type="text"
                        @click="handleDelete(scope.$index, scope.row)">删除
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             </el-button>
           </template>
         </el-table-column>
       </el-table>
     </div>
     <div class="pagination-container">
+<<<<<<< HEAD
+      <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="isEdit ? '编辑用户' : '添加用户'" :visible.sync="dialogVisible" width="40%">
+      <el-form :model="admin" ref="adminForm" :rules="rules" label-width="150px" size="small">
+        <el-form-item label="帐号:" prop="username">
+          <el-input v-model="admin.username" style="width: 250px"></el-input>
+        </el-form-item>
+        <el-form-item label="姓名:" prop="nickName">
+          <el-input v-model="admin.nickName" style="width: 250px"></el-input>
+        </el-form-item>
+        <el-form-item label="邮箱:" prop="email">
+          <el-input v-model="admin.email" style="width: 250px"></el-input>
+        </el-form-item>
+        <el-form-item label="密码:" prop="password">
+          <el-input v-model="admin.password" type="password" style="width: 250px"></el-input>
+        </el-form-item>
+        <el-form-item label="备注:">
+          <el-input v-model="admin.note" type="textarea" :rows="5" style="width: 250px"></el-input>
+=======
       <el-pagination
         background
         @size-change="handleSizeChange"
@@ -119,6 +183,7 @@
                     type="textarea"
                     :rows="5"
                     style="width: 250px"></el-input>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         </el-form-item>
         <el-form-item label="是否启用:">
           <el-radio-group v-model="admin.status">
@@ -132,6 +197,11 @@
         <el-button type="primary" @click="handleDialogConfirm()" size="small">确 定</el-button>
       </span>
     </el-dialog>
+<<<<<<< HEAD
+    <el-dialog title="分配角色" :visible.sync="allocDialogVisible" width="30%">
+      <el-select v-model="allocRoleIds" placeholder="请选择" size="small" style="width: 80%">
+        <el-option v-for="item in allRoleList" :key="item.id" :label="item.name" :value="item.id" :disabled="item.isDistribution==0">
+=======
     <el-dialog
       title="分配角色"
       :visible.sync="allocDialogVisible"
@@ -142,6 +212,7 @@
           :key="item.id"
           :label="item.name"
           :value="item.id">
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         </el-option>
       </el-select>
       <span slot="footer" class="dialog-footer">
@@ -152,6 +223,175 @@
   </div>
 </template>
 <script>
+<<<<<<< HEAD
+import { fetchList, createAdmin, updateAdmin, updateStatus, deleteAdmin, getRoleByAdmin, allocRole } from '@/api/login';
+import { fetchAllRoleList } from '@/api/role';
+import { formatDate } from '@/utils/date';
+
+const defaultListQuery = {
+  pageNum: 1,
+  pageSize: 10,
+  keyword: null
+};
+const defaultAdmin = {
+  id: null,
+  username: null,
+  password: null,
+  nickName: null,
+  email: null,
+  note: null,
+  status: 1
+};
+export default {
+  name: 'adminList',
+  data() {
+    return {
+      listQuery: Object.assign({}, defaultListQuery),
+      list: null,
+      total: null,
+      listLoading: false,
+      dialogVisible: false,
+      admin: Object.assign({}, defaultAdmin),
+      isEdit: false,
+      allocDialogVisible: false,
+      allocRoleIds: [],
+      allRoleList: [],
+      allocAdminId: null,
+      rules: {
+        username: [{ required: true, message: '请输入账号', trigger: 'blur' }],
+        nickName: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
+        email: [{ required: true, message: '请输入邮箱', trigger: 'blur' },
+        { required: true, type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],
+        password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
+      }
+    }
+  },
+  created() {
+    this.getList();
+    this.getAllRoleList();
+  },
+  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();
+    },
+    handleAdd() {
+      this.dialogVisible = true;
+      this.isEdit = false;
+      this.admin = Object.assign({}, defaultAdmin);
+    },
+    handleStatusChange(index, row) {
+      this.$confirm('是否要修改该状态?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        updateStatus(row.id, { status: row.status }).then(response => {
+          if (response.code === 200) {
+            this.$message({
+            type: 'success',
+            message: '修改成功!'
+          });
+          }
+        });
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '取消修改'
+        });
+        this.getList();
+      });
+    },
+    handleDelete(index, row) {
+      this.$confirm('是否要删除该用户?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        deleteAdmin(row.id).then(response => {
+          if (response.code === 200) {
+            this.$message({
+            type: 'success',
+            message: '删除成功!'
+          });
+          this.getList();
+          }
+        });
+      });
+    },
+    handleUpdate(index, row) {
+      this.dialogVisible = true;
+      this.isEdit = true;
+      this.admin = Object.assign({}, row);
+    },
+    handleDialogConfirm() {
+      this.$refs['adminForm'].validate(valid => {
+        if (valid) {
+          this.$confirm('是否要确认?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+          }).then(() => {
+            if (this.isEdit) {
+              updateAdmin(this.admin.id, this.admin).then(response => {
+                if (response.code === 200) {
+                  this.$message({
+                  message: '修改成功!',
+                  type: 'success'
+                });
+                this.dialogVisible = false;
+                this.getList();
+                }
+              })
+            } else {
+              createAdmin(this.admin).then(response => {
+                if (response.code === 200) {
+                  this.$message({
+                  message: '添加成功!',
+                  type: 'success'
+                });
+                this.dialogVisible = false;
+                this.getList();
+                }
+              })
+            }
+          })
+        }
+      })
+    },
+    handleAllocDialogConfirm() {
+      this.$confirm('是否要确认?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        let params = new URLSearchParams();
+        params.append("adminId", this.allocAdminId);
+        params.append("roleIds", this.allocRoleIds);
+        allocRole(params).then(response => {
+          if (response.code == 200) {
+=======
   import {fetchList,createAdmin,updateAdmin,updateStatus,deleteAdmin,getRoleByAdmin,allocRole} from '@/api/login';
   import {fetchAllRoleList} from '@/api/role';
   import {formatDate} from '@/utils/date';
@@ -299,10 +539,51 @@
           params.append("adminId", this.allocAdminId);
           params.append("roleIds", this.allocRoleIds);
           allocRole(params).then(response => {
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             this.$message({
               message: '分配成功!',
               type: 'success'
             });
+<<<<<<< HEAD
+          }
+          this.allocDialogVisible = false;
+        })
+      })
+    },
+    handleSelectRole(index, row) {
+      this.allocAdminId = row.id;
+      this.allocDialogVisible = true;
+      this.getRoleListByAdmin(row.id);
+    },
+    getList() {
+      this.listLoading = true;
+      fetchList(this.listQuery).then(response => {
+        this.listLoading = false;
+        this.list = response.data.list;
+        this.total = response.data.total;
+      });
+    },
+    getAllRoleList() {
+      fetchAllRoleList().then(response => {
+        this.allRoleList = response.data;
+      });
+    },
+    getRoleListByAdmin(adminId) {
+      getRoleByAdmin(adminId).then(response => {
+        let allocRoleList = response.data;
+        this.allocRoleIds = [];
+        if (allocRoleList != null && allocRoleList.length > 0) {
+          for (let i = 0; i < allocRoleList.length; i++) {
+            this.allocRoleIds.push(allocRoleList[i].name);
+          }
+        }
+      });
+    }
+  }
+}
+</script>
+<style></style>
+=======
             this.allocDialogVisible = false;
           })
         })
@@ -342,3 +623,4 @@
 <style></style>
 
 
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 19 - 0
src/views/ums/menu/add.vue

@@ -1,3 +1,21 @@
+<<<<<<< HEAD
+<template>
+  <div class="app-container">
+    <el-card class="operate-container" shadow="hover">
+      <back-button></back-button>
+    </el-card>
+    <menu-detail :is-edit="false"></menu-detail>
+  </div>
+</template>
+<script>
+import MenuDetail from "./components/MenuDetail";
+export default {
+  name: "addMenu",
+  components: { MenuDetail },
+};
+</script>
+<style></style>
+=======
 <template> 
   <menu-detail :is-edit='false'></menu-detail>
 </template>
@@ -12,3 +30,4 @@
 </style>
 
 
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 154 - 0
src/views/ums/menu/index.vue

@@ -2,15 +2,34 @@
   <div class="app-container">
     <el-card class="operate-container" shadow="never">
       <i class="el-icon-tickets" style="margin-top: 5px"></i>
+<<<<<<< HEAD
+      <span style="margin-top: 5px;">数据列表</span>
+      <el-button class="btn-add" @click="handleAddMenu()" size="mini">
+=======
       <span style="margin-top: 5px">数据列表</span>
       <el-button
         class="btn-add"
         @click="handleAddMenu()"
         size="mini">
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         添加
       </el-button>
     </el-card>
     <div class="table-container">
+<<<<<<< HEAD
+      <el-table ref="menuTable" style="width: 100%" :data="list" v-loading="listLoading" border>
+        <el-table-column label="编号" width="100" align="center">
+          <template slot-scope="scope">{{ scope.row.id }}</template>
+        </el-table-column>
+        <el-table-column label="菜单名称" align="center">
+          <template slot-scope="scope">{{ scope.row.title }}</template>
+        </el-table-column>
+        <el-table-column label="菜单级数" width="100" align="center">
+          <template slot-scope="scope">{{ scope.row.level | levelFilter }}</template>
+        </el-table-column>
+        <el-table-column label="前端名称" align="center">
+          <template slot-scope="scope">{{ scope.row.name }}</template>
+=======
       <el-table ref="menuTable"
                 style="width: 100%"
                 :data="list"
@@ -26,21 +45,33 @@
         </el-table-column>
         <el-table-column label="前端名称" align="center">
           <template slot-scope="scope">{{scope.row.name}}</template>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         </el-table-column>
         <el-table-column label="前端图标" width="100" align="center">
           <template slot-scope="scope"><svg-icon :icon-class="scope.row.icon"></svg-icon></template>
         </el-table-column>
         <el-table-column label="是否显示" width="100" align="center">
           <template slot-scope="scope">
+<<<<<<< HEAD
+            <el-switch @change="handleHiddenChange(scope.$index, scope.row)" :active-value="0" :inactive-value="1"
+=======
             <el-switch
               @change="handleHiddenChange(scope.$index, scope.row)"
               :active-value="0"
               :inactive-value="1"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
               v-model="scope.row.hidden">
             </el-switch>
           </template>
         </el-table-column>
         <el-table-column label="排序" width="100" align="center">
+<<<<<<< HEAD
+          <template slot-scope="scope">{{ scope.row.sort }}</template>
+        </el-table-column>
+        <el-table-column label="设置" width="120" align="center">
+          <template slot-scope="scope">
+            <el-button size="mini" type="text" :disabled="scope.row.level | disableNextLevel"
+=======
           <template slot-scope="scope">{{scope.row.sort }}</template>
         </el-table-column>
         <el-table-column label="设置" width="120" align="center">
@@ -49,12 +80,18 @@
               size="mini"
               type="text"
               :disabled="scope.row.level | disableNextLevel"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
               @click="handleShowNextLevel(scope.$index, scope.row)">查看下级
             </el-button>
           </template>
         </el-table-column>
         <el-table-column label="操作" width="200" align="center">
           <template slot-scope="scope">
+<<<<<<< HEAD
+            <el-button size="mini" type="text" @click="handleUpdate(scope.$index, scope.row)">编辑
+            </el-button>
+            <el-button size="mini" type="text" @click="handleDelete(scope.$index, scope.row)">删除
+=======
             <el-button
               size="mini"
               type="text"
@@ -64,12 +101,18 @@
               size="mini"
               type="text"
               @click="handleDelete(scope.$index, scope.row)">删除
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
             </el-button>
           </template>
         </el-table-column>
       </el-table>
     </div>
     <div class="pagination-container">
+<<<<<<< HEAD
+      <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+        layout="total, sizes,prev, pager, next,jumper" :page-size="listQuery.pageSize" :page-sizes="[10, 15, 20]"
+        :current-page.sync="listQuery.pageNum" :total="total">
+=======
       <el-pagination
         background
         @size-change="handleSizeChange"
@@ -79,12 +122,122 @@
         :page-sizes="[10,15,20]"
         :current-page.sync="listQuery.pageNum"
         :total="total">
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
       </el-pagination>
     </div>
   </div>
 </template>
 
 <script>
+<<<<<<< HEAD
+import { fetchList, deleteMenu, updateMenu, updateHidden } from '@/api/menu'
+
+export default {
+  name: "menuList",
+  data() {
+    return {
+      list: null,
+      total: null,
+      listLoading: true,
+      listQuery: {
+        pageNum: 1,
+        pageSize: 30
+      },
+      parentId: 0
+    }
+  },
+  created() {
+    this.resetParentId();
+    this.getList();
+  },
+  watch: {
+    $route(route) {
+      this.resetParentId();
+      this.getList();
+    }
+  },
+  methods: {
+    resetParentId() {
+      this.listQuery.pageNum = 1;
+      if (this.$route.query.parentId != null) {
+        this.parentId = this.$route.query.parentId;
+      } else {
+        this.parentId = 0;
+      }
+    },
+    handleAddMenu() {
+      this.$router.push('/ums/addMenu');
+    },
+    getList() {
+      this.listLoading = true;
+      fetchList(this.parentId, this.listQuery).then(response => {
+        this.listLoading = false;
+        this.list = response.data.list;
+        this.total = response.data.total;
+      });
+    },
+    handleSizeChange(val) {
+      this.listQuery.pageNum = 1;
+      this.listQuery.pageSize = val;
+      this.getList();
+    },
+    handleCurrentChange(val) {
+      this.listQuery.pageNum = val;
+      this.getList();
+    },
+    handleHiddenChange(index, row) {
+      updateHidden(row.id, { hidden: row.hidden }).then(response => {
+        this.$message({
+          message: '修改成功',
+          type: 'success',
+          duration: 1000
+        });
+      });
+    },
+    handleShowNextLevel(index, row) {
+      this.$router.push({ path: '/ums/menu', query: { parentId: row.id } })
+    },
+    handleUpdate(index, row) {
+      this.$router.push({ path: '/ums/updateMenu', query: { id: row.id } });
+    },
+    handleDelete(index, row) {
+      this.$confirm('是否要删除该菜单', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        deleteMenu(row.id).then(response => {
+          this.$message({
+            message: '删除成功',
+            type: 'success',
+            duration: 1000
+          });
+          this.getList();
+        });
+      });
+    }
+  },
+  filters: {
+    levelFilter(value) {
+      if (value === 0) {
+        return '一级';
+      } else if (value === 1) {
+        return '二级';
+      }
+    },
+    disableNextLevel(value) {
+      if (value === 0) {
+        return false;
+      } else {
+        return true;
+      }
+    }
+  }
+}
+</script>
+
+<style scoped></style>
+=======
   import {fetchList,deleteMenu,updateMenu,updateHidden} from '@/api/menu'
 
   export default {
@@ -194,3 +347,4 @@
 <style scoped>
 
 </style>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 10 - 0
src/views/ums/menu/update.vue

@@ -1,5 +1,15 @@
+<<<<<<< HEAD
+<template>
+  <div class="app-container">
+    <el-card class="operate-container" shadow="hover">
+      <back-button></back-button>
+    </el-card>
+  <menu-detail :is-edit='true'></menu-detail>
+  </div>
+=======
 <template> 
   <menu-detail :is-edit='true'></menu-detail>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 </template>
 <script>
   import MenuDetail from './components/MenuDetail'

+ 99 - 0
src/views/ums/role/allocMenu.vue

@@ -1,4 +1,102 @@
 <template>
+<<<<<<< HEAD
+  <div class="app-container">
+    <el-card class="operate-container" shadow="hover">
+      <back-button></back-button>
+    </el-card>
+    <el-card class="form-container" shadow="never">
+      <el-tree :data="menuTreeList" show-checkbox default-expand-all node-key="id" ref="tree" highlight-current
+        :props="defaultProps">
+      </el-tree>
+      <div style="margin-top: 20px" align="center">
+        <el-button type="primary" @click="handleSave()">保存</el-button>
+        <el-button @click="handleClear()">清空</el-button>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+import { fetchTreeList } from '@/api/menu';
+import { listMenuByRole, allocMenu } from '@/api/role';
+
+export default {
+  name: "allocMenu",
+  data() {
+    return {
+      menuTreeList: [],
+      defaultProps: {
+        children: 'children',
+        label: 'title'
+      },
+      roleId: null
+    };
+  },
+  created() {
+    this.roleId = this.$route.query.roleId;
+    this.treeList();
+    this.getRoleMenu(this.roleId);
+  },
+  methods: {
+    treeList() {
+      fetchTreeList().then(response => {
+        this.menuTreeList = response.data;
+      });
+    },
+    getRoleMenu(roleId) {
+      listMenuByRole(roleId).then(response => {
+        let menuList = response.data;
+        let checkedMenuIds = [];
+        if (menuList != null && menuList.length > 0) {
+          for (let i = 0; i < menuList.length; i++) {
+            let menu = menuList[i];
+            if (menu.parentId !== 0) {
+              checkedMenuIds.push(menu.id);
+            }
+          }
+        }
+        this.$refs.tree.setCheckedKeys(checkedMenuIds);
+      });
+    },
+    handleSave() {
+      let checkedNodes = this.$refs.tree.getCheckedNodes();
+      let checkedMenuIds = new Set();
+      if (checkedNodes != null && checkedNodes.length > 0) {
+        for (let i = 0; i < checkedNodes.length; i++) {
+          let checkedNode = checkedNodes[i];
+          checkedMenuIds.add(checkedNode.id);
+          if (checkedNode.parentId !== 0) {
+            checkedMenuIds.add(checkedNode.parentId);
+          }
+        }
+      }
+      this.$confirm('是否分配菜单?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        let params = new URLSearchParams();
+        params.append("roleId", this.roleId);
+        params.append("menuIds", Array.from(checkedMenuIds));
+        allocMenu(params).then(response => {
+          this.$message({
+            message: '分配成功',
+            type: 'success',
+            duration: 1000
+          });
+          this.$router.back();
+        })
+      })
+    },
+    handleClear() {
+      this.$refs.tree.setCheckedKeys([]);
+    }
+  }
+}
+</script>
+
+<style scoped></style>
+=======
   <el-card class="form-container" shadow="never">
     <el-tree
       :data="menuTreeList"
@@ -99,3 +197,4 @@
 <style scoped>
 
 </style>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9

+ 13 - 0
src/views/ums/role/allocResource.vue

@@ -1,5 +1,13 @@
 <template>
+<<<<<<< HEAD
+  <div class="app-container">
+    <el-card class="operate-container" shadow="hover">
+      <back-button></back-button>
+    </el-card>
+    <el-card class="form-container" shadow="never">
+=======
   <el-card class="form-container" shadow="never">
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     <div v-for="(cate,index) in allResourceCate" :class="index===0?'top-line':null" :key="'cate'+cate.id">
       <el-row class="table-layout" style="background: #F2F6FC;">
         <el-checkbox v-model="cate.checked"
@@ -20,8 +28,13 @@
       <el-button type="primary" @click="handleSave()">保存</el-button>
       <el-button @click="handleClear()">清空</el-button>
     </div>
+<<<<<<< HEAD
+  </el-card>
+  </div>
+=======
 
   </el-card>
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
 </template>
 
 <script>

+ 8 - 0
src/views/ums/role/index.vue

@@ -96,7 +96,11 @@
         layout="total, sizes,prev, pager, next,jumper"
         :current-page.sync="listQuery.pageNum"
         :page-size="listQuery.pageSize"
+<<<<<<< HEAD
+        :page-sizes="[10,15,20]"
+=======
         :page-sizes="[5,10,15]"
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
         :total="total">
       </el-pagination>
     </div>
@@ -136,7 +140,11 @@
 
   const defaultListQuery = {
     pageNum: 1,
+<<<<<<< HEAD
+    pageSize: 10,
+=======
     pageSize: 5,
+>>>>>>> 259d796d8a144f6fcd5b371a06c66676c11ec3e9
     keyword: null
   };
   const defaultRole = {

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff