| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- import { Component, OnInit, signal } from '@angular/core';
- import { CommonModule } from '@angular/common';
- import { FormsModule } from '@angular/forms';
- import { MatCardModule } from '@angular/material/card';
- import { MatButtonModule } from '@angular/material/button';
- import { MatIconModule } from '@angular/material/icon';
- import { MatExpansionModule } from '@angular/material/expansion';
- import { MatSelectModule } from '@angular/material/select';
- import { MatInputModule } from '@angular/material/input';
- import { MatCheckboxModule } from '@angular/material/checkbox';
- import { MatSlideToggleModule } from '@angular/material/slide-toggle';
- import { MatDialogModule, MatDialog } from '@angular/material/dialog';
- import { AutoSettlementService, AutoSettlementRule, SettlementCondition, SettlementAction } from '../../../services/auto-settlement.service';
- @Component({
- selector: 'app-auto-settlement-config',
- standalone: true,
- imports: [
- CommonModule,
- FormsModule,
- MatCardModule,
- MatButtonModule,
- MatIconModule,
- MatExpansionModule,
- MatSelectModule,
- MatInputModule,
- MatCheckboxModule,
- MatSlideToggleModule,
- MatDialogModule
- ],
- templateUrl: './auto-settlement-config.html',
- styleUrls: ['./auto-settlement-config.scss']
- })
- export class AutoSettlementConfigComponent implements OnInit {
- rules = signal<AutoSettlementRule[]>([]);
- expandedPanels = signal<Set<string>>(new Set());
- isAddingNew = signal(false);
-
- // 条件类型选项
- conditionTypes = [
- { value: 'amountRange', label: '金额范围' },
- { value: 'overdueDays', label: '逾期天数' },
- { value: 'customerTier', label: '客户层级' },
- { value: 'projectType', label: '项目类型' },
- { value: 'paymentMethod', label: '支付方式' }
- ];
- // 操作符选项
- operators = [
- { value: 'equals', label: '等于' },
- { value: 'greaterThan', label: '大于' },
- { value: 'lessThan', label: '小于' },
- { value: 'between', label: '介于' },
- { value: 'contains', label: '包含' }
- ];
- // 动作类型选项
- actionTypes = [
- { value: 'sendReminder', label: '发送提醒' },
- { value: 'applyDiscount', label: '应用折扣' },
- { value: 'extendDueDate', label: '延长期限' },
- { value: 'autoConfirm', label: '自动确认' },
- { value: 'notifyManager', label: '通知经理' }
- ];
- // 新规则模板
- newRule: AutoSettlementRule = {
- id: '',
- name: '',
- enabled: true,
- priority: 5,
- conditions: [],
- actions: [],
- description: ''
- };
- constructor(private autoSettlementService: AutoSettlementService) {}
- ngOnInit() {
- this.loadRules();
- }
- // 加载规则
- loadRules() {
- this.autoSettlementService.getRules().subscribe(rules => {
- this.rules.set(rules);
- });
- }
- // 切换面板展开状态
- togglePanel(ruleId: string) {
- const panels = new Set(this.expandedPanels());
- if (panels.has(ruleId)) {
- panels.delete(ruleId);
- } else {
- panels.add(ruleId);
- }
- this.expandedPanels.set(panels);
- }
- // 添加新条件
- addCondition(rule: AutoSettlementRule) {
- const newCondition: SettlementCondition = {
- type: 'amountRange',
- operator: 'greaterThan',
- value: 0
- };
- rule.conditions.push(newCondition);
- }
- // 删除条件
- removeCondition(rule: AutoSettlementRule, index: number) {
- rule.conditions.splice(index, 1);
- }
- // 添加新动作
- addAction(rule: AutoSettlementRule) {
- const newAction: SettlementAction = {
- type: 'sendReminder',
- params: {}
- };
- rule.actions.push(newAction);
- }
- // 删除动作
- removeAction(rule: AutoSettlementRule, index: number) {
- rule.actions.splice(index, 1);
- }
- // 保存规则
- saveRule(rule: AutoSettlementRule) {
- if (rule.id) {
- this.autoSettlementService.updateRule(rule.id, rule);
- } else {
- rule.id = `rule-${Date.now()}`;
- this.autoSettlementService.addRule(rule);
- }
- this.cancelAddNew();
- }
- // 删除规则
- async deleteRule(ruleId: string): Promise<void> {
- const ok = await window?.fmode?.confirm('确定要删除这条规则吗?');
- if (ok) {
- this.autoSettlementService.deleteRule(ruleId);
- this.loadRules();
- }
- }
- // 启用/禁用规则
- toggleRule(rule: AutoSettlementRule) {
- rule.enabled = !rule.enabled;
- this.autoSettlementService.updateRule(rule.id, { enabled: rule.enabled });
- }
- // 开始添加新规则
- startAddNew() {
- this.isAddingNew.set(true);
- this.newRule = {
- id: '',
- name: '',
- enabled: true,
- priority: 5,
- conditions: [],
- actions: [],
- description: ''
- };
- }
- // 取消添加新规则
- cancelAddNew() {
- this.isAddingNew.set(false);
- }
- // 获取条件操作符选项
- getOperatorOptions(conditionType: string) {
- switch (conditionType) {
- case 'amountRange':
- case 'overdueDays':
- return this.operators.filter(op =>
- ['equals', 'greaterThan', 'lessThan', 'between'].includes(op.value)
- );
- case 'customerTier':
- case 'projectType':
- case 'paymentMethod':
- return this.operators.filter(op =>
- ['equals', 'contains'].includes(op.value)
- );
- default:
- return this.operators;
- }
- }
- // 获取动作参数配置
- getActionParamsConfig(actionType: string) {
- switch (actionType) {
- case 'sendReminder':
- return {
- channels: ['wechat', 'sms', 'email', 'system'],
- frequency: ['immediate', 'daily', 'weekly']
- };
- case 'applyDiscount':
- return {
- type: ['percentage', 'fixed'],
- maxAmount: 1000
- };
- case 'extendDueDate':
- return {
- days: 7
- };
- case 'autoConfirm':
- return {
- immediate: true
- };
- case 'notifyManager':
- return {
- threshold: 10000
- };
- default:
- return {};
- }
- }
- // 格式化条件显示
- formatCondition(condition: SettlementCondition): string {
- switch (condition.type) {
- case 'amountRange':
- return `金额 ${this.getOperatorLabel(condition.operator)} ${condition.value}`;
- case 'overdueDays':
- return `逾期天数 ${this.getOperatorLabel(condition.operator)} ${condition.value}`;
- case 'customerTier':
- return `客户层级 ${this.getOperatorLabel(condition.operator)} ${condition.value}`;
- default:
- return `${condition.type} ${condition.operator} ${condition.value}`;
- }
- }
- // 格式化动作显示
- formatAction(action: SettlementAction): string {
- switch (action.type) {
- case 'sendReminder':
- return '发送提醒';
- case 'applyDiscount':
- return '应用折扣';
- case 'extendDueDate':
- return '延长期限';
- case 'autoConfirm':
- return '自动确认';
- case 'notifyManager':
- return '通知经理';
- default:
- return action.type;
- }
- }
- // 获取操作符标签
- private getOperatorLabel(operator: string): string {
- const op = this.operators.find(o => o.value === operator);
- return op ? op.label : operator;
- }
- }
|