10 changed files with 342 additions and 18 deletions
@ -0,0 +1,180 @@ |
|||||
|
<?php |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | Niucloud-admin 企业快速开发的多应用管理平台 |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | 官方网址:https://www.niucloud.com |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | niucloud团队 版权所有 开源版本可自由商用 |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | Author: Niucloud Team |
||||
|
// +---------------------------------------------------------------------- |
||||
|
|
||||
|
namespace app\listener\custom; |
||||
|
|
||||
|
use app\model\performance_records\PerformanceRecords; |
||||
|
use app\model\course\Course; |
||||
|
use app\model\personnel\Personnel; |
||||
|
use app\model\student\Student; |
||||
|
|
||||
|
/** |
||||
|
* 计算教练业绩事件 |
||||
|
* Class CoachPerformanceListener |
||||
|
* @package app\listener\custom |
||||
|
*/ |
||||
|
class CoachPerformanceListener |
||||
|
{ |
||||
|
/** |
||||
|
* 处理教练业绩计算 |
||||
|
* @param array $params |
||||
|
* $params['course_id'] 课程ID |
||||
|
* $params['coach_id'] 教练ID |
||||
|
* $params['student_id'] 学员ID |
||||
|
* $params['performance_type'] 业绩类型,可选值:'course'=课程授课,'private'=私教,'assessment'=考核评估 |
||||
|
*/ |
||||
|
public function handle(array $params) |
||||
|
{ |
||||
|
// 检查必要参数 |
||||
|
if (empty($params['course_id']) || empty($params['coach_id'])) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
// 获取课程信息 |
||||
|
$courseInfo = (new Course())->find($params['course_id']); |
||||
|
if (empty($courseInfo)) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
// 检查教练是否存在 |
||||
|
$personnel = (new Personnel())->find($params['coach_id']); |
||||
|
if (empty($personnel)) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
// 业绩类型,默认为课程授课 |
||||
|
$performanceType = $params['performance_type'] ?? 'course'; |
||||
|
|
||||
|
// 计算业绩值 |
||||
|
$performanceValue = $this->calculatePerformanceValue($courseInfo, $performanceType, $params); |
||||
|
|
||||
|
// 记录业绩 |
||||
|
return $this->recordPerformance([ |
||||
|
'staff_id' => $params['coach_id'], |
||||
|
'course_id' => $params['course_id'], |
||||
|
'student_id' => $params['student_id'] ?? 0, |
||||
|
'performance_type' => $performanceType, |
||||
|
'performance_value' => $performanceValue, |
||||
|
'remarks' => '系统自动计算教练业绩', |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 计算业绩值 |
||||
|
* @param object $courseInfo 课程信息 |
||||
|
* @param string $performanceType 业绩类型 |
||||
|
* @param array $params 额外参数 |
||||
|
* @return float 业绩值 |
||||
|
*/ |
||||
|
protected function calculatePerformanceValue($courseInfo, $performanceType, $params) |
||||
|
{ |
||||
|
$value = 0; |
||||
|
|
||||
|
// 获取课程时长(小时) |
||||
|
$courseDuration = floatval($courseInfo['duration'] ?? 1); |
||||
|
|
||||
|
// 根据业绩类型计算业绩值 |
||||
|
switch ($performanceType) { |
||||
|
case 'course': |
||||
|
// 普通课程授课业绩,按照课时和课程基础系数计算 |
||||
|
$baseRate = 50; // 每小时基本业绩值 |
||||
|
$value = $courseDuration * $baseRate; |
||||
|
|
||||
|
// 如果有学员参数,增加学员数量系数 |
||||
|
if (!empty($params['student_count'])) { |
||||
|
$studentCount = intval($params['student_count']); |
||||
|
// 每多一名学员,业绩系数增加5% |
||||
|
$studentFactor = 1 + (($studentCount - 1) * 0.05); |
||||
|
$value = $value * $studentFactor; |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case 'private': |
||||
|
// 私教课程业绩,私教课程通常有更高的业绩系数 |
||||
|
$privateRate = 150; // 每小时私教业绩值 |
||||
|
$value = $courseDuration * $privateRate; |
||||
|
|
||||
|
// 检查学员等级,高级别学员可以提高业绩 |
||||
|
if (!empty($params['student_id'])) { |
||||
|
$student = (new Student())->find($params['student_id']); |
||||
|
if (!empty($student) && !empty($student['level'])) { |
||||
|
// 根据学员等级增加业绩系数 |
||||
|
$levelFactor = 1 + (intval($student['level']) * 0.1); |
||||
|
$value = $value * $levelFactor; |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case 'assessment': |
||||
|
// 考核评估业绩,固定业绩值加上考核难度系数 |
||||
|
$assessmentBaseValue = 100; // 基础考核业绩值 |
||||
|
$difficultyLevel = intval($params['difficulty_level'] ?? 1); // 难度等级1-5 |
||||
|
$value = $assessmentBaseValue * $difficultyLevel; |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
// 默认按课时计算 |
||||
|
$value = $courseDuration * 50; |
||||
|
} |
||||
|
|
||||
|
return $value; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 记录业绩 |
||||
|
* @param array $data 业绩数据 |
||||
|
* @return bool |
||||
|
*/ |
||||
|
protected function recordPerformance(array $data) |
||||
|
{ |
||||
|
// 准备记录数据 |
||||
|
$recordData = [ |
||||
|
'staff_id' => $data['staff_id'], |
||||
|
'performance_type' => $data['performance_type'], |
||||
|
'performance_value' => $data['performance_value'], |
||||
|
'remarks' => $data['remarks'] |
||||
|
]; |
||||
|
|
||||
|
// 如果有课程ID,记录到扩展字段 |
||||
|
if (!empty($data['course_id'])) { |
||||
|
$recordData['extend_id'] = $data['course_id']; |
||||
|
$recordData['extend_type'] = 'course'; |
||||
|
} |
||||
|
|
||||
|
// 如果有学员ID,记录到相关字段 |
||||
|
if (!empty($data['student_id'])) { |
||||
|
$recordData['resource_id'] = $data['student_id']; |
||||
|
} |
||||
|
|
||||
|
// 查询是否已存在该课程的业绩记录 |
||||
|
$exists = (new PerformanceRecords())->where([ |
||||
|
['extend_id', '=', $data['course_id'] ?? 0], |
||||
|
['staff_id', '=', $data['staff_id']], |
||||
|
['performance_type', '=', $data['performance_type']] |
||||
|
])->find(); |
||||
|
|
||||
|
if ($exists) { |
||||
|
// 更新已有记录 |
||||
|
return (new PerformanceRecords())->where('id', $exists['id'])->update([ |
||||
|
'performance_value' => $data['performance_value'], |
||||
|
'remarks' => $data['remarks'], |
||||
|
'updated_at' => date('Y-m-d H:i:s') |
||||
|
]); |
||||
|
} else { |
||||
|
// 创建新记录 |
||||
|
$recordData['created_at'] = date('Y-m-d H:i:s'); |
||||
|
$recordData['updated_at'] = date('Y-m-d H:i:s'); |
||||
|
$model = new PerformanceRecords(); |
||||
|
$result = $model->create($recordData); |
||||
|
return !empty($result->id); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,125 @@ |
|||||
|
<?php |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | Niucloud-admin 企业快速开发的多应用管理平台 |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | 官方网址:https://www.niucloud.com |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | niucloud团队 版权所有 开源版本可自由商用 |
||||
|
// +---------------------------------------------------------------------- |
||||
|
// | Author: Niucloud Team |
||||
|
// +---------------------------------------------------------------------- |
||||
|
|
||||
|
namespace app\listener\custom; |
||||
|
|
||||
|
use app\model\performance_records\PerformanceRecords; |
||||
|
use app\model\order_table\OrderTable; |
||||
|
use app\model\personnel\Personnel; |
||||
|
|
||||
|
/** |
||||
|
* 计算销售人员业绩事件 |
||||
|
* Class SalesPerformanceListener |
||||
|
* @package app\listener\custom |
||||
|
*/ |
||||
|
class SalesPerformanceListener |
||||
|
{ |
||||
|
/** |
||||
|
* 处理销售业绩计算 |
||||
|
* @param array $params |
||||
|
* $params['order_id'] 订单ID |
||||
|
* $params['staff_id'] 销售人员ID |
||||
|
* $params['performance_type'] 业绩类型,可选值:'sales'=销售,'commission'=佣金 |
||||
|
*/ |
||||
|
public function handle(array $params) |
||||
|
{ |
||||
|
// 检查必要参数 |
||||
|
if (empty($params['order_id']) || empty($params['staff_id'])) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
// 获取订单信息 |
||||
|
$orderInfo = (new OrderTable())->find($params['order_id']); |
||||
|
if (empty($orderInfo)) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
// 检查销售人员是否存在 |
||||
|
$personnel = (new Personnel())->find($params['staff_id']); |
||||
|
if (empty($personnel)) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
// 业绩类型,默认为销售 |
||||
|
$performanceType = $params['performance_type'] ?? 'sales'; |
||||
|
|
||||
|
// 计算业绩值 |
||||
|
$performanceValue = $this->calculatePerformanceValue($orderInfo, $performanceType); |
||||
|
|
||||
|
// 记录业绩 |
||||
|
return $this->recordPerformance([ |
||||
|
'staff_id' => $params['staff_id'], |
||||
|
'order_id' => $params['order_id'], |
||||
|
'resource_id' => $orderInfo['resource_id'] ?? 0, |
||||
|
'order_status' => $orderInfo['status'], |
||||
|
'performance_type' => $performanceType, |
||||
|
'performance_value' => $performanceValue, |
||||
|
'remarks' => '系统自动计算销售业绩', |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 计算业绩值 |
||||
|
* @param object $orderInfo 订单信息 |
||||
|
* @param string $performanceType 业绩类型 |
||||
|
* @return float 业绩值 |
||||
|
*/ |
||||
|
protected function calculatePerformanceValue($orderInfo, $performanceType) |
||||
|
{ |
||||
|
$value = 0; |
||||
|
|
||||
|
// 根据订单金额和业绩类型计算业绩值 |
||||
|
$orderAmount = floatval($orderInfo['total_amount'] ?? 0); |
||||
|
|
||||
|
if ($performanceType == 'sales') { |
||||
|
// 销售业绩直接等于订单金额 |
||||
|
$value = $orderAmount; |
||||
|
} elseif ($performanceType == 'commission') { |
||||
|
// 佣金业绩,假设为订单金额的10% |
||||
|
$commissionRate = 0.1; // 佣金比例,可以从配置中获取 |
||||
|
$value = $orderAmount * $commissionRate; |
||||
|
} |
||||
|
|
||||
|
return $value; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 记录业绩 |
||||
|
* @param array $data 业绩数据 |
||||
|
* @return bool |
||||
|
*/ |
||||
|
protected function recordPerformance(array $data) |
||||
|
{ |
||||
|
// 查询是否已存在该订单的业绩记录 |
||||
|
$exists = (new PerformanceRecords())->where([ |
||||
|
['order_id', '=', $data['order_id']], |
||||
|
['staff_id', '=', $data['staff_id']], |
||||
|
['performance_type', '=', $data['performance_type']] |
||||
|
])->find(); |
||||
|
|
||||
|
if ($exists) { |
||||
|
// 更新已有记录 |
||||
|
return (new PerformanceRecords())->where('id', $exists['id'])->update([ |
||||
|
'performance_value' => $data['performance_value'], |
||||
|
'order_status' => $data['order_status'], |
||||
|
'remarks' => $data['remarks'], |
||||
|
'updated_at' => date('Y-m-d H:i:s') |
||||
|
]); |
||||
|
} else { |
||||
|
// 创建新记录 |
||||
|
$data['created_at'] = date('Y-m-d H:i:s'); |
||||
|
$data['updated_at'] = date('Y-m-d H:i:s'); |
||||
|
$model = new PerformanceRecords(); |
||||
|
$result = $model->create($data); |
||||
|
return !empty($result->id); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue