TaskSystem/app/common/logic/task/TaskLogic.php

509 lines
21 KiB
PHP
Raw Normal View History

2023-08-05 16:14:43 +08:00
<?php
// +----------------------------------------------------------------------
// | likeadmin快速开发前后端分离管理后台PHP版
// +----------------------------------------------------------------------
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
// | 开源版本可自由商用可去除界面版权logo
// | gitee下载https://gitee.com/likeshop_gitee/likeadmin
// | github下载https://github.com/likeshop-github/likeadmin
// | 访问官网https://www.likeadmin.cn
// | likeadmin团队 版权所有 拥有最终解释权
// +----------------------------------------------------------------------
// | author: likeadminTeam
// +----------------------------------------------------------------------
namespace app\common\logic\task;
2023-09-21 14:12:55 +08:00
use app\common\logic\finance\TownShareProfit;
use app\common\model\dict\DictData;
2023-08-05 16:14:43 +08:00
use app\common\model\task\Task;
use app\common\logic\BaseLogic;
2023-08-30 17:34:51 +08:00
use app\common\model\Company;
2023-08-05 16:14:43 +08:00
use app\common\model\informationg\UserInformationg;
2023-08-10 17:10:12 +08:00
use app\common\model\task_scheduling_plan\TaskSchedulingPlan;
2023-08-16 11:13:31 +08:00
use app\common\model\task_template\TaskTemplate;
2023-08-18 16:32:41 +08:00
use app\common\model\user\User;
2023-08-05 16:14:43 +08:00
use think\facade\Db;
2023-08-10 17:10:12 +08:00
use think\facade\Log;
2023-08-05 16:14:43 +08:00
/**
* 任务逻辑
* Class TaskLogic
* @package app\adminapi\logic\task
*/
class TaskLogic extends BaseLogic
{
/**
* @notes 添加任务
* @param array $params
* @return bool
* @author likeadmin
* @date 2023/08/05 13:39
*/
public static function add(array $params): bool
{
Db::startTrans();
try {
Task::create([
'title' => $params['title'],
'template_id' => $params['template_id'],
'company_id' => $params['company_id'],
// 'admin_id' => $params['admin_id'],
'start_time' => strtotime($params['start_time']),
2023-08-10 17:10:12 +08:00
'end_time' => strtotime($params['end_time']),
2023-08-05 16:14:43 +08:00
'director_uid' => $params['director_uid'],
'type' => $params['type'],
'status' => $params['status'],
'content' => $params['content'],
2023-08-10 17:10:12 +08:00
'extend' => json_encode($params['extend'])
2023-08-05 16:14:43 +08:00
]);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
self::setError($e->getMessage());
return false;
}
}
2023-08-10 17:10:12 +08:00
/**
* 定时添加任务
*/
2023-08-29 16:40:03 +08:00
public static function CronAdd(array $v, $datas): bool
2023-08-10 10:29:57 +08:00
{
2023-08-18 16:32:41 +08:00
try {
2023-09-05 16:34:14 +08:00
if ($v['types'] == 3) {
$task = Task::where('template_id', $v['id'])->find();
if ($task) {
// Task::where('template_id', $v['id'])->update(['start_time' => strtotime($task['start_time']) + 86400, 'end_time' => strtotime($task['end_time']) + 86400]);
// TaskTemplate::where('id', $v['id'])->inc('day_count')->update();
return true;
}
2023-09-01 10:40:01 +08:00
}
2023-09-13 13:09:53 +08:00
$v_day_count=$v['day_count'];
$v_day_count=$v_day_count+1;
2023-08-29 16:40:03 +08:00
$time = strtotime(date('Y-m-d'));
$TaskSchedulingPlan_data = [
2023-08-18 16:32:41 +08:00
'create_user_id' => 0,
'company_id' => $v['company_id'],
'template_id' => $v['id'],
'scheduling_id' => $v['task_scheduling'],
'start_time' => $time,
2023-08-29 16:40:03 +08:00
'end_time' => $time + 86399,
'sn' => User::createUserSn(),
2023-08-18 16:32:41 +08:00
'status' => 1
2023-08-28 18:46:43 +08:00
];
2023-08-29 16:40:03 +08:00
$TaskSchedulingPlan = TaskSchedulingPlan::create($TaskSchedulingPlan_data);
2023-08-18 16:32:41 +08:00
$arr = [
'template_id' => $v['id'],
'scheduling_plan_id' => $TaskSchedulingPlan['id'],
'company_id' => $v['company_id'],
'title' => $v['title'],
'money' => $v['money'],
'type' => $v['type'],
'content' => $v['content'],
'start_time' => $time,
2023-08-29 16:40:03 +08:00
'end_time' => $time + 86399,
2023-08-18 16:32:41 +08:00
'create_time' => time(),
'update_time' => time(),
];
$data = $arr;
2023-08-29 16:40:03 +08:00
$data['money'] = self::task_money($v, $datas);
2023-08-18 17:29:51 +08:00
$data['extend'] = json_encode($v['extend']);
2023-08-28 09:31:13 +08:00
//信息更新
2023-08-18 16:32:41 +08:00
if ($v['type'] == 31) {
2023-08-29 16:40:03 +08:00
$finds = TaskTemplate::where('id', $v['id'])->field('information_count,information_day_count')->find();
$update = 0;
if ($finds['information_count'] > $finds['information_day_count']) {
$day_count = $finds['information_count'] - $finds['information_day_count'];
if ($day_count >= 5) {
$update = 5;
} else {
$update = $day_count;
2023-08-28 09:31:13 +08:00
}
}
$data["extend"] = json_encode(['informationg' => ['count' => 5, 'update' => $update]]);
2023-08-18 16:32:41 +08:00
TaskTemplate::where('id', $v['id'])->inc('information_day_count', 5)->update();
}
if ($v['type'] == 32) {
2023-08-28 09:31:13 +08:00
$data['director_uid'] = $datas['company_info']['user_id'];
2023-08-10 17:10:12 +08:00
}
2023-08-29 16:40:03 +08:00
//入股任务
if ($v['type'] == 35) {
2023-08-30 17:34:51 +08:00
$responsible_area = Company::where('id', $v['company_id'])->value('responsible_area');
2023-08-31 17:19:51 +08:00
if ($responsible_area) {
$responsible_area = explode(',', $responsible_area);
} else {
Log::error('定时任务添加失败:没有区域' . json_encode($v));
2023-08-30 17:34:51 +08:00
return false;
}
2023-08-29 23:05:08 +08:00
if (isset($v['extend']['shareholder'])) {
$shareholder_user = User::where('id', $v['extend']['shareholder']['user_id'])->field('id,nickname,brigade')->find();
$v['extend']['shareholder']['money'] = $v['recharge'];
$v['extend']['shareholder']['over_decimal'] = $v['over_decimal'];
2023-08-30 17:34:51 +08:00
foreach ($responsible_area as $kkk => $vvv) {
2023-08-31 17:19:51 +08:00
$v['extend']['shareholder']['user_list'][$kkk] = ['info' => $shareholder_user['nickname'] . '需缴纳' . $vvv . '队,股金:' . bcdiv($v['recharge'], count($responsible_area), 2), 'time' => $v['create_time']];
2023-08-29 16:40:03 +08:00
}
2023-08-29 23:05:08 +08:00
$data['director_uid'] = $v['extend']['shareholder']['user_id'];
}
$data['extend'] = json_encode($v['extend']);
2023-09-05 16:34:14 +08:00
$money_one = bcmul($v['stage_day_one'], $v['money'], 2);
$money_two = bcmul($v['stage_day_two'], $v['money_two'], 2);
$data['money'] = bcadd($money_one, $money_two);
2023-08-29 23:05:08 +08:00
}
//片区交易
if ($v['type'] == 33) {
//基础金额*(每日基户数*天数)//且户数小于公司总户数
$user_count = UserInformationg::where('company_id', $v['company_id'])->count();
//
2023-09-13 13:09:53 +08:00
if ($v_day_count == 0) {
2023-08-29 23:05:08 +08:00
$user_count_two = 5 * 1;
} else {
2023-09-13 13:09:53 +08:00
$user_count_two = 5 * $v_day_count;
2023-08-29 23:05:08 +08:00
}
if ($user_count_two > $user_count) {
$user_count_money = 58 * $user_count;
} else {
$user_count_money = 58 * $user_count_two;
}
2023-08-31 17:19:51 +08:00
$extend = [
2023-09-05 16:34:14 +08:00
'transaction' => ['arr' => ['day_money' => $user_count_money, 'total_price' => 0]]
2023-08-31 17:19:51 +08:00
];
$data['extend'] = json_encode($extend);
2023-08-29 16:40:03 +08:00
}
// 其他任务
if ($v['type'] == 34) {
// is_commit 是否提交 note 详情描述 annex 附件
$extend = [
'other'=> [
'is_commit' => 0,
'note' => '',
'annex' => [],
'video_annex' => [],
]
];
$data['extend'] = json_encode($extend);
}
2023-08-18 16:32:41 +08:00
$task_id = (new Task())->insertGetId($data);
TaskSchedulingPlan::where('id', $TaskSchedulingPlan['id'])->update(['task_id' => $task_id, 'is_execute' => 1]);
2023-08-29 17:13:44 +08:00
TaskTemplate::where('id', $v['id'])->inc('day_count')->update();
2023-08-18 16:32:41 +08:00
return true;
} catch (\Exception $e) {
Log::error('定时任务添加失败'.$e->getMessage().'。line'.$e->getLine());
2023-08-18 16:32:41 +08:00
return false;
2023-08-11 16:35:07 +08:00
}
2023-08-16 11:13:31 +08:00
}
//任务金额
2023-08-29 16:40:03 +08:00
private static function task_money($v, $datas)
2023-08-16 11:13:31 +08:00
{
2023-09-13 13:09:53 +08:00
$v_day_count=$v['day_count'];
$v_day_count=$v_day_count+1;
2023-08-18 16:32:41 +08:00
if ($v['types'] == 1 || $v['types'] == 3) {
2023-09-13 13:09:53 +08:00
if ($v_day_count <= $v['stage_day_one']) {
2023-08-18 16:32:41 +08:00
return $v['money'];
2023-08-16 11:13:31 +08:00
} else {
2023-08-18 16:32:41 +08:00
return $v['money_two'];
2023-08-16 11:13:31 +08:00
}
2023-08-18 16:32:41 +08:00
} elseif ($v['types'] == 2) {
2023-09-13 13:09:53 +08:00
if ($v_day_count<= $v['stage_day_one']) {
2023-08-18 16:32:41 +08:00
return $v['money'];
2023-09-13 13:09:53 +08:00
} elseif ($v_day_count <= $v['stage_day_two']) {
2023-08-18 16:32:41 +08:00
return $v['money_two'];
2023-08-16 11:13:31 +08:00
} else {
2023-08-18 16:32:41 +08:00
return $v['money_three'];
2023-08-16 11:13:31 +08:00
}
} else {
2023-09-13 13:09:53 +08:00
if ($v_day_count <= $v['stage_day_one']) {
2023-08-18 16:32:41 +08:00
$a = $v['money'];
2023-08-16 11:13:31 +08:00
} else {
2023-08-18 16:32:41 +08:00
$a = $v['money_two'];
2023-08-16 11:13:31 +08:00
}
2023-09-13 13:09:53 +08:00
if ($v_day_count >= $v['stage_day_two']) {
2023-08-18 16:32:41 +08:00
TaskTemplate::where('id', $v['id'])->update(['status' => 0]);
2023-08-16 11:13:31 +08:00
}
return $a;
2023-08-10 17:10:12 +08:00
}
2023-08-10 10:29:57 +08:00
}
2023-08-05 16:14:43 +08:00
2023-08-10 17:10:12 +08:00
/**
* @notes 更新任务状态
2023-08-05 16:14:43 +08:00
* @param array $params
* @return bool
* @author likeadmin
* @date 2023/08/05 13:39
*/
public static function edit(array $params): bool
{
Db::startTrans();
try {
2023-08-10 17:10:12 +08:00
Task::where('id', $params['id'])->update(['status' => 3, 'update_time' => time()]);
2023-08-05 16:14:43 +08:00
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
self::setError($e->getMessage());
return false;
}
}
/**
* @notes 删除任务
* @param array $params
* @return bool
* @author likeadmin
* @date 2023/08/05 13:39
*/
public static function delete(array $params): bool
{
return Task::destroy($params['id']);
}
/**
* @notes 获取任务详情
* @param $params
* @return array
* @author likeadmin
* @date 2023/08/05 13:39
*/
public static function detail($params): array
{
2023-08-10 17:10:12 +08:00
$task = Task::findOrEmpty($params['id'])->toArray();
if ($task) {
if (isset($task['extend']['informationg'])) {
$task['extend']['informationg'] = UserInformationg::where('id', $task['extend']['informationg'])->field('name,phone,sex,age,update_time')
->find()->toArray();
2023-08-05 16:14:43 +08:00
}
}
return $task;
}
2023-09-21 14:12:55 +08:00
/**
* 定时添加任务
*/
public static function TownCronAdd(array $taskTemplate)
{
try {
Log::info(['镇管理公司定时任务下发-任务模板', $taskTemplate]);
// 单次任务
if ($taskTemplate['types'] == 3) {
$task = Task::where('template_id', $taskTemplate['id'])->find();
if ($task) {
return true;
}
}
$time = strtotime(date('Y-m-d'));
$TaskSchedulingPlan_data = [
'create_user_id' => 0,
'company_id' => $taskTemplate['company_id'],
'template_id' => $taskTemplate['id'],
'scheduling_id' => $taskTemplate['task_scheduling'],
'start_time' => $time,
'end_time' => $time + 86399,
'sn' => User::createUserSn(),
'status' => 1
];
$TaskSchedulingPlan = TaskSchedulingPlan::create($TaskSchedulingPlan_data);
Log::info(['镇管理公司定时任务下发-添加plan结果', $TaskSchedulingPlan]);
$serviceManagerUser = User::where(['company_id'=>$taskTemplate['company_id'], 'group_id'=> 14])->find();
Log::info(['镇管理公司定时任务下发-服务部长user信息', $serviceManagerUser]);
$arr = [
'template_id' => $taskTemplate['id'],
'scheduling_plan_id' => $TaskSchedulingPlan['id'],
'company_id' => $taskTemplate['company_id'],
'title' => $taskTemplate['title'],
'money' => $taskTemplate['money'],
'type' => $taskTemplate['type'],
'content' => $taskTemplate['content'],
'start_time' => $time,
'end_time' => $time + 86399,
'director_uid' => $serviceManagerUser['id'], // 默认都指派给服务部长
'create_time' => time(),
'update_time' => time(),
];
$data = $arr;
$data['money'] = self::countTownTaskMoney($taskTemplate);
$data['extend'] = json_encode($taskTemplate['extend']);
$task_id = (new Task())->insertGetId($data);
Log::info(['镇管理公司定时任务下发-添加task结果', $task_id]);
TaskSchedulingPlan::where('id', $TaskSchedulingPlan['id'])->update(['task_id' => $task_id, 'is_execute' => 1]);
TaskTemplate::where('id', $taskTemplate['id'])->inc('day_count')->update();
} catch (\Exception $e) {
Log::error('定时任务添加失败'.$e->getMessage().'。line'.$e->getLine());
}
}
private static function countTownTaskMoney($tempalte)
{
$v_day_count = $tempalte['day_count'];
$v_day_count = $v_day_count + 1;
// 单次和循环任务
if ($tempalte['types'] == 1 || $tempalte['types'] == 3) {
if ($v_day_count <= $tempalte['stage_day_one']) {
// 第一阶段金额
return $tempalte['money'];
} else if ($v_day_count <= $tempalte['stage_day_two']) {
// 第二阶段金额
return $tempalte['money_two'];
} else if ($v_day_count <= $tempalte['stage_day_three']) {
// 第三阶段金额
return $tempalte['new_money_three'];
}
} elseif ($tempalte['types'] == 2) { // 长期任务
if ($v_day_count<= $tempalte['stage_day_one']) {
// 第一阶段金额
return $tempalte['money'];
} elseif ($v_day_count <= $tempalte['stage_day_two']) {
// 第二阶段金额
return $tempalte['money_two'];
} else if ($v_day_count <= $tempalte['stage_day_three']) {
// 第三阶段金额
return $tempalte['new_money_three'];
} else {
// 长期金额
return $tempalte['money_three'];
}
} else {
if ($v_day_count <= $tempalte['stage_day_one']) {
$a = $tempalte['money'];
} else {
$a = $tempalte['money_two'];
}
if ($v_day_count >= $tempalte['stage_day_two']) {
TaskTemplate::where('id', $tempalte['id'])->update(['status' => 0]);
}
return $a;
}
}
/**
* 先判定任务是否已完成 再按每个任务对应的结算方式结算
* $taskSchedulePlan 包含 task_tempalte、task_schedule、task_schedule_plan 三张表的信息
*/
public static function townTaskSettlement($taskSchedulePlan)
{
$taskTemplateInfo = $taskSchedulePlan['template_info'];
// 任务类型用的数据字典主键id将id和value作映射避免测试和正式环境数据字典数据不一致时出问题
$townTaskTypeList = DictData::where(['type_value' => 'town_task_type', 'status' => 1])->column('value', 'id');
switch ($townTaskTypeList[$taskTemplateInfo['type']]){
case 'town_task_type_1':
// 协助总负责人开展工作任务
self::dealTownTask1($taskSchedulePlan);
break;
case 'town_task_type_2':
// 协助总负责人开展工作任务
self::dealTownTask2($taskSchedulePlan);
break;
case 'town_task_type_3':
// 督促小组服务团队完成任务,协助开展工作,解决问题任务
self::dealTownTask3($taskSchedulePlan);
break;
case 'town_task_type_4':
// 督促小组服务团队学习任务
self::dealTownTask4($taskSchedulePlan);
break;
case 'town_task_type_5':
// 督促小组服务团队完成需求手机和交易任务
self::dealTownTask5($taskSchedulePlan);
break;
case 'town_task_type_6':
// 督促小组服务团队入股村联络员所成立的公司任务
self::dealTownTask6($taskSchedulePlan);
break;
case 'town_task_type_7':
// 安全工作任务
self::dealTownTask7($taskSchedulePlan);
break;
default :
return true;
}
}
/**
* 系统自动判定镇管理公司下属小组服务公司 是否100%完成每日任务:三轮车任务,档案更新任务,平台交易任务
*/
private static function dealTownTask1($taskSchedulePlan)
{
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$taskInfo = Task::where(['id' => $taskSchedulePlan['task_id']])->find();
$townCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
$groupServiceCompanyList = Company::where(['street' => $townCompany['street'], 'company_type' => 18])->select()->toArray();
$isDone = 1; // 任务是否完成标记
$isTaskSchedule = 0; // 下属小组服务公司是否有每日任务安排标记
foreach ($groupServiceCompanyList as $groupServiceCompany) {
// 查询小组服务公司是否有对应的每日任务安排
$templateList = TaskTemplate::where(['company_id' => $groupServiceCompany['id']])->whereIn('type', [31, 32, 33])->select()->toArray();
// 未做任务安排的小组服务公司不在判定范围内,跳出本次循环
if(count($templateList) === 3) {
$isTaskSchedule = 1;
// 查询小组服务公司的循环任务有没有全部做完 任意有一个任务没有做完,则判定为该小组服务公司没有完成每日任务,即协助总负责人开展工作任务也认定失败
foreach ($templateList as $template) {
$task = Task::where(['template_id' => $template['id'], 'status' => 3])->find();
if (empty($task)) {
$isDone = 0;
break;
}
}
} else {
continue;
}
}
// 下属小组服务公司有任务安排,也完成了任务
2023-09-21 14:12:55 +08:00
if ($isDone === 1 && $isTaskSchedule === 1) {
// 做任务结算,分润
2023-09-21 14:12:55 +08:00
(new TownShareProfit())->townTaskType1($taskInfo, $townCompany, $taskSchedulePlan);
} else {
// 关闭任务
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 5]);
Log::info('协助总负责人开展工作任务,结算失败:' . $taskTemplateInfo['title'] . '未完成。任务:' . json_encode($taskInfo));
}
}
private static function dealTownTask2($taskSchedulePlan)
{
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$taskScheduleInfo = $taskSchedulePlan['scheduling'];
}
private static function dealTownTask3($taskSchedulePlan)
{
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$taskScheduleInfo = $taskSchedulePlan['scheduling'];
}
private static function dealTownTask4($taskSchedulePlan)
{
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$taskScheduleInfo = $taskSchedulePlan['scheduling'];
}
private static function dealTownTask5($taskSchedulePlan)
{
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$taskScheduleInfo = $taskSchedulePlan['scheduling'];
}
private static function dealTownTask6($taskSchedulePlan)
{
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$taskScheduleInfo = $taskSchedulePlan['scheduling'];
}
private static function dealTownTask7($taskSchedulePlan)
{
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$taskScheduleInfo = $taskSchedulePlan['scheduling'];
}
2023-08-10 17:10:12 +08:00
}