From d87b23bc080516aa989990fbd48ef64b5368405e Mon Sep 17 00:00:00 2001 From: hu177768073 <177768073@qq.com> Date: Wed, 14 May 2025 16:47:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/app.routes.ts | 6 +- .../spread-channel-config.component.html | 73 +++++ .../spread-channel-config.component.less | 6 + .../spread-channel-config.component.ts | 193 ++++++++++++ .../spread-commission.component.html | 100 +++++++ .../spread-commission.component.less | 0 .../spread-commission.component.ts | 200 +++++++++++++ .../spread-user-account-record.component.html | 96 ++++++ .../spread-user-account-record.component.less | 0 .../spread-user-account-record.component.ts | 197 +++++++++++++ .../spread-user-list.component.html | 140 +++++++++ .../spread-user-list.component.less | 3 + .../spread-user-list.component.ts | 276 ++++++++++++++++++ src/app/pages/spread/spread.module.ts | 12 + src/app/pages/spread/spread.routes.ts | 12 + .../pipes/spread/spread-user-status.pipe.ts | 20 ++ .../spread/spread-oil-channel.service.ts | 35 +++ .../services/spread/spread-user.service.ts | 118 ++++++++ src/environments/environment.ts | 2 +- 19 files changed, 1487 insertions(+), 2 deletions(-) create mode 100644 src/app/pages/spread/spread-channel-config/spread-channel-config.component.html create mode 100644 src/app/pages/spread/spread-channel-config/spread-channel-config.component.less create mode 100644 src/app/pages/spread/spread-channel-config/spread-channel-config.component.ts create mode 100644 src/app/pages/spread/spread-commission/spread-commission.component.html create mode 100644 src/app/pages/spread/spread-commission/spread-commission.component.less create mode 100644 src/app/pages/spread/spread-commission/spread-commission.component.ts create mode 100644 src/app/pages/spread/spread-user-account-record/spread-user-account-record.component.html create mode 100644 src/app/pages/spread/spread-user-account-record/spread-user-account-record.component.less create mode 100644 src/app/pages/spread/spread-user-account-record/spread-user-account-record.component.ts create mode 100644 src/app/pages/spread/spread-user-list/spread-user-list.component.html create mode 100644 src/app/pages/spread/spread-user-list/spread-user-list.component.less create mode 100644 src/app/pages/spread/spread-user-list/spread-user-list.component.ts create mode 100644 src/app/pages/spread/spread.module.ts create mode 100644 src/app/pages/spread/spread.routes.ts create mode 100644 src/app/pipes/spread/spread-user-status.pipe.ts create mode 100644 src/app/services/spread/spread-oil-channel.service.ts create mode 100644 src/app/services/spread/spread-user.service.ts diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index 7f85288..00f1723 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,7 +1,6 @@ import { Routes } from '@angular/router'; import {IndexComponent} from "./pages/body/index/index.component"; import {InitGuardService} from "./utils/initGuard.service"; -import {ERROR_ROUTES} from "./pages/error/error.routes"; import {Error404Component} from "./pages/error/error404/error404.component"; export const routes: Routes = [ {path: '', pathMatch: 'full', redirectTo: 'admin/index'}, @@ -46,6 +45,11 @@ export const routes: Routes = [ loadChildren: () => import('./pages/trade/trade.routes').then(m => m.TRADE_ROUTES), canActivate: [InitGuardService] }, + { + path: 'spread', + loadChildren: () => import('./pages/spread/spread.routes').then(m => m.SPREAD_ROUTES), + canActivate: [InitGuardService] + }, { path: 'system', loadChildren: () => import('./pages/system/system.routes').then(m => m.SYSTEM_ROUTES), diff --git a/src/app/pages/spread/spread-channel-config/spread-channel-config.component.html b/src/app/pages/spread/spread-channel-config/spread-channel-config.component.html new file mode 100644 index 0000000..61d3d45 --- /dev/null +++ b/src/app/pages/spread/spread-channel-config/spread-channel-config.component.html @@ -0,0 +1,73 @@ + + + + 渠道 + 一级佣金 + 二级佣金 + 更新时间 + 操作 + + + + + {{data.channel | dictionary: "MER_SOURCE_TYPE"}} + {{data.rebate}} % + {{data.rebateOne}} % + {{data.updateTime | date : 'yyyy-MM-dd HH:mm:ss'}} + + + + + + 总计 {{ total }} 条 + + + + +
+ + + 渠道 + + + + + + + + + 一级佣金 + + + + + + + + + 二级佣金 + + + + + + + +
+ +
+
+
+
diff --git a/src/app/pages/spread/spread-channel-config/spread-channel-config.component.less b/src/app/pages/spread/spread-channel-config/spread-channel-config.component.less new file mode 100644 index 0000000..9ca565b --- /dev/null +++ b/src/app/pages/spread/spread-channel-config/spread-channel-config.component.less @@ -0,0 +1,6 @@ +nz-input-number { + width: 100%; +} +.submit-btn { + width: 150px; +} diff --git a/src/app/pages/spread/spread-channel-config/spread-channel-config.component.ts b/src/app/pages/spread/spread-channel-config/spread-channel-config.component.ts new file mode 100644 index 0000000..49b34fa --- /dev/null +++ b/src/app/pages/spread/spread-channel-config/spread-channel-config.component.ts @@ -0,0 +1,193 @@ +import { Component } from '@angular/core'; +import {DatePipe, NgForOf, NgIf} from "@angular/common"; +import {DictionaryPipe} from "../../../pipes/common/dictionary.pipe"; +import {NzButtonComponent} from "ng-zorro-antd/button"; +import { + NzCellFixedDirective, + NzTableCellDirective, + NzTableComponent, NzTableModule, + NzTbodyComponent, NzTheadComponent, + NzThMeasureDirective, NzTrDirective +} from "ng-zorro-antd/table"; +import {NzColDirective, NzRowDirective} from "ng-zorro-antd/grid"; +import {NzFlexDirective} from "ng-zorro-antd/flex"; +import {NzFormControlComponent, NzFormDirective, NzFormItemComponent, NzFormLabelComponent} from "ng-zorro-antd/form"; +import {NzInputNumberComponent, NzInputNumberModule} from "ng-zorro-antd/input-number"; +import {NzModalComponent, NzModalModule, NzModalService} from "ng-zorro-antd/modal"; +import {NzOptionComponent, NzSelectComponent} from "ng-zorro-antd/select"; +import {FormGroup, FormsModule, NonNullableFormBuilder, ReactiveFormsModule, Validators} from "@angular/forms"; +import {WeekPipe} from "../../../pipes/common/week.pipe"; +import {NzDividerComponent} from "ng-zorro-antd/divider"; +import {NzDropDownADirective, NzDropDownDirective, NzDropdownMenuComponent} from "ng-zorro-antd/dropdown"; +import {NzIconDirective} from "ng-zorro-antd/icon"; +import {NzInputDirective, NzInputGroupComponent} from "ng-zorro-antd/input"; +import {NzMenuDirective, NzMenuItemComponent} from "ng-zorro-antd/menu"; +import {NzDescriptionsModule} from "ng-zorro-antd/descriptions"; +import {NzUploadComponent} from "ng-zorro-antd/upload"; +import {NzAvatarModule} from "ng-zorro-antd/avatar"; +import {NzImageModule} from "ng-zorro-antd/image"; +import {NzSwitchComponent} from "ng-zorro-antd/switch"; +import {NzDatePickerComponent} from "ng-zorro-antd/date-picker"; +import {NzMessageService} from "ng-zorro-antd/message"; +import {BrowserStorageService} from "../../../utils/localStorage.service"; +import {OilChannelWeekService} from "../../../services/mer-oil-price/oil-channel-week.service"; +import {CommonService} from "../../../services/common/common.service"; +import {SpreadOilChannelService} from "../../../services/spread/spread-oil-channel.service"; + +@Component({ + selector: 'app-spread-channel-config', + standalone: true, + imports: [ + DatePipe, + DictionaryPipe, + FormsModule, + NgForOf, + NgIf, + NzButtonComponent, + NzCellFixedDirective, + NzColDirective, + NzDividerComponent, + NzDropDownADirective, + NzDropDownDirective, + NzDropdownMenuComponent, + NzFormControlComponent, + NzFormDirective, + NzFormItemComponent, + NzFormLabelComponent, + NzIconDirective, + NzInputDirective, + NzMenuDirective, + NzMenuItemComponent, + NzOptionComponent, + NzRowDirective, + NzSelectComponent, + NzTableCellDirective, + NzTableComponent, + NzTbodyComponent, + NzThMeasureDirective, + NzTheadComponent, + NzTrDirective, + ReactiveFormsModule, + NzTableModule, + NzModalModule, + NzFlexDirective, + NzDescriptionsModule, + NzUploadComponent, + NzAvatarModule, + NzImageModule, + NzSwitchComponent, + NzDatePickerComponent, + NzInputNumberModule, + WeekPipe, + NzInputGroupComponent + ], + templateUrl: './spread-channel-config.component.html', + styleUrl: './spread-channel-config.component.less' +}) +export class SpreadChannelConfigComponent { + // 表单数据 + tableData: any = []; + // 搜索表单 + searchForm: FormGroup; + // 油站渠道 + merSourceTypeArray = new DictionaryPipe().getDictionaryList('MER_SOURCE_TYPE'); + // 编辑数据表单 + editDataForm: FormGroup; + editDataModal = false; + // 当前日期 + today:number = new Date().getDay(); + constructor(private fb: NonNullableFormBuilder, + private message: NzMessageService, + private storage: BrowserStorageService, + private spreadOilChannelService: SpreadOilChannelService, + private commonService: CommonService, + private modal: NzModalService) { + // 初始化搜索框 + this.searchForm = this.fb.group({ + }); + + this.editDataForm = this.fb.group({ + id: [null, [Validators.required]], + channel: [null], + rebate: [null, [Validators.required]], + rebateOne: [null, [Validators.required]], + }); + // 查询数据 + this.queryData(); + } + + /** + * 获取数据 + */ + queryData() { + this.searchForm.value.time = new Date().getTime(); + this.spreadOilChannelService.getOilChannelList(this.searchForm.value, (data: any) => { + if (data['return_code'] == '000000') { + this.tableData = data['return_data']; + } + }); + } + + /** + * 搜索表单提交 + */ + searchFormSubmit(): void { + this.queryData(); + } + + /** + * 搜索表单重置 + */ + searchFormReset(): void { + this.searchForm.reset(); + } + + /** + * 打开编辑模态框 + */ + showEditModal(data: any) { + data['channel'] = String(data['channel']); + this.editDataForm.patchValue(data); + this.editDataForm.controls['channel'].disable(); + this.editDataModal = true; + } + + /** + * 提交数据 + */ + submitData() { + if (this.editDataForm.valid) { + const param = { + channel: this.editDataForm.controls['channel'].value, + rebate: this.editDataForm.controls['rebate'].value, + rebateOne: this.editDataForm.controls['rebateOne'].value + }; + this.spreadOilChannelService.editOilChannel(param, (data: any) => { + if (data['return_code'] == '000000') { + this.message.create('success', '操作成功'); + // 刷新数据 + this.queryData(); + // 关闭弹窗 + this.closeEditModal(); + } else { + this.message.create('error', data['return_msg']); + } + }); + } else { + Object.values(this.editDataForm.controls).forEach(control => { + if (control.invalid) { + control.markAsDirty(); + control.updateValueAndValidity({ onlySelf: true }); + } + }); + } + } + + /** + * 关闭编辑任务模态框 + */ + closeEditModal() { + this.editDataForm.reset(); + this.editDataModal = false; + } +} diff --git a/src/app/pages/spread/spread-commission/spread-commission.component.html b/src/app/pages/spread/spread-commission/spread-commission.component.html new file mode 100644 index 0000000..630ad38 --- /dev/null +++ b/src/app/pages/spread/spread-commission/spread-commission.component.html @@ -0,0 +1,100 @@ + + + + + +
+
+
+ + 时间 + + + + + + + +
+
+ + 状态 + + + + + + + +
+
+ + + + + + +
+
+
+ + + + + 订单号 + 油站名称 + 油号 + 枪号 + 升数 + 加油金额 + 实付金额 + 支付时间 + 一级佣金 + 二级佣金 + 佣金 + + + + + + {{data.orderNo}} + {{data.merName}} + {{data.gasOilNo}}# + {{data.gasGunNo}} + {{data.gasOilLiters}}L + ¥{{data.gasRefuelPrice}} + ¥{{data.payablePrice}} + {{data.payTime | date : 'yyyy-MM-dd HH:mm:ss'}} + ¥{{data.gainsRebateAmount!=null?data.gainsRebateAmount:0}} + ¥{{data.gainsRebateOneAmount!=null?data.gainsRebateOneAmount:0}} + ¥ + {{data.gainsRebateAmount}} + {{data.gainsRebateOneAmount}} + + + + + 总计 {{ total }} 条 + diff --git a/src/app/pages/spread/spread-commission/spread-commission.component.less b/src/app/pages/spread/spread-commission/spread-commission.component.less new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/spread/spread-commission/spread-commission.component.ts b/src/app/pages/spread/spread-commission/spread-commission.component.ts new file mode 100644 index 0000000..c71d90c --- /dev/null +++ b/src/app/pages/spread/spread-commission/spread-commission.component.ts @@ -0,0 +1,200 @@ +import {Component, Input, OnInit} from '@angular/core'; +import {DatePipe, NgForOf, NgIf} from "@angular/common"; +import {NzButtonComponent} from "ng-zorro-antd/button"; +import {NzColDirective, NzRowDirective} from "ng-zorro-antd/grid"; +import {NzDatePickerComponent, NzDatePickerModule, NzRangePickerComponent} from "ng-zorro-antd/date-picker"; +import {NzFormControlComponent, NzFormDirective, NzFormItemComponent, NzFormLabelComponent} from "ng-zorro-antd/form"; +import {NzOptionComponent, NzSelectComponent} from "ng-zorro-antd/select"; +import {NzRadioButtonDirective, NzRadioComponent, NzRadioGroupComponent, NzRadioModule} from "ng-zorro-antd/radio"; +import {NzStatisticComponent, NzStatisticModule} from "ng-zorro-antd/statistic"; +import { + NzCellFixedDirective, + NzTableCellDirective, + NzTableComponent, NzTableModule, + NzTbodyComponent, + NzTheadComponent, + NzThMeasureDirective, NzTrDirective +} from "ng-zorro-antd/table"; +import {FormGroup, FormsModule, NonNullableFormBuilder, ReactiveFormsModule} from "@angular/forms"; +import {DateSelectType, DateUtils} from "../../../utils/dateUtils.service"; +import {NzMessageService} from "ng-zorro-antd/message"; +import {BrowserStorageService} from "../../../utils/localStorage.service"; +import {SpreadUserService} from "../../../services/spread/spread-user.service"; +import {CommonService} from "../../../services/common/common.service"; +import {NzModalModule, NzModalService} from "ng-zorro-antd/modal"; +import {DictionaryPipe} from "../../../pipes/common/dictionary.pipe"; +import {NzDividerComponent} from "ng-zorro-antd/divider"; +import {NzDropDownADirective, NzDropDownDirective, NzDropdownMenuComponent} from "ng-zorro-antd/dropdown"; +import {NzIconDirective} from "ng-zorro-antd/icon"; +import {NzInputDirective} from "ng-zorro-antd/input"; +import {NzMenuDirective, NzMenuItemComponent} from "ng-zorro-antd/menu"; +import {NzFlexDirective} from "ng-zorro-antd/flex"; +import {NzDescriptionsModule} from "ng-zorro-antd/descriptions"; +import {NzUploadComponent} from "ng-zorro-antd/upload"; +import {NzAvatarModule} from "ng-zorro-antd/avatar"; +import {NzImageModule} from "ng-zorro-antd/image"; +import {NzSwitchComponent} from "ng-zorro-antd/switch"; +import {NzInputNumberModule} from "ng-zorro-antd/input-number"; +import {WeekPipe} from "../../../pipes/common/week.pipe"; + +@Component({ + selector: 'app-spread-commission', + standalone: true, + imports: [ + DatePipe, + DictionaryPipe, + FormsModule, + NgForOf, + NgIf, + NzButtonComponent, + NzCellFixedDirective, + NzColDirective, + NzDividerComponent, + NzDropDownADirective, + NzDropDownDirective, + NzDropdownMenuComponent, + NzFormControlComponent, + NzFormDirective, + NzFormItemComponent, + NzFormLabelComponent, + NzIconDirective, + NzInputDirective, + NzMenuDirective, + NzMenuItemComponent, + NzOptionComponent, + NzRowDirective, + NzSelectComponent, + NzTableCellDirective, + NzTableComponent, + NzTbodyComponent, + NzThMeasureDirective, + NzTheadComponent, + NzTrDirective, + ReactiveFormsModule, + NzTableModule, + NzModalModule, + NzFlexDirective, + NzDescriptionsModule, + NzUploadComponent, + NzAvatarModule, + NzImageModule, + NzSwitchComponent, + NzDatePickerComponent, + NzInputNumberModule, + WeekPipe, + NzStatisticModule, + NzRadioModule, + NzDatePickerModule + ], + templateUrl: './spread-commission.component.html', + styleUrl: './spread-commission.component.less' +}) +export class SpreadCommissionComponent implements OnInit { + @Input() userId: any; + // 表单页数 + tablePageNum = 1; + // 每页数量 + tablePageSize = 10; + // 表单数据 + tableData: any = []; + // 搜索表单 + searchForm: FormGroup; + // 时间快速选择项 + dateTypeSelect = DateSelectType; + countData = 0; + constructor(private fb: NonNullableFormBuilder, + private message: NzMessageService, + private storage: BrowserStorageService, + private spreadUserService: SpreadUserService, + private commonService: CommonService, + private modal: NzModalService) { + // 初始化搜索框 + this.searchForm = this.fb.group({ + userId: [null], + orderStatus: ['2'], + payTimeSelect: ['1'], + payTimeArray: [[]], + payTimeS: [null], + payTimeE: [null], + }); + // 初始化创建时间 + this.payTimeInit(); + + } + + ngOnInit(): void { + // 查询佣金统计 + this.countAccount(); + // 查询数据 + this.queryData(); + } + + /** + * 创建时间初始化 + */ + payTimeInit() { + let createTimeSelect = this.searchForm.controls['payTimeSelect'].value; + if (createTimeSelect != null) { + let timeObj = DateUtils.getDate(new Date(), Number(createTimeSelect)); + this.searchForm.controls['payTimeArray'].setValue([timeObj.timeS, timeObj.timeE]); + } + } + + /** + * 查询佣金统计 + */ + countAccount() { + if (this.searchForm.controls['payTimeArray'].value != null + && this.searchForm.controls['payTimeArray'].value.length > 0) { + this.searchForm.controls['payTimeS'].setValue(new Date(this.searchForm.controls['payTimeArray'].value[0]).getTime()); + this.searchForm.controls['payTimeE'].setValue(new Date(this.searchForm.controls['payTimeArray'].value[1]).getTime()); + } else { + this.searchForm.controls['payTimeS'].setValue(null); + this.searchForm.controls['payTimeE'].setValue(null); + } + this.searchForm.value.userId = this.userId; + // 佣金情况 + this.spreadUserService.countAccount(this.searchForm.value,(data: any) => { + if (data['return_code'] == '000000'){ + this.countData = data['return_data']; + } + }) + } + /** + * 获取数据 + */ + queryData() { + if (this.searchForm.controls['payTimeArray'].value != null + && this.searchForm.controls['payTimeArray'].value.length > 0) { + this.searchForm.controls['payTimeS'].setValue(new Date(this.searchForm.controls['payTimeArray'].value[0]).getTime()); + this.searchForm.controls['payTimeE'].setValue(new Date(this.searchForm.controls['payTimeArray'].value[1]).getTime()); + } else { + this.searchForm.controls['payTimeS'].setValue(null); + this.searchForm.controls['payTimeE'].setValue(null); + } + this.searchForm.value.userId = this.userId; + this.searchForm.value.pageNum = this.tablePageNum; + this.searchForm.value.pageSize = this.tablePageSize; + this.searchForm.value.time = new Date().getTime(); + this.spreadUserService.queryOilOrderSpread(this.searchForm.value, (data: any) => { + if (data['return_code'] == '000000') { + this.tableData = data['return_data']; + } + }); + } + + /** + * 搜索表单提交 + */ + searchFormSubmit(): void { + this.queryData(); + this.countAccount(); + } + + /** + * 搜索表单重置 + */ + searchFormReset(): void { + this.searchForm.reset(); + } +} diff --git a/src/app/pages/spread/spread-user-account-record/spread-user-account-record.component.html b/src/app/pages/spread/spread-user-account-record/spread-user-account-record.component.html new file mode 100644 index 0000000..8777533 --- /dev/null +++ b/src/app/pages/spread/spread-user-account-record/spread-user-account-record.component.html @@ -0,0 +1,96 @@ + + + + + + + + + + + +
+
+
+ + 时间 + + + + + + + +
+
+ + 记录来源 + + + + + + + + +
+
+ + + + + + +
+
+
+ + + + + 类型 + 记录来源 + 交易金额 + 变更前金额 + 变更后金额 + 来源内容 + 创建时间 + + + + + + {{data.type | dictionary: 'USER_SPREAD_ACCOUNT_RECORD_TYPE'}} + {{data.sourceType | dictionary: 'USER_SPREAD_ACCOUNT_RECORD_SOURCE_TYPE'}} + ¥{{data.transactionAmount}} + ¥{{data.beforeAmount}} + ¥{{data.afterAmount}} + {{data.sourceContent}} + {{data.createTime | date : 'yyyy-MM-dd HH:mm:ss'}} + + + + 总计 {{ total }} 条 + diff --git a/src/app/pages/spread/spread-user-account-record/spread-user-account-record.component.less b/src/app/pages/spread/spread-user-account-record/spread-user-account-record.component.less new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/spread/spread-user-account-record/spread-user-account-record.component.ts b/src/app/pages/spread/spread-user-account-record/spread-user-account-record.component.ts new file mode 100644 index 0000000..91d40c3 --- /dev/null +++ b/src/app/pages/spread/spread-user-account-record/spread-user-account-record.component.ts @@ -0,0 +1,197 @@ +import {Component, Input, OnInit} from '@angular/core'; +import {DatePipe, NgForOf, NgIf} from "@angular/common"; +import {FormGroup, FormsModule, NonNullableFormBuilder, ReactiveFormsModule, Validators} from "@angular/forms"; +import {NzButtonComponent} from "ng-zorro-antd/button"; +import { + NzCellFixedDirective, + NzTableCellDirective, + NzTableComponent, NzTableModule, + NzTbodyComponent, NzTheadComponent, + NzThMeasureDirective, NzTrDirective +} from "ng-zorro-antd/table"; +import {NzColDirective, NzRowDirective} from "ng-zorro-antd/grid"; +import {NzDropDownADirective, NzDropDownDirective, NzDropdownMenuComponent} from "ng-zorro-antd/dropdown"; +import {NzFlexDirective} from "ng-zorro-antd/flex"; +import {NzFormControlComponent, NzFormDirective, NzFormItemComponent, NzFormLabelComponent} from "ng-zorro-antd/form"; +import {NzIconDirective} from "ng-zorro-antd/icon"; +import {NzInputDirective} from "ng-zorro-antd/input"; +import {NzInputNumberComponent, NzInputNumberModule} from "ng-zorro-antd/input-number"; +import {NzMenuDirective, NzMenuItemComponent} from "ng-zorro-antd/menu"; +import {NzModalComponent, NzModalModule, NzModalService} from "ng-zorro-antd/modal"; +import {NzStatisticComponent, NzStatisticModule} from "ng-zorro-antd/statistic"; +import {SpreadUserStatusPipe} from "../../../pipes/spread/spread-user-status.pipe"; +import {NzMessageService} from "ng-zorro-antd/message"; +import {BrowserStorageService} from "../../../utils/localStorage.service"; +import {SpreadUserService} from "../../../services/spread/spread-user.service"; +import {CommonService} from "../../../services/common/common.service"; +import {DictionaryPipe} from "../../../pipes/common/dictionary.pipe"; +import {NzDividerComponent} from "ng-zorro-antd/divider"; +import {NzOptionComponent, NzSelectComponent} from "ng-zorro-antd/select"; +import {NzDescriptionsModule} from "ng-zorro-antd/descriptions"; +import {NzUploadComponent} from "ng-zorro-antd/upload"; +import {NzAvatarModule} from "ng-zorro-antd/avatar"; +import {NzImageModule} from "ng-zorro-antd/image"; +import {NzSwitchComponent} from "ng-zorro-antd/switch"; +import {NzDatePickerComponent, NzDatePickerModule, NzRangePickerComponent} from "ng-zorro-antd/date-picker"; +import {WeekPipe} from "../../../pipes/common/week.pipe"; +import {DateSelectType, DateUtils} from "../../../utils/dateUtils.service"; +import {NzRadioButtonDirective, NzRadioComponent, NzRadioGroupComponent, NzRadioModule} from "ng-zorro-antd/radio"; + +@Component({ + selector: 'app-spread-user-account-record', + standalone: true, + imports: [ + DatePipe, + DictionaryPipe, + FormsModule, + NgForOf, + NgIf, + NzButtonComponent, + NzCellFixedDirective, + NzColDirective, + NzDividerComponent, + NzDropDownADirective, + NzDropDownDirective, + NzDropdownMenuComponent, + NzFormControlComponent, + NzFormDirective, + NzFormItemComponent, + NzFormLabelComponent, + NzIconDirective, + NzInputDirective, + NzMenuDirective, + NzMenuItemComponent, + NzOptionComponent, + NzRowDirective, + NzSelectComponent, + NzTableCellDirective, + NzTableComponent, + NzTbodyComponent, + NzThMeasureDirective, + NzTheadComponent, + NzTrDirective, + ReactiveFormsModule, + NzTableModule, + NzModalModule, + NzFlexDirective, + NzDescriptionsModule, + NzUploadComponent, + NzAvatarModule, + NzImageModule, + NzSwitchComponent, + NzDatePickerComponent, + NzInputNumberModule, + WeekPipe, + NzStatisticModule, + NzRadioModule, + NzDatePickerModule + ], + templateUrl: './spread-user-account-record.component.html', + styleUrl: './spread-user-account-record.component.less' +}) +export class SpreadUserAccountRecordComponent implements OnInit { + @Input() userId: any; + // 表单页数 + tablePageNum = 1; + // 每页数量 + tablePageSize = 10; + // 表单数据 + tableData: any = []; + // 搜索表单 + searchForm: FormGroup; + // 时间快速选择项 + dateTypeSelect = DateSelectType; + countData: any = { + amount: 0, + cashOutAmount: 0, + notCashOutAmount: 0, + }; + constructor(private fb: NonNullableFormBuilder, + private message: NzMessageService, + private storage: BrowserStorageService, + private spreadUserService: SpreadUserService, + private commonService: CommonService, + private modal: NzModalService) { + // 初始化搜索框 + this.searchForm = this.fb.group({ + userId: [null], + sourceType: ['1'], + createTimeSelect: ['1'], + createTimeArray: [[]], + createTimeS: [null], + createTimeE: [null], + }); + // 初始化创建时间 + this.payTimeInit(); + + } + + ngOnInit(): void { + // 查询佣金统计 + this.countAccount(); + // 查询数据 + this.queryData(); + } + + /** + * 创建时间初始化 + */ + payTimeInit() { + let createTimeSelect = this.searchForm.controls['createTimeSelect'].value; + if (createTimeSelect != null) { + let timeObj = DateUtils.getDate(new Date(), Number(createTimeSelect)); + this.searchForm.controls['createTimeArray'].setValue([timeObj.timeS, timeObj.timeE]); + } + } + + /** + * 查询佣金统计 + */ + countAccount() { + this.searchForm.value.userId = this.userId; + // 佣金情况 + this.spreadUserService.getAccount(this.searchForm.value,(data: any) => { + if (data['return_code'] == '000000'){ + this.countData = data['return_data']; + } + }) + } + /** + * 获取数据 + */ + queryData() { + if (this.searchForm.controls['createTimeArray'].value != null + && this.searchForm.controls['createTimeArray'].value.length > 0) { + this.searchForm.controls['createTimeS'].setValue(new Date(this.searchForm.controls['createTimeArray'].value[0]).getTime()); + this.searchForm.controls['createTimeE'].setValue(new Date(this.searchForm.controls['createTimeArray'].value[1]).getTime()); + } else { + this.searchForm.controls['createTimeS'].setValue(null); + this.searchForm.controls['createTimeE'].setValue(null); + } + this.searchForm.value.userId = this.userId; + this.searchForm.value.pageNum = this.tablePageNum; + this.searchForm.value.pageSize = this.tablePageSize; + this.searchForm.value.time = new Date().getTime(); + this.spreadUserService.getRecordList(this.searchForm.value, (data: any) => { + if (data['return_code'] == '000000') { + this.tableData = data['return_data']; + } + }); + } + + /** + * 搜索表单提交 + */ + searchFormSubmit(): void { + this.queryData(); + this.countAccount(); + } + + /** + * 搜索表单重置 + */ + searchFormReset(): void { + this.searchForm.reset(); + } + +} diff --git a/src/app/pages/spread/spread-user-list/spread-user-list.component.html b/src/app/pages/spread/spread-user-list/spread-user-list.component.html new file mode 100644 index 0000000..f25e461 --- /dev/null +++ b/src/app/pages/spread/spread-user-list/spread-user-list.component.html @@ -0,0 +1,140 @@ + + + + 充值 + + + + + + + + + + + +
+
+
+ + 用户手机号 + + + + +
+
+ + + + + + +
+
+
+ + + + + 用户手机号 + 用户名 + 佣金余额 + 已提现 + 推广人数 + 状态 + 成为时间 + 操作 + + + + + {{data.phone}} + {{data.userName}} + ¥{{data.amount}} + ¥{{data.cashOutAmount}} + {{data.spreadCount}} + {{data.status | spreadUserStatus}} + {{data.createTime | date : 'yyyy-MM-dd HH:mm:ss'}} + + + 操作列表 + + + + + + + + + 总计 {{ total }} 条 + + + + +
+ + 金额 + + + + +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/src/app/pages/spread/spread-user-list/spread-user-list.component.less b/src/app/pages/spread/spread-user-list/spread-user-list.component.less new file mode 100644 index 0000000..90447c4 --- /dev/null +++ b/src/app/pages/spread/spread-user-list/spread-user-list.component.less @@ -0,0 +1,3 @@ +nz-input-number { + width: 100%; +} diff --git a/src/app/pages/spread/spread-user-list/spread-user-list.component.ts b/src/app/pages/spread/spread-user-list/spread-user-list.component.ts new file mode 100644 index 0000000..a51d808 --- /dev/null +++ b/src/app/pages/spread/spread-user-list/spread-user-list.component.ts @@ -0,0 +1,276 @@ +import { Component } from '@angular/core'; +import {FormGroup, FormsModule, NonNullableFormBuilder, ReactiveFormsModule, Validators} from "@angular/forms"; +import {DictionaryPipe} from "../../../pipes/common/dictionary.pipe"; +import {NzMessageService} from "ng-zorro-antd/message"; +import {BrowserStorageService} from "../../../utils/localStorage.service" +import {CommonService} from "../../../services/common/common.service"; +import {NzModalModule, NzModalService} from "ng-zorro-antd/modal"; +import {DatePipe, NgForOf, NgIf} from "@angular/common"; +import {NzButtonComponent} from "ng-zorro-antd/button"; +import { + NzCellFixedDirective, + NzTableCellDirective, + NzTableComponent, NzTableModule, + NzTbodyComponent, NzTheadComponent, + NzThMeasureDirective, NzTrDirective +} from "ng-zorro-antd/table"; +import {NzColDirective, NzRowDirective} from "ng-zorro-antd/grid"; +import {NzDividerComponent} from "ng-zorro-antd/divider"; +import {NzDropDownADirective, NzDropDownDirective, NzDropdownMenuComponent} from "ng-zorro-antd/dropdown"; +import {NzFormControlComponent, NzFormDirective, NzFormItemComponent, NzFormLabelComponent} from "ng-zorro-antd/form"; +import {NzIconDirective} from "ng-zorro-antd/icon"; +import {NzInputDirective} from "ng-zorro-antd/input"; +import {NzMenuDirective, NzMenuItemComponent} from "ng-zorro-antd/menu"; +import {NzOptionComponent, NzSelectComponent} from "ng-zorro-antd/select"; +import {NzFlexDirective} from "ng-zorro-antd/flex"; +import {NzDescriptionsModule} from "ng-zorro-antd/descriptions"; +import {NzUploadComponent} from "ng-zorro-antd/upload"; +import {NzAvatarModule} from "ng-zorro-antd/avatar"; +import {NzImageModule} from "ng-zorro-antd/image"; +import {NzSwitchComponent} from "ng-zorro-antd/switch"; +import {NzDatePickerComponent} from "ng-zorro-antd/date-picker"; +import {NzInputNumberModule} from "ng-zorro-antd/input-number"; +import {WeekPipe} from "../../../pipes/common/week.pipe"; +import {SpreadUserService} from "../../../services/spread/spread-user.service"; +import {SpreadUserStatusPipe} from "../../../pipes/spread/spread-user-status.pipe"; +import {NzStatisticModule} from "ng-zorro-antd/statistic"; +import {SpreadUserAccountRecordComponent} from "../spread-user-account-record/spread-user-account-record.component"; +import {SpreadCommissionComponent} from "../spread-commission/spread-commission.component"; + +@Component({ + selector: 'app-spread-user-list', + standalone: true, + imports: [ + DatePipe, + DictionaryPipe, + FormsModule, + NgForOf, + NgIf, + NzButtonComponent, + NzCellFixedDirective, + NzColDirective, + NzDividerComponent, + NzDropDownADirective, + NzDropDownDirective, + NzDropdownMenuComponent, + NzFormControlComponent, + NzFormDirective, + NzFormItemComponent, + NzFormLabelComponent, + NzIconDirective, + NzInputDirective, + NzMenuDirective, + NzMenuItemComponent, + NzOptionComponent, + NzRowDirective, + NzSelectComponent, + NzTableCellDirective, + NzTableComponent, + NzTbodyComponent, + NzThMeasureDirective, + NzTheadComponent, + NzTrDirective, + ReactiveFormsModule, + NzTableModule, + NzModalModule, + NzFlexDirective, + NzDescriptionsModule, + NzUploadComponent, + NzAvatarModule, + NzImageModule, + NzSwitchComponent, + NzDatePickerComponent, + NzInputNumberModule, + WeekPipe, + SpreadUserStatusPipe, + NzStatisticModule, + SpreadCommissionComponent, + SpreadUserAccountRecordComponent, + ], + templateUrl: './spread-user-list.component.html', + styleUrl: './spread-user-list.component.less' +}) +export class SpreadUserListComponent { + // 表单页数 + tablePageNum = 1; + // 每页数量 + tablePageSize = 10; + // 表单数据 + tableData: any = []; + // 搜索表单 + searchForm: FormGroup; + + countDataObj: any = { + totalAmount: 0, + sysSperadAmount: 0, + cashOutAmount: 0, + surplusAmount: 0, + }; + + rechargeModal = false; + rechargeForm: FormGroup; + + commissionModal = false; + userId = null; + + settleModal = false; + constructor(private fb: NonNullableFormBuilder, + private message: NzMessageService, + private storage: BrowserStorageService, + private spreadUserService: SpreadUserService, + private commonService: CommonService, + private modal: NzModalService) { + // 初始化搜索框 + this.searchForm = this.fb.group({ + phone: [null], + }); + this.rechargeForm = this.fb.group({ + amount: ['',[Validators.required]], + }); + + this.queryCountCommission(); + // 查询数据 + this.queryData(); + } + + /** + * 查询佣金统计 + */ + queryCountCommission() { + // 佣金情况 + this.spreadUserService.countCommission((data: any) => { + if (data['return_code'] == '000000'){ + this.countDataObj = data['return_data']; + } + }) + } + /** + * 获取数据 + */ + queryData() { + this.searchForm.value.pageNum = this.tablePageNum; + this.searchForm.value.pageSize = this.tablePageSize; + this.searchForm.value.time = new Date().getTime(); + this.spreadUserService.getUserSpreadList(this.searchForm.value, (data: any) => { + if (data['return_code'] == '000000') { + this.tableData = data['return_data']; + } + }); + } + + /** + * 搜索表单提交 + */ + searchFormSubmit(): void { + this.queryData(); + } + + /** + * 搜索表单重置 + */ + searchFormReset(): void { + this.searchForm.reset(); + } + + /** + * 展示模态框 + */ + showRechargeModal() { + this.rechargeModal = true; + } + + /** + * 提交模态框 + */ + submitRechargeModal() { + if (this.rechargeForm.valid) { + this.spreadUserService.recharge(this.rechargeForm.value, (data: any) => { + if (data['return_code'] == '000000') { + this.message.create('success', '操作成功'); + // 刷新数据 + this.queryCountCommission(); + // 关闭弹窗 + this.closeRechargeModal(); + // 表单重置 + this.rechargeForm.reset(); + } else { + this.message.create('error', data['return_msg']); + } + }); + } else { + Object.values(this.rechargeForm.controls).forEach(control => { + if (control.invalid) { + control.markAsDirty(); + control.updateValueAndValidity({ onlySelf: true }); + } + }); + } + } + + /** + * 关闭模态框 + */ + closeRechargeModal() { + this.rechargeModal = false; + } + + /** + * 冻结账户 + * @param id + */ + freezeUserSpread(id: number) { + this.modal.confirm({ + nzTitle: '提示', + nzContent: '确定冻结用户推广账户吗?', + nzOnOk: () => + this.spreadUserService.freezeUserSpread({userId: id}, (data: any) => { + if (data['return_code'] == '000000') { + // 刷新数据 + this.queryData(); + this.message.create('success', '操作成功'); + } else { + this.message.create('error', data['return_msg']); + } + }) + }); + } + + /** + * 恢复账户 + * @param id + */ + unfreezeUserSpread(id: number) { + this.modal.confirm({ + nzTitle: '提示', + nzContent: '确定恢复用户推广账户状态吗?', + nzOnOk: () => + this.spreadUserService.unfreezeUserSpread({userId: id}, (data: any) => { + if (data['return_code'] == '000000') { + // 刷新数据 + this.queryData(); + this.message.create('success', '操作成功'); + } else { + this.message.create('error', data['return_msg']); + } + }) + }); + } + + /** + * 打开佣金明细 + * @param userId + */ + showCommission(userId: any) { + this.userId = userId; + this.commissionModal = true; + } + + /** + * 打款结算明细 + * @param userId + */ + showSettle(userId: any) { + this.userId = userId; + this.settleModal = true; + } +} diff --git a/src/app/pages/spread/spread.module.ts b/src/app/pages/spread/spread.module.ts new file mode 100644 index 0000000..4bbf2f1 --- /dev/null +++ b/src/app/pages/spread/spread.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + + + +@NgModule({ + declarations: [], + imports: [ + CommonModule + ] +}) +export class SpreadModule { } diff --git a/src/app/pages/spread/spread.routes.ts b/src/app/pages/spread/spread.routes.ts new file mode 100644 index 0000000..15dc7bf --- /dev/null +++ b/src/app/pages/spread/spread.routes.ts @@ -0,0 +1,12 @@ +import { Routes } from '@angular/router'; +import {SpreadUserListComponent} from "./spread-user-list/spread-user-list.component"; +import {SpreadChannelConfigComponent} from "./spread-channel-config/spread-channel-config.component"; +import {SpreadUserAccountRecordComponent} from "./spread-user-account-record/spread-user-account-record.component"; +import {SpreadCommissionComponent} from "./spread-commission/spread-commission.component"; + + +export const SPREAD_ROUTES: Routes = [ + { path : 'user-list', component: SpreadUserListComponent }, + { path : 'user-commission', component: SpreadCommissionComponent }, + { path : 'channel-config', component: SpreadChannelConfigComponent }, +]; diff --git a/src/app/pipes/spread/spread-user-status.pipe.ts b/src/app/pipes/spread/spread-user-status.pipe.ts new file mode 100644 index 0000000..f61cea8 --- /dev/null +++ b/src/app/pipes/spread/spread-user-status.pipe.ts @@ -0,0 +1,20 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'spreadUserStatus', + standalone: true +}) +export class SpreadUserStatusPipe implements PipeTransform { + + transform(value: number): any { + switch (value) { + case 1: + return '正常'; + case 2: + return '冻结'; + default: + return '未知状态' + } + } + +} diff --git a/src/app/services/spread/spread-oil-channel.service.ts b/src/app/services/spread/spread-oil-channel.service.ts new file mode 100644 index 0000000..1c3431d --- /dev/null +++ b/src/app/services/spread/spread-oil-channel.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@angular/core'; +import {HttpClient} from "@angular/common/http"; +import {environment} from "../../../environments/environment"; +import {ObjectData} from "../../utils/objectData.service"; + +@Injectable({ + providedIn: 'root' +}) +export class SpreadOilChannelService { + + constructor(private http: HttpClient) { } + + /** + * 编辑 + * @param params + * @param callBack + */ + public editOilChannel(params: any, callBack:any) { + params.time = new Date().getTime(); + this.http.post(environment.baseUrl + 'userSpread/editOilChannel', params).subscribe(data => { + callBack(data); + }); + } + + /** + * 查询列表 + * @param params + * @param callBack + */ + public getOilChannelList(params: any, callBack:any) { + this.http.get(environment.baseUrl + 'userSpread/getOilChannelList?'+ObjectData.objectByString(params)).subscribe(data => { + callBack(data); + }); + } +} diff --git a/src/app/services/spread/spread-user.service.ts b/src/app/services/spread/spread-user.service.ts new file mode 100644 index 0000000..fafb89f --- /dev/null +++ b/src/app/services/spread/spread-user.service.ts @@ -0,0 +1,118 @@ +import { Injectable } from '@angular/core'; +import {HttpClient} from "@angular/common/http"; +import {environment} from "../../../environments/environment"; +import {ObjectData} from "../../utils/objectData.service"; + +@Injectable({ + providedIn: 'root' +}) +export class SpreadUserService { + + constructor(private http: HttpClient) { } + + /** + * 冻结用户推广功能 + * @param params + * @param callBack + */ + public freezeUserSpread(params: any, callBack:any) { + params.time = new Date().getTime(); + this.http.post(environment.baseUrl + 'userSpread/freezeUserSpread', params).subscribe(data => { + callBack(data); + }); + } + + /** + * 解冻用户推广功能 + * @param params + * @param callBack + */ + public unfreezeUserSpread(params: any, callBack:any) { + params.time = new Date().getTime(); + this.http.post(environment.baseUrl + 'userSpread/unfreezeUserSpread', params).subscribe(data => { + callBack(data); + }); + } + + /** + * 充值佣金 + * @param params + * @param callBack + */ + public recharge(params: any, callBack:any) { + params.time = new Date().getTime(); + this.http.post(environment.baseUrl + 'userSpread/recharge', params).subscribe(data => { + callBack(data); + }); + } + + /** + * 推广用户列表 + * @param params + * @param callBack + */ + public getUserSpreadList(params: any, callBack:any) { + this.http.get(environment.baseUrl + 'userSpread/getUserSpreadList?'+ObjectData.objectByString(params)).subscribe(data => { + callBack(data); + }); + } + + /** + * 用户账户记录列表 + * @param params + * @param callBack + */ + public getRecordList(params: any, callBack:any) { + this.http.get(environment.baseUrl + 'userSpread/getRecordList?'+ObjectData.objectByString(params)).subscribe(data => { + callBack(data); + }); + } + /** + * 查询推广订单 + * @param params + * @param callBack + */ + public queryOilOrderSpread(params: any, callBack:any) { + this.http.get(environment.baseUrl + 'userSpread/queryOilOrderSpread?'+ObjectData.objectByString(params)).subscribe(data => { + callBack(data); + }); + } + + /** + * 统计用户账户记录佣金 + * @param params + * @param callBack + */ + public countAccount(params: any, callBack:any) { + params.t = new Date().getTime() + this.http.get(environment.baseUrl + 'userSpread/countAccount?'+ObjectData.objectByString(params)).subscribe(data => { + callBack(data); + }); + } + + + /** + * 用户账户详情 + * @param params + * @param callBack + */ + public getAccount(params: any, callBack:any) { + params.t = new Date().getTime() + this.http.get(environment.baseUrl + 'userSpread/getAccount?'+ObjectData.objectByString(params)).subscribe(data => { + callBack(data); + }); + } + + /** + * 统计佣金情况 + * @param callBack + */ + public countCommission(callBack:any) { + const params = { + t: new Date().getTime() + }; + this.http.get(environment.baseUrl + 'userSpread/countCommission?'+ObjectData.objectByString(params)).subscribe(data => { + callBack(data); + }); + } +} diff --git a/src/environments/environment.ts b/src/environments/environment.ts index e4e132f..78d8ba9 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -5,7 +5,7 @@ export const environment = { production: false, baseUrl: 'https://oil.dctpay.com/brest/', // 测试环境服务器地址(请求数据地址) - imageUrl: 'https://oil.dctpay.com/filesystem/', + imageUrl: 'https://test-oil.dctpay.com/filesystem/', }; /*