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