فهرست منبع

分销管理模块 -zzx

zouzexu 6 ماه پیش
والد
کامیت
06f57fa0b0

+ 28 - 1
src/api/distribution.js

@@ -45,7 +45,7 @@ export function getJuniorList(params) {
   });
 }
 
-//分销商列表
+//业绩统计列表
 export function performanceList(params) {
   return request({
     url: "/ums/umsAdminUser/getPerformanceStatisticsList",
@@ -54,6 +54,15 @@ export function performanceList(params) {
   });
 }
 
+//提现申请
+export function withdrawRequest(params) {
+  return request({
+    url: "/ums/umsAdminUser/requestWithdraw",
+    method: "get",
+    params: params,
+  });
+}
+
 //设置分销等级
 export function settingType(data) {
   return request({
@@ -71,3 +80,21 @@ export function getQrcode(data) {
     data: data,
   });
 }
+
+// 分销记录列表
+export function recordsList(params) {
+  return request({
+    url: "/ums/umsAdminUser/getAdminUserSettleRecordList",
+    method: "get",
+    params: params,
+  });
+}
+
+// 更新财务结算状态
+export function updateStatus(params) {
+  return request({
+    url: "/ums/umsAdminUser/financialSettlement",
+    method: "get",
+    params: params,
+  });
+}

+ 3 - 1
src/router/index.js

@@ -25,6 +25,7 @@ export const constantRouterMap = [
     path: '/channel',
     component: Layout,
     redirect: '/channel/info',
+    name: 'channel',
     meta: {title: '渠道管理', icon: 'home'},
     children: [{
       path: 'info',
@@ -50,6 +51,7 @@ export const constantRouterMap = [
     path: '/distribution',
     component: Layout,
     redirect: '/distribution/distributionSet',
+    name: 'distribution',
     meta: {title: '分销管理', icon: 'total-yesterday'},
     children: [{
       path: 'distributionSet',
@@ -79,7 +81,7 @@ export const constantRouterMap = [
       path: 'records',
       name: 'records',
       component: () => import('@/views/distribution/records/index'),
-      meta: {title: '分销记录', icon: 'settleAccounts'}
+      meta: {title: '分销记录', icon: 'example'}
     },
     ]
   }

+ 4 - 4
src/views/distribution/peopleManage/index.vue

@@ -15,20 +15,20 @@
             <div style="margin-top: 15px">
                 <el-form :inline="true" :model="listQuery" size="small" label-width="140px">
                     <el-form-item label="分销员姓名:">
-                        <el-input v-model="listQuery.userName" class="input-width" placeholder="请输入用户名称"
+                        <el-input v-model="listQuery.ecName" class="input-width" placeholder="请输入用户名称"
                             clearable></el-input>
                     </el-form-item>
                     <el-form-item label="手机号:">
                         <el-input v-model="listQuery.phone" class="input-width" placeholder="请输入手机号码"
                             clearable></el-input>
                     </el-form-item>
-                    <el-form-item label="分销员层级:">
+                    <!-- <el-form-item label="分销员层级:">
                         <el-select v-model="listQuery.value" clearable placeholder="请选择">
                             <el-option v-for="item in options" :key="item.value" :label="item.label"
                                 :value="item.value">
                             </el-option>
                         </el-select>
-                    </el-form-item>
+                    </el-form-item> -->
                     <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="至"
@@ -143,7 +143,7 @@ import { formatDate } from "@/utils/date";
 const defaultListQuery = {
     pageNum: 1,
     pageSize: 10,
-    userName: null,
+    ecName: null,
     phone: null,
     startTime: '',
     endTime: '',

+ 159 - 59
src/views/distribution/records/index.vue

@@ -15,7 +15,7 @@
             <div style="margin-top: 15px">
                 <el-form :inline="true" :model="listQuery" size="mini" label-width="140px">
                     <el-form-item label="分销员姓名:">
-                        <el-input v-model="listQuery.ecName" class="input-width" placeholder="请输入用户名称"
+                        <el-input v-model="listQuery.userName" class="input-width" placeholder="请输入用户名称"
                             clearable></el-input>
                     </el-form-item>
                     <el-form-item label="分销员手机号:">
@@ -23,29 +23,32 @@
                             clearable></el-input>
                     </el-form-item>
                     <el-form-item label="结算状态:">
-                        <el-select v-model="value" clearable placeholder="请选择">
+                        <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-input v-model="listQuery.phone" class="input-width" placeholder="请输入订单编号"
+                        <el-input v-model="listQuery.chargeOrderNo" class="input-width" placeholder="请输入订单编号"
                             clearable></el-input>
                     </el-form-item>
                     <el-form-item label="完成时间:">
-                        <el-date-picker v-model="date" size="mini" value-format="yyyy-MM-dd" class="item-width-350 ml10"
-                            type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
+                        <el-date-picker v-model="completeDate" size="mini" value-format="yyyy-MM-dd"
+                            class="item-width-350 ml10" type="datetimerange" range-separator="至"
+                            start-placeholder="开始日期" end-placeholder="结束日期">
                         </el-date-picker>
                     </el-form-item>
                     <el-form-item label="提现时间:">
-                        <el-date-picker v-model="date" size="mini" value-format="yyyy-MM-dd" class="item-width-350 ml10"
-                            type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
+                        <el-date-picker v-model="withdrawDate" size="mini" value-format="yyyy-MM-dd"
+                            class="item-width-350 ml10" type="datetimerange" range-separator="至"
+                            start-placeholder="开始日期" end-placeholder="结束日期">
                         </el-date-picker>
                     </el-form-item>
                     <el-form-item label="结算时间:">
-                        <el-date-picker v-model="date" size="mini" value-format="yyyy-MM-dd" class="item-width-350 ml10"
-                            type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
+                        <el-date-picker v-model="colseDate" size="mini" value-format="yyyy-MM-dd"
+                            class="item-width-350 ml10" type="datetimerange" range-separator="至"
+                            start-placeholder="开始日期" end-placeholder="结束日期">
                         </el-date-picker>
                     </el-form-item>
                 </el-form>
@@ -60,35 +63,52 @@
                 <div>
                     <el-button class="ml10" type="info" size="small" :loading="downloadLoading" icon="el-icon-printer"
                         @click="exportAllExcel">导出</el-button>
-                    <el-button class="ml10" type="warning" size="small" :loading="downloadLoading"
-                        icon="el-icon-success" @click="">财务已结算</el-button>
+                    <el-button class="ml10" type="warning" size="small" :loading="updateLoading" icon="el-icon-success"
+                        @click="financeStatus">财务已结算</el-button>
                 </div>
             </div>
         </el-card>
         <div class="table-container">
             <el-table ref="adminTable" :data="list" style="width: 100%" v-loading="listLoading" border>
                 <el-table-column type="selection" width="55"> </el-table-column>
-                <el-table-column label="充电订单编号" width="100" align="center" prop="authCode"></el-table-column>
-                <el-table-column label="订单金额/元" align="center" prop="ecName"></el-table-column>
-                <el-table-column label="服务费金额/元" align="center">
+                <el-table-column label="充电订单编号" width="100" align="center" prop="chargeOrderNo"></el-table-column>
+                <el-table-column label="订单金额/元" align="center" prop="realCost"></el-table-column>
+                <el-table-column label="服务费金额/元" align="center" prop="realServiceCost"></el-table-column>
+                <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>
+                <el-table-column label="一级分销员佣金" align="center" prop="firstLevelCommission"></el-table-column>
+                <el-table-column label="二级分销员" align="center">
                     <template slot-scope="scope">
-                        {{ scope.row.money || "--" }}
+                        {{ scope.row.secondLevelUserName || '--' }}
                     </template>
                 </el-table-column>
-                <el-table-column label="订单完成时间" align="center" prop="updateBy">
+                <el-table-column label="二级分销员手机号" align="center">
                     <template slot-scope="scope">
-                        {{ "--" }}
+                        {{ scope.row.secondLevelPhone || '--' }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="二级分销员佣金" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.secondLevelCommission || '--' }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="结算状态" align="center" prop="updateBy">
+                    <template slot-scope="scope">
+                        <el-tag :type="scope.row.status == 2 ? 'success' : 'danger'">{{ scope.row.status == 2 ? '已结算' :
+                            '待结算' }}</el-tag>
+                    </template>
+                </el-table-column>
+                <el-table-column label="提现时间" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.withdrawTime || '--' }}
+                    </template>
+                </el-table-column>
+                <el-table-column label="结算时间" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.settleTime || '--' }}
                     </template>
                 </el-table-column>
-                <el-table-column label="一级分销员" align="center" prop="updateBy"></el-table-column>
-                <el-table-column label="一级分销员手机号" align="center" prop="updateBy"></el-table-column>
-                <el-table-column label="一级分销员佣金" align="center" prop="updateBy"></el-table-column>
-                <el-table-column label="二级分销员" align="center" prop="updateBy"></el-table-column>
-                <el-table-column label="二级分销员手机号" align="center" prop="updateBy"></el-table-column>
-                <el-table-column label="二级分销员佣金" align="center" prop="updateBy"></el-table-column>
-                <el-table-column label="结算状态" align="center" prop="updateBy"></el-table-column>
-                <el-table-column label="提现时间" align="center" prop="updateBy"></el-table-column>
-                <el-table-column label="结算时间" align="center" prop="updateBy"></el-table-column>
             </el-table>
         </div>
         <div class="pagination-container">
@@ -97,43 +117,40 @@
                 :page-size="listQuery.pageSize" :page-sizes="[10, 15, 20]" :total="total">
             </el-pagination>
         </div>
-        <el-dialog title="提现申请" :visible.sync="forbiddenDialogVisible" width="40%">
-            <el-descriptions border>
-                <el-descriptions-item label="分销员姓名">kooriookami</el-descriptions-item>
-                <el-descriptions-item label="分销员手机号">18100000000</el-descriptions-item>
-                <el-descriptions-item label="本次提现订单数/笔">苏州市</el-descriptions-item>
-                <el-descriptions-item label="本次提现金额/元">
-                    <el-tag size="small">学校</el-tag>
-                </el-descriptions-item>
-            </el-descriptions>
-            <div style="margin-top: 10px; font-size: 14px">
-                说明:提现的订单为今天(2024-11-14)之前
-            </div>
-            <span slot="footer" class="dialog-footer">
-                <el-button @click="forbiddenDialogVisible = false" size="small">取 消</el-button>
-                <el-button type="primary" @click="handleDialogConfirm()" size="small">确 定</el-button>
-            </span>
-        </el-dialog>
     </div>
 </template>
 <script>
-import { upCheckList } from "@/api/channel";
+import { recordsList, updateStatus } from "@/api/distribution";
 import { formatDate } from "@/utils/date";
-
+import FileSaver from 'file-saver';
+import XLSX from 'xlsx';
 const defaultListQuery = {
     pageNum: 1,
     pageSize: 10,
-    ecName: null,
+    userName: null,
     phone: null,
-    startTime: "",
-    endTime: "",
-    value: "",
+    // 完成区间
+    orderStartTime: "",
+    orderEndTime: "",
+    // 结算区间
+    settleStartTime: "",
+    settleEndTime: "",
+    // 提现区间
+    withdrawStartTime: "",
+    withdrawEndTime: "",
+    status: "",
+    chargeOrderNo: "",
+    adminUserId: "",
 };
 export default {
     name: "upCheck",
     data() {
         return {
-            date: "",
+            completeDate: "",
+            withdrawDate: "",
+            colseDate: "",
+            downloadLoading: false,
+            updateLoading: false,
             listQuery: Object.assign({}, defaultListQuery),
             list: null,
             total: null,
@@ -141,33 +158,54 @@ export default {
             forbiddenDialogVisible: false,
             options: [
                 {
-                    value: 1,
+                    value: 0,
                     label: "未提现",
                 },
                 {
-                    value: 2,
+                    value: 1,
                     label: "待结算",
                 },
                 {
-                    value: 3,
+                    value: 2,
                     label: "已结算",
                 },
             ],
         };
     },
     watch: {
-        date(val) {
+        completeDate(val) {
+            if (val) {
+                this.listQuery.orderStartTime = Date.parse(val[0]);
+                this.listQuery.orderEndTime = Date.parse(val[1]);
+            } else {
+                this.listQuery.orderStartTime = "";
+                this.listQuery.orderEndTime = "";
+            }
+        },
+        withdrawDate(val) {
+            if (val) {
+                this.listQuery.settleStartTime = Date.parse(val[0]);
+                this.listQuery.settleEndTime = Date.parse(val[1]);
+            } else {
+                this.listQuery.settleStartTime = "";
+                this.listQuery.settleEndTime = "";
+            }
+        },
+        colseDate(val) {
             if (val) {
-                this.listQuery.startTime = Date.parse(val[0]);
-                this.listQuery.endTime = Date.parse(val[1]);
+                this.listQuery.withdrawStartTime = Date.parse(val[0]);
+                this.listQuery.withdrawEndTime = Date.parse(val[1]);
             } else {
-                this.listQuery.startTime = "";
-                this.listQuery.endTime = "";
+                this.listQuery.withdrawStartTime = "";
+                this.listQuery.withdrawEndTime = "";
             }
         },
     },
     created() {
         this.getList();
+        if(this.$route){
+            this.listQuery.adminUserId = this.$route.query.adminUserId
+        }
     },
     filters: {
         formatDateTime(time) {
@@ -179,6 +217,68 @@ export default {
         },
     },
     methods: {
+        // 更新结算状态
+        financeStatus() {
+            this.updateLoading = true
+            updateStatus().then((res) => {
+            this.updateLoading = false
+                if (res.code === 200) {
+                    this.$message({
+                        message: "更新成功",
+                        type: "success",
+                    });
+                    this.getList();
+                } else {
+                    this.$message({
+                        message: res.msg,
+                        type: "error",
+                    })
+                }
+            })
+        },
+        // 导出
+        exportAllExcel() {
+            this.downloadLoading = true
+            const allData = [];
+            let query = JSON.parse(JSON.stringify(this.listQuery))
+            query.pageSize = this.total
+            query.page = 0
+            recordsList(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.chargeOrderNo,
+                    "订单金额/元": item.realCost,
+                    "服务费金额/元": item.realServiceCost,
+                    "订单完成时间": item.endTime,
+                    "一级分销员": item.firstLevelUserName,
+                    "一级分销员手机号": item.firstLevelPhone,
+                    "一级分销员佣金": item.firstLevelCommission,
+                    "二级分销员": item.secondLevelUserName || '--',
+                    "二级分销员手机号": item.secondLevelPhone || '--',
+                    "二级分销员佣金": item.secondLevelCommission || '--',
+                    "结算状态": item.status == 1 ? '已结算' : '未结算',
+                    "提现时间": 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.listQuery = Object.assign({}, defaultListQuery);
         },
@@ -197,7 +297,7 @@ export default {
         },
         getList() {
             this.listLoading = true;
-            upCheckList(this.listQuery).then((response) => {
+            recordsList(this.listQuery).then((response) => {
                 this.listLoading = false;
                 this.list = response.data.list;
                 this.total = response.data.total;

+ 44 - 10
src/views/distribution/statistics/index.vue

@@ -43,7 +43,12 @@
                 <el-table-column label="用户购券金额/元" align="center" prop="userTopAllMoney"></el-table-column>
                 <el-table-column label="待清算佣金/元" align="center" prop="unconsumedMoney"></el-table-column>
                 <el-table-column label="用户退款金额/元" align="center" prop="userRefundAllMoney"></el-table-column>
-                <el-table-column label="待结算佣金/元" align="center" prop="unSettleAccountMoney"></el-table-column>
+                <el-table-column label="待结算佣金/元" align="center">
+                    <template slot-scope="scope">
+                        <span class="pushRecords" @click="pushRecords(scope.row)">{{ scope.row.unSettleAccountMoney || '0'
+                            }}</span>
+                    </template>
+                </el-table-column>
                 <el-table-column label="已结算佣金/元" align="center" prop="settleAccountMoney"></el-table-column>
                 <el-table-column label="操作" width="180" align="center">
                     <template slot-scope="scope">
@@ -70,13 +75,14 @@
             <div style="margin-top: 10px;font-size: 14px;">说明:提现的订单为今天(2024-11-14)之前</div>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="forbiddenDialogVisible = false" size="small">取 消</el-button>
-                <el-button type="primary" @click="handleDialogConfirm()" size="small">确 定</el-button>
+                <el-button type="primary" @click="confirmRequest" size="small">确
+                    定</el-button>
             </span>
         </el-dialog>
     </div>
 </template>
 <script>
-import { performanceList } from "@/api/distribution";
+import { performanceList, withdrawRequest } from "@/api/distribution";
 import { formatDate } from "@/utils/date";
 import FileSaver from 'file-saver';
 import XLSX from 'xlsx';
@@ -126,6 +132,15 @@ export default {
         },
     },
     methods: {
+        // 跳转至记录列表
+        pushRecords(row) {
+            this.$router.push({
+                path: "/distribution/records",
+                query: {
+                    adminUserId:row.adminUserId,
+                },
+            });
+        },
         // 导出
         exportAllExcel() {
             this.downloadLoading = true
@@ -146,20 +161,20 @@ export default {
         exportExcel(r) {
             const data = r.map((item) => {
                 return {
-                    "分销员姓名":item.userName,
-                    "分销员手机号":item.phone,
-                    "用户购券金额/元":item.userTopAllMoney,
-                    "待清算佣金/元":item.unconsumedMoney,
-                    "用户退款金额/元":item.userRefundAllMoney,
+                    "分销员姓名": item.userName,
+                    "分销员手机号": item.phone,
+                    "用户购券金额/元": item.userTopAllMoney,
+                    "待清算佣金/元": item.unconsumedMoney,
+                    "用户退款金额/元": item.userRefundAllMoney,
                     "待结算佣金/元": item.unSettleAccountMoney,
-                    "已结算佣金/元":item.settleAccountMoney,
+                    "已结算佣金/元": item.settleAccountMoney,
                 }
             })
             const worksheet = XLSX.utils.json_to_sheet(data);
             const workbook = { Sheets: { data: worksheet }, SheetNames: ['data'] };
             const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
             const blob = new Blob([excelBuffer], { type: 'application/octet-stream' });
-            FileSaver.saveAs(blob, '统计表.xlsx');
+            FileSaver.saveAs(blob, '分销统计表.xlsx');
         },
 
         // 结算申请
@@ -168,6 +183,20 @@ export default {
             this.dialogQuery = row;
         },
 
+        // 确认
+        confirmRequest() {
+            withdrawRequest({ adminUserId: this.dialogQuery.adminUserId }).then(res => {
+                if (res.code == 200) {
+                    this.$message({
+                        message: '操作成功',
+                        type: 'success'
+                    });
+                    this.forbiddenDialogVisible = false;
+                    this.getList();
+                }
+            })
+        },
+
         handleResetSearch() {
             this.listQuery = Object.assign({}, defaultListQuery);
         },
@@ -209,4 +238,9 @@ export default {
         }
     }
 }
+
+.pushRecords {
+    color: #409EFF;
+    cursor: pointer;
+}
 </style>

+ 12 - 5
src/views/distribution/userList/index.vue

@@ -70,7 +70,7 @@
             </el-pagination>
         </div>
         <el-dialog title="查看绑定用户" :visible.sync="forbiddenDialogVisible" width="30%">
-            <el-table ref="adminTable" :data="list" style="width: 100%" v-loading="listLoading" border>
+            <el-table ref="adminTable" :data="list" style="width: 100%" v-loading="dialogListLoading" border>
                 <el-table-column label="序号" width="100" align="center" prop="id"></el-table-column>
                 <el-table-column label="姓名" align="center" prop="nickName"></el-table-column>
                 <el-table-column label="手机号" align="center" prop="phone"></el-table-column>
@@ -79,7 +79,7 @@
     </div>
 </template>
 <script>
-import { userList,settingType } from "@/api/distribution";
+import { userList, settingType } from "@/api/distribution";
 import { formatDate } from "@/utils/date";
 
 const defaultListQuery = {
@@ -100,6 +100,7 @@ export default {
             list: null,
             total: null,
             listLoading: false,
+            dialogListLoading: false,
             forbiddenDialogVisible: false
         };
     },
@@ -128,7 +129,7 @@ export default {
     },
     methods: {
         // 设置分销
-        get_settingType(idnex,row){
+        get_settingType(idnex, row) {
             this.$confirm("是否确认提交?", "提示", {
                 confirmButtonText: "确定",
                 cancelButtonText: "取消",
@@ -140,7 +141,7 @@ export default {
                 settingType({ ...updateData }).then((response) => {
                     if (response.code == 200) {
                         this.$message({
-                            message:"设置成功!",
+                            message: "设置成功!",
                             type: "success",
                         });
                         this.getList()
@@ -164,6 +165,7 @@ export default {
             this.listQuery = Object.assign({}, defaultListQuery);
         },
         handleSearchList() {
+            this.listQuery.admin_user_id=null
             this.listQuery.pageNum = 1;
             this.getList();
         },
@@ -177,9 +179,14 @@ export default {
             this.getList();
         },
         getList() {
-            this.listLoading = true;
+            if (this.listQuery.admin_user_id == null) {
+                this.listLoading = true;
+            } else {
+                this.dialogListLoading = true;
+            }
             userList(this.listQuery).then((response) => {
                 this.listLoading = false;
+                this.dialogListLoading = false;
                 this.list = response.data.list;
                 this.total = response.data.total;
             });