diff --git a/app/adminapi/controller/task_template/TaskTemplateController.php b/app/adminapi/controller/task_template/TaskTemplateController.php index f301c70c6..736a82ef1 100644 --- a/app/adminapi/controller/task_template/TaskTemplateController.php +++ b/app/adminapi/controller/task_template/TaskTemplateController.php @@ -58,6 +58,8 @@ class TaskTemplateController extends BaseAdminController if ($company->company_type == 41) { // 创建 镇农科公司 任务模板 $result = TaskTemplateLogic::addTownTaskTemplate($params); + } else if ($company->company_type == 17) { + $result = TaskTemplateLogic::addVillageTaskTemplate($params); } else { $result = TaskTemplateLogic::add($params); } diff --git a/app/api/controller/CronController.php b/app/api/controller/CronController.php index d39df3548..d629990a1 100644 --- a/app/api/controller/CronController.php +++ b/app/api/controller/CronController.php @@ -5,6 +5,7 @@ use app\common\model\task_scheduling_plan\TaskSchedulingPlan; use app\job\TaskInformationJob; use app\job\TownTaskAdd; use app\job\TownTaskSettlementJob; +use app\job\VillageTaskAdd; use think\facade\Log; use app\common\model\Company; use app\common\model\task_template\TaskTemplate; @@ -126,4 +127,35 @@ class CronController extends BaseApiController Log::info('镇农科公司定时任务下发执行成功' . date('Y-m-d H:i:s')); return $this->success('镇农科公司定时任务下发执行成功'); } + + /** + * 村管理公司任务下发 + */ + public function village_task_add() + { + //任务下发 + $time = strtotime(date('Y-m-d')); + // 查询系统 所有镇农科公司 未下发 的 任务安排 + $taskSchedulingList = TaskScheduling::where('cron_time', '<', $time)->where('status', 1)->where('company_type', 17)->with('company_info')->select()->toArray(); + + $taskSchedulingIds = []; + $companyIds = []; + foreach ($taskSchedulingList as $k => $taskScheduling) { + $templateList = TaskTemplate::where('status', 1)->where('task_scheduling', $taskScheduling['id'])->limit(30)->select()->toArray(); + $taskSchedulingIds[] = $taskScheduling['id']; + $companyIds[] = $taskScheduling['company_id']; + foreach ($templateList as $template) { + queue(VillageTaskAdd::class, $template); +// TaskLogic::TownCronAdd($template); // 手动下发用 + } + + if (empty($templateList)) { + unset($taskSchedulingList[$k]); + } + } + Company::where('id', 'in', $companyIds)->inc('day_count')->update(); + TaskScheduling::where('id', 'in', $taskSchedulingIds)->update(['cron_time' => time()]); + Log::info('村管理公司定时任务下发执行成功' . date('Y-m-d H:i:s')); + return $this->success('村管理公司定时任务下发执行成功'); + } } \ No newline at end of file diff --git a/app/common/logic/task/TaskLogic.php b/app/common/logic/task/TaskLogic.php index 726f182ac..516ad22ec 100644 --- a/app/common/logic/task/TaskLogic.php +++ b/app/common/logic/task/TaskLogic.php @@ -296,6 +296,51 @@ class TaskLogic extends BaseLogic return $task; } + /** + * 定时添加任务 + */ + public static function VillageCronAdd(array $taskTemplate) + { + try { + Log::info(['村管理公司定时任务下发-任务模板', $taskTemplate]); + // 单次任务不重复下发,在结算时刷新任务时间 + if ($taskTemplate['types'] == 3) { + $task = Task::where('template_id', $taskTemplate['id'])->find(); + if ($task) { + // 累计任务进行天数,单次任务结算时,用于判断任务是否超时 + TaskTemplate::where('id', $taskTemplate['id'])->inc('day_count')->update(); + return true; + } + } + Db::startTrans(); + + $time = strtotime(date('Y-m-d')); + $directorUid = 0; // 指派给 + $marketingManagerUser = (new User())->searchLiaisonMan($taskTemplate['company_id']); + Log::info(['村管理公司定时任务下发-村联络员user信息', $marketingManagerUser]); + $directorUid = $marketingManagerUser['id']; + + // 添加任务计划 + $TaskSchedulingPlan = self::addTaskSchedulePlan($taskTemplate, $time); + Log::info(['村管理公司定时任务下发-添加plan结果', $TaskSchedulingPlan]); + + // 添加任务 + $task_id = self::addTask($taskTemplate, $TaskSchedulingPlan, $time, $directorUid); + Log::info(['村管理公司定时任务下发-添加task结果', $task_id]); + + // 关联任务计划和任务 + TaskSchedulingPlan::where('id', $TaskSchedulingPlan['id'])->update(['task_id' => $task_id, 'is_execute' => 1]); + + // 任务累计进行天数 +1 + TaskTemplate::where('id', $taskTemplate['id'])->inc('day_count')->update(); + + Db::commit(); + } catch (\Exception $e) { + Db::rollback(); + Log::error(['村管理公司定时任务添加失败', $e->getFile(), $e->getLine(), $e->getMessage()]); + } + } + /** * 定时添加任务 */ @@ -345,7 +390,7 @@ class TaskLogic extends BaseLogic Db::commit(); } catch (\Exception $e) { Db::rollback(); - Log::error('定时任务添加失败'.$e->getMessage().'。line:'.$e->getLine()); + Log::error(['镇农科公司定时任务添加失败', $e->getFile(), $e->getLine(), $e->getMessage()]); } } diff --git a/app/common/logic/task_template/TaskTemplateLogic.php b/app/common/logic/task_template/TaskTemplateLogic.php index 40ea3c028..06abaa957 100644 --- a/app/common/logic/task_template/TaskTemplateLogic.php +++ b/app/common/logic/task_template/TaskTemplateLogic.php @@ -269,6 +269,81 @@ class TaskTemplateLogic extends BaseLogic } + $find = TaskTemplate::where('task_scheduling', $params['task_scheduling'])->where('company_id',$params['company_id'])->where('type',$params['type'])->field('id,types,type')->find(); + if($find && $params['type'] == $find['type']){ + self::setError('已经有同一种任务类型了'); + return false; + } + + $moeny = TaskTemplate::where('company_id', $params['company_id'])->sum('money'); + if($moeny + $params['money'] > 200){ + self::setError('任务模板一阶段合计金额不能大于任务调度金额'); + return false; + } + $moneyTwo = TaskTemplate::where('company_id', $params['company_id'])->sum('money_two'); + if($moneyTwo + $params['money_two'] > 200){ + self::setError('任务模板二阶段合计金额不能大于任务调度金额'); + return false; + } + $newMoneyThree = TaskTemplate::where('company_id', $params['company_id'])->sum('new_money_three'); + if($newMoneyThree + $params['new_money_three'] > 200){ + self::setError('任务模板三阶段合计金额不能大于任务调度金额'); + return false; + } + $moneyThree = TaskTemplate::where('company_id', $params['company_id'])->sum('money_three'); + if($moneyThree + $params['money_three']>200){ + self::setError('任务模板长期合计金额不能大于任务调度金额'); + return false; + } + + TaskTemplate::create([ + 'title' => $params['title'], + 'admin_id' => $params['admin_id'], + 'company_id' => $params['company_id'], + 'task_scheduling' => $params['task_scheduling']??0, + 'money' => $params['money'], + 'money_two' => $params['money_two'], + 'money_three' => $params['money_three'], + 'type' => $params['type'], + 'types' => $params['types'], + 'status' => $params['status'], + 'content' => $params['content'], + 'extend'=>json_encode($params['extend']), + 'stage_day_one' => $params['stage_day_one']??0, + 'proportion_one' => $params['proportion_one']??0, + 'stage_day_two' => $params['stage_day_two']??0, + 'proportion_two' => $params['proportion_two']??0, + 'recharge' => $params['recharge']??0, + 'stage_day_three' => $params['stage_day_three']??0, + 'new_money_three' => $params['new_money_three']??0, + ]); + 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/06 17:30 + */ + public static function addVillageTaskTemplate(array $params): bool + { + try { + Db::startTrans(); + + + $serviceManagerUser = (new User())->searchLiaisonMan($params['company_id']); + if (empty($serviceManagerUser)) { + self::setError('公司还没有村联络员,无法指派任务'); + return false; + } + $find = TaskTemplate::where('task_scheduling', $params['task_scheduling'])->where('company_id',$params['company_id'])->where('type',$params['type'])->field('id,types,type')->find(); if($find && $params['type'] == $find['type']){ self::setError('已经有同一种任务类型了'); diff --git a/app/common/model/user/User.php b/app/common/model/user/User.php index 73e28e96b..2924ecd2b 100755 --- a/app/common/model/user/User.php +++ b/app/common/model/user/User.php @@ -229,4 +229,9 @@ class User extends BaseModel { return User::where(['company_id' => $companyId, 'group_id'=> 16])->find(); } + + public function searchLiaisonMan($companyId) + { + return User::where(['company_id' => $companyId, 'group_id'=> 17])->find(); + } } \ No newline at end of file diff --git a/app/job/VillageTaskAdd.php b/app/job/VillageTaskAdd.php new file mode 100644 index 000000000..2d72249a5 --- /dev/null +++ b/app/job/VillageTaskAdd.php @@ -0,0 +1,23 @@ +attempts() > 3) { + //通过这个方法可以检查这个任务已经重试了几次了 + } + TaskLogic::VillageCronAdd($template); + //如果任务执行成功后 记得删除任务,不然这个任务会重复执行,直到达到最大重试次数后失败后,执行failed方法 + $job->delete(); + } +}