1236 lines
60 KiB
PHP
1236 lines
60 KiB
PHP
<?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;
|
||
|
||
|
||
use app\common\logic\finance\TownShareProfit;
|
||
use app\common\logic\ShopRequestLogic;
|
||
use app\common\model\CompanyComplaintFeedback;
|
||
use app\common\model\contract\Contract;
|
||
use app\common\model\dict\DictData;
|
||
use app\common\model\ShopMerchantSettleinLog;
|
||
use app\common\model\task\Task;
|
||
use app\common\logic\BaseLogic;
|
||
use app\common\model\Company;
|
||
use app\common\model\informationg\UserInformationg;
|
||
use app\common\model\task_scheduling_plan\TaskSchedulingPlan;
|
||
use app\common\model\task_template\TaskTemplate;
|
||
use app\common\model\user\User;
|
||
use think\Exception;
|
||
use think\facade\Db;
|
||
use think\facade\Log;
|
||
|
||
/**
|
||
* 任务逻辑
|
||
* 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']),
|
||
'end_time' => strtotime($params['end_time']),
|
||
'director_uid' => $params['director_uid'],
|
||
'type' => $params['type'],
|
||
'status' => $params['status'],
|
||
'content' => $params['content'],
|
||
'extend' => json_encode($params['extend'])
|
||
]);
|
||
|
||
Db::commit();
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
Db::rollback();
|
||
self::setError($e->getMessage());
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 定时添加任务
|
||
*/
|
||
public static function CronAdd(array $v, $datas): bool
|
||
{
|
||
try {
|
||
if ($v['types'] == 3) {
|
||
$task = Task::where('template_id', $v['id'])->find();
|
||
if ($task) {
|
||
// 累计任务进行天数,单次任务结算时,用于判断任务是否超时
|
||
TaskTemplate::where('id', $v['id'])->inc('day_count')->update();
|
||
// 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;
|
||
}
|
||
}
|
||
$v_day_count=$v['day_count'];
|
||
$v_day_count=$v_day_count+1;
|
||
$time = strtotime(date('Y-m-d'));
|
||
Db::startTrans();
|
||
$TaskSchedulingPlan_data = [
|
||
'create_user_id' => 0,
|
||
'company_id' => $v['company_id'],
|
||
'template_id' => $v['id'],
|
||
'scheduling_id' => $v['task_scheduling'],
|
||
'start_time' => $time,
|
||
'end_time' => $time + 86399,
|
||
'sn' => User::createUserSn(),
|
||
'status' => 1
|
||
];
|
||
$TaskSchedulingPlan = TaskSchedulingPlan::create($TaskSchedulingPlan_data);
|
||
$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,
|
||
'end_time' => $time + 86399,
|
||
'create_time' => time(),
|
||
'update_time' => time(),
|
||
];
|
||
$data = $arr;
|
||
$data['money'] = self::task_money($v, $datas);
|
||
$data['extend'] = json_encode($v['extend']);
|
||
//信息更新
|
||
if ($v['type'] == 31) {
|
||
$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;
|
||
}
|
||
}
|
||
$data["extend"] = json_encode(['informationg' => ['count' => 5, 'update' => $update]]);
|
||
TaskTemplate::where('id', $v['id'])->inc('information_day_count', 5)->update();
|
||
}
|
||
if ($v['type'] == 32) {
|
||
$data['director_uid'] = $datas['company_info']['user_id'];
|
||
}
|
||
//入股任务
|
||
if ($v['type'] == 35) {
|
||
$responsible_area = Company::where('id', $v['company_id'])->value('responsible_area');
|
||
if ($responsible_area) {
|
||
$responsible_area = explode(',', $responsible_area);
|
||
} else {
|
||
Log::error('定时任务添加失败:没有区域' . json_encode($v));
|
||
return false;
|
||
}
|
||
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'];
|
||
foreach ($responsible_area as $kkk => $vvv) {
|
||
$v['extend']['shareholder']['user_list'][$kkk] = ['info' => $shareholder_user['nickname'] . '需缴纳' . $vvv . '队,股金:' . bcdiv($v['recharge'], count($responsible_area), 2), 'time' => $v['create_time']];
|
||
}
|
||
$data['director_uid'] = $v['extend']['shareholder']['user_id'];
|
||
}
|
||
$data['extend'] = json_encode($v['extend']);
|
||
$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);
|
||
}
|
||
//片区交易
|
||
if ($v['type'] == 33) {
|
||
//基础金额*(每日基户数*天数)//且户数小于公司总户数
|
||
$user_count = UserInformationg::where('company_id', $v['company_id'])->count();
|
||
//
|
||
if ($v_day_count == 0) {
|
||
$user_count_two = 5 * 1;
|
||
} else {
|
||
$user_count_two = 5 * $v_day_count;
|
||
}
|
||
if ($user_count_two > $user_count) {
|
||
$user_count_money = 58 * $user_count;
|
||
} else {
|
||
$user_count_money = 58 * $user_count_two;
|
||
}
|
||
$extend = [
|
||
'transaction' => ['arr' => ['day_money' => $user_count_money, 'total_price' => 0]]
|
||
];
|
||
$data['extend'] = json_encode($extend);
|
||
}
|
||
// 其他任务
|
||
if ($v['type'] == 34) {
|
||
// is_commit 是否提交 note 详情描述 annex 附件
|
||
$extend = [
|
||
'other'=> [
|
||
'is_commit' => 0,
|
||
'note' => '',
|
||
'annex' => [],
|
||
'video_annex' => [],
|
||
]
|
||
];
|
||
$data['extend'] = json_encode($extend);
|
||
}
|
||
$task_id = (new Task())->insertGetId($data);
|
||
TaskSchedulingPlan::where('id', $TaskSchedulingPlan['id'])->update(['task_id' => $task_id, 'is_execute' => 1]);
|
||
TaskTemplate::where('id', $v['id'])->inc('day_count')->update();
|
||
Db::commit();
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
Db::rollback();
|
||
Log::error('定时任务添加失败'.$e->getMessage().'。line:'.$e->getLine());
|
||
return false;
|
||
}
|
||
}
|
||
//任务金额
|
||
private static function task_money($v, $datas)
|
||
{
|
||
$v_day_count=$v['day_count'];
|
||
$v_day_count=$v_day_count+1;
|
||
$stageDayOneAccumulative = $v['stage_day_one']; // 第一阶段天数
|
||
$stageDayTwoAccumulative = bcadd($v['stage_day_one'], $v['stage_day_two']); // 第二阶段天数 第一+第二
|
||
if ($v['types'] == 1 || $v['types'] == 3) {
|
||
if ($v_day_count <= $stageDayOneAccumulative) {
|
||
return $v['money'];
|
||
} else {
|
||
return $v['money_two'];
|
||
}
|
||
} elseif ($v['types'] == 2) {
|
||
if ($v_day_count<= $stageDayOneAccumulative) {
|
||
return $v['money'];
|
||
} elseif ($stageDayOneAccumulative < $v_day_count && $v_day_count <= $stageDayTwoAccumulative) {
|
||
return $v['money_two'];
|
||
} else {
|
||
return $v['money_three'];
|
||
}
|
||
} else {
|
||
if ($v_day_count <= $v['stage_day_one']) {
|
||
$a = $v['money'];
|
||
} else {
|
||
$a = $v['money_two'];
|
||
}
|
||
if ($v_day_count >= $v['stage_day_two']) {
|
||
TaskTemplate::where('id', $v['id'])->update(['status' => 0]);
|
||
}
|
||
return $a;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @notes 更新任务状态
|
||
* @param array $params
|
||
* @return bool
|
||
* @author likeadmin
|
||
* @date 2023/08/05 13:39
|
||
*/
|
||
public static function edit(array $params): bool
|
||
{
|
||
Db::startTrans();
|
||
try {
|
||
Task::where('id', $params['id'])->update(['status' => 3, 'update_time' => time()]);
|
||
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
|
||
{
|
||
$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();
|
||
}
|
||
}
|
||
return $task;
|
||
}
|
||
|
||
/**
|
||
* 定时添加任务
|
||
*/
|
||
public static function TownCronAdd(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; // 指派给
|
||
if ($taskTemplate['extend']['task_role'] == 2) {
|
||
$marketingManagerUser = User::where(['company_id'=>$taskTemplate['company_id'], 'group_id'=> 16])->find();
|
||
Log::info(['镇农科公司定时任务下发-市场部长user信息', $marketingManagerUser]);
|
||
$directorUid = $marketingManagerUser['id'];
|
||
}
|
||
|
||
if ($taskTemplate['extend']['task_role'] == 3) {
|
||
$serviceManagerUser = User::where(['company_id'=>$taskTemplate['company_id'], 'group_id'=> 14])->find();
|
||
Log::info(['镇农科公司定时任务下发-服务部长user信息', $serviceManagerUser]);
|
||
$directorUid = $serviceManagerUser['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->getMessage().'。line:'.$e->getLine());
|
||
}
|
||
}
|
||
|
||
private static function addTaskSchedulePlan($taskTemplate, $time)
|
||
{
|
||
$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);
|
||
|
||
return $TaskSchedulingPlan;
|
||
}
|
||
|
||
private static function addTask($taskTemplate, $TaskSchedulingPlan, $time, $directorUid)
|
||
{
|
||
$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' => $directorUid, // 指派给
|
||
'create_time' => time(),
|
||
'update_time' => time(),
|
||
];
|
||
$data = $arr;
|
||
|
||
// 不同角色,计算任务金额有差异
|
||
if($taskTemplate['extend']['task_role'] == 2) {
|
||
$data['money'] = self::countTownTaskMarketingMoney($taskTemplate);
|
||
}
|
||
if($taskTemplate['extend']['task_role'] == 3) {
|
||
$data['money'] = self::countTownTaskMoney($taskTemplate);
|
||
}
|
||
|
||
|
||
$extend = [];
|
||
// 任务类型code
|
||
$taskType = (new DictData())->getTownTaskType($taskTemplate['type']);
|
||
// 督促小组服务团队学习任务 扩展信息
|
||
if ($taskType == 'town_task_type_4') {
|
||
$extend = ['town_task_type_4' => ['study_photo'=>[], 'sign_in_table'=>'', 'study_content'=> '']];
|
||
}
|
||
$data['extend'] = json_encode($extend);
|
||
$task_id = (new Task())->insertGetId($data);
|
||
return $task_id;
|
||
}
|
||
|
||
private static function countTownTaskMoney($template)
|
||
{
|
||
$v_day_count = $template['day_count'];
|
||
$v_day_count = $v_day_count + 1;
|
||
$stageDayOneAccumulative = $template['stage_day_one']; // 第一阶段天数
|
||
$stageDayTwoAccumulative = bcadd($template['stage_day_one'], $template['stage_day_two']); // 第二阶段天数 第一+第二
|
||
$stageDayThreeAccumulative = bcadd($stageDayTwoAccumulative, $template['stage_day_three']); // 第三阶段天数 第二阶段累计值+第三
|
||
|
||
// 单次和循环任务
|
||
if ($template['types'] == 1 || $template['types'] == 3) {
|
||
if ($v_day_count <= $stageDayOneAccumulative) {
|
||
// 第一阶段金额
|
||
return $template['money'];
|
||
} else if ($stageDayOneAccumulative < $v_day_count && $v_day_count<= $stageDayTwoAccumulative) {
|
||
// 第二阶段金额
|
||
return $template['money_two'];
|
||
} else if ( $stageDayTwoAccumulative < $v_day_count && $v_day_count <= $stageDayThreeAccumulative) {
|
||
// 第三阶段金额
|
||
return $template['new_money_three'];
|
||
}
|
||
} elseif ($template['types'] == 2) {
|
||
// 长期任务
|
||
|
||
// 督促完成需求收集和交易任务 第二个阶段即长期
|
||
$townTaskTypeList = DictData::where(['type_value' => 'town_task_type', 'status' => 1])->column('value', 'id');
|
||
if (isset($townTaskTypeList[$template['type']]) && $townTaskTypeList[$template['type']]=== 'town_task_type_5') {
|
||
if ($v_day_count<= $stageDayOneAccumulative) {
|
||
// 第一阶段金额
|
||
return $template['money'];
|
||
} elseif ( $v_day_count > $stageDayOneAccumulative) {
|
||
// 长期金额
|
||
return $template['money_three'];
|
||
}
|
||
}
|
||
|
||
if ($v_day_count<= $stageDayOneAccumulative) {
|
||
// 第一阶段金额
|
||
return $template['money'];
|
||
} elseif ( $stageDayOneAccumulative < $v_day_count && $v_day_count <= $stageDayTwoAccumulative) {
|
||
// 第二阶段金额
|
||
return $template['money_two'];
|
||
} else if ( $stageDayTwoAccumulative < $v_day_count && $v_day_count <=$stageDayThreeAccumulative) {
|
||
// 第三阶段金额
|
||
return $template['new_money_three'];
|
||
} else {
|
||
// 长期金额
|
||
return $template['money_three'];
|
||
}
|
||
}
|
||
}
|
||
|
||
private static function countTownTaskMarketingMoney($template)
|
||
{
|
||
$v_day_count = $template['day_count'];
|
||
$v_day_count = $v_day_count + 1;
|
||
$stageDayOneAccumulative = $template['stage_day_one']; // 第一阶段天数
|
||
$stageDayTwoAccumulative = bcadd($template['stage_day_one'], $template['stage_day_two']); // 第二阶段天数 第一+第二
|
||
$stageDayThreeAccumulative = bcadd($stageDayTwoAccumulative, $template['stage_day_three']); // 第三阶段天数 第二阶段累计值+第三
|
||
|
||
// 单次和循环任务
|
||
if ($template['types'] == 1 || $template['types'] == 3) {
|
||
if ($v_day_count <= $stageDayOneAccumulative) {
|
||
// 第一阶段金额
|
||
return $template['money'];
|
||
} else if ($stageDayOneAccumulative < $v_day_count && $v_day_count<= $stageDayTwoAccumulative) {
|
||
// 第二阶段金额
|
||
return $template['money_two'];
|
||
} else if ( $stageDayTwoAccumulative < $v_day_count && $v_day_count <= $stageDayThreeAccumulative) {
|
||
// 第三阶段金额
|
||
return $template['new_money_three'];
|
||
}
|
||
} elseif ($template['types'] == 2) {
|
||
// 长期任务
|
||
|
||
// 市场部长协助总负责人开展日常工作 第一个阶段即长期
|
||
$townTaskTypeList = DictData::where(['type_value' => 'town_task_type_marketing_director', 'status' => 1])->column('value', 'id');
|
||
if (isset($townTaskTypeList[$template['type']]) && $townTaskTypeList[$template['type']]=== 'town_task_type_marketing_director_1') {
|
||
return $template['money_three'];
|
||
}
|
||
|
||
if ($v_day_count<= $stageDayOneAccumulative) {
|
||
// 第一阶段金额
|
||
return $template['money'];
|
||
} elseif ( $stageDayOneAccumulative < $v_day_count && $v_day_count <= $stageDayTwoAccumulative) {
|
||
// 第二阶段金额
|
||
return $template['money_two'];
|
||
} else if ( $stageDayTwoAccumulative < $v_day_count && $v_day_count <=$stageDayThreeAccumulative) {
|
||
// 第三阶段金额
|
||
return $template['new_money_three'];
|
||
} else {
|
||
// 长期金额
|
||
return $template['money_three'];
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 先判定任务是否已完成 再按每个任务对应的结算方式结算
|
||
* $taskSchedulePlan 包含 task_tempalte、task_schedule、task_schedule_plan 三张表的信息
|
||
*/
|
||
public static function townTaskSettlement($taskSchedulePlan)
|
||
{
|
||
try {
|
||
Log::info(['镇农科公司定时任务结算执行-任务计划', $taskSchedulePlan]);
|
||
$taskTemplateInfo = $taskSchedulePlan['template_info'];
|
||
// 负责人任务结算 todo
|
||
if ($taskTemplateInfo['extend']['task_role'] == 1) {
|
||
|
||
}
|
||
// 市场部长任务结算
|
||
if ($taskTemplateInfo['extend']['task_role'] == 2) {
|
||
self::marketingManagerTaskSettlement($taskSchedulePlan);
|
||
}
|
||
// 服务部长任务结算
|
||
if ($taskTemplateInfo['extend']['task_role'] == 3) {
|
||
self::serviceManagerTaskSettlement($taskSchedulePlan);
|
||
}
|
||
|
||
} catch (Exception $e) {
|
||
Log::error(['镇农科任务结算失败',$e->getFile(), $e->getLine(), $e->getMessage()]);
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* @param $taskSchedulePlan
|
||
* 市场部长任务结算
|
||
*/
|
||
private static function marketingManagerTaskSettlement($taskSchedulePlan)
|
||
{
|
||
$taskTemplateInfo = $taskSchedulePlan['template_info'];
|
||
// 任务类型用的数据字典主键id,将id和value作映射,避免测试和正式环境数据字典数据不一致时出问题
|
||
$townTaskTypeList = DictData::where(['type_value' => 'town_task_type_marketing_director', 'status' => 1])->column('value', 'id');
|
||
switch ($townTaskTypeList[$taskTemplateInfo['type']]){
|
||
// 协助总负责人开展工作
|
||
case 'town_task_type_marketing_director_1':
|
||
self::dealTaskMarketingDirector1($taskSchedulePlan);
|
||
break;
|
||
// 招驻供应链商户
|
||
case 'town_task_type_marketing_director_2':
|
||
self::dealTaskMarketingDirector2($taskSchedulePlan);
|
||
break;
|
||
case 'town_task_type_marketing_director_3':
|
||
self::dealTaskMarketingDirector3($taskSchedulePlan);
|
||
break;
|
||
case 'town_task_type_marketing_director_4':
|
||
|
||
break;
|
||
case 'town_task_type_marketing_director_5':
|
||
|
||
break;
|
||
case 'town_task_type_marketing_director_6':
|
||
|
||
break;
|
||
case 'town_task_type_marketing_director_7':
|
||
|
||
break;
|
||
case 'town_task_type_marketing_director_8':
|
||
|
||
break;
|
||
case 'town_task_type_marketing_director_9':
|
||
|
||
break;
|
||
case 'town_task_type_marketing_director_10':
|
||
|
||
break;
|
||
default:
|
||
return true;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @param $taskSchedulePlan
|
||
* 市场部长协助总负责人开展工作 任务完成判定和结算
|
||
*/
|
||
private static function dealTaskMarketingDirector1($taskSchedulePlan)
|
||
{
|
||
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
|
||
$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;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 下属小组服务公司有任务安排,也完成了任务
|
||
if ($isDone === 1 && $isTaskSchedule === 1) {
|
||
// 做任务结算,分润
|
||
(new TownShareProfit())->dealTaskSettlementMarketingDirector1($taskInfo, $townCompany, $taskSchedulePlan);
|
||
} else {
|
||
// 关闭任务
|
||
(new Task())->closeTask($taskSchedulePlan['task_id']);
|
||
Log::info('协助总负责人开展工作任务,结算失败:' . $taskTemplateInfo['title'] . '未完成。任务:' . json_encode($taskInfo));
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 招驻供应链商户 单次任务 任务完成判定和结算
|
||
* 判定条件 : 任务下发60天内,供应链商户在商城开户并缴纳押金不少于5000,>=6家
|
||
* 当前任务进行天数 < 第一阶段天数 只刷新任务时间
|
||
* 当前任务进行天数 = 第一阶段天数 判定任务完成情况,结算
|
||
*/
|
||
private static function dealTaskMarketingDirector2($taskSchedulePlan)
|
||
{
|
||
$templateInfo = $taskSchedulePlan['template_info'];
|
||
$dayCount = $templateInfo['day_count'];
|
||
$townCompany = Company::where(['id' => $templateInfo['company_id']])->find();
|
||
$taskInfo = Task::where(['id' => $taskSchedulePlan['task_id']])->find();
|
||
// 当前任务进行天数 < 第一阶段天数 只刷新任务时间
|
||
if ($dayCount < $templateInfo['stage_day_one']) {
|
||
self::flushTaskTime($taskSchedulePlan);
|
||
return true;
|
||
}
|
||
|
||
// 当前任务进行天数 = 第一阶段天数 判定任务完成情况,结算
|
||
if ($dayCount == $templateInfo['stage_day_one']) {
|
||
// 请求商城接口,获取完成几家 todo
|
||
$param['start_time'] = strtotime(date('Y-m-d', $templateInfo['cretate_time'])) + 86400;
|
||
$param['end_time'] = time();
|
||
$result = ShopRequestLogic::getSupplyChainMerchantCount($param);
|
||
if (!$result) {
|
||
Log::error('查询供应链商户统计接口失败'.ShopRequestLogic::getError());
|
||
return false;
|
||
}
|
||
$count = 0; // todo 从$result取值
|
||
|
||
// 完成数小于3,关闭任务,不做结算
|
||
if ($count < 3){
|
||
(new Task())->closeTask($taskSchedulePlan['task_id']);
|
||
}
|
||
// 完成数大于等于3,结算
|
||
$target = $templateInfo['extend']['target'];
|
||
$perMoney = bcdiv(bcmul($templateInfo['stage_day_one'], $templateInfo['money']), $target); // 完成单个金额
|
||
|
||
if ($count >= 6) {
|
||
$count = 6;
|
||
}
|
||
$taskInfo['money'] = bcmul($count, $perMoney); // 任务金额
|
||
// 结算,分润
|
||
(new TownShareProfit())->dealTaskSettlementMarketingDirector2($taskInfo, $townCompany, $taskSchedulePlan);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 协助供应链商户商品上架和库存更新 长期 判定与结算
|
||
* 请求商城接口,查询每个商户入驻5天内是否完成商品上架
|
||
* 请求商城接口,查询每个商户商品上架构后15天内是否完成库存更新
|
||
*
|
||
*/
|
||
public static function dealTaskMarketingDirector3($company, $template, $task, $type)
|
||
{
|
||
// 商城商户入驻申请id 与商户已关联
|
||
$shopMerchantSettleinLogList= ShopMerchantSettleinLog::where(['town_company_id'=>$company['id']])->select()->toArray();
|
||
// 遍历农科公司区域下的商户,对每个商户进行判定
|
||
foreach ($shopMerchantSettleinLogList as $item) {
|
||
|
||
// 入驻5天内是否完成商品上架
|
||
$startTime = $item['create_time']; // 入驻时间
|
||
$endTime = bcadd($startTime, bcmul(86400, $template['stage_day_one']));
|
||
// 只在入驻5天后的最后一天结算
|
||
if (date('Y-m-d', $endTime) == date('Y-m-d', time())) {
|
||
$merIntentionId = $item['mer_intention_id'];
|
||
$param = [
|
||
'start_time' => $startTime,
|
||
'end_time' => $endTime,
|
||
'mer_intention_id' => $merIntentionId,
|
||
];
|
||
$result = ShopRequestLogic::getProductListing($param);
|
||
Log::info(['4.市场部长-供应链商户完成商品上架和库存更新任务-查询商城接口结果', json_encode($result)]);
|
||
// 完成则结算 todo 返回字段要对接
|
||
if ($result['is_done'] == 1){
|
||
// 结算金额 任务金额/目标数 * 天数
|
||
$task['money'] = bcmul($template['stage_day_one'], bcdiv($template['money'], $template['extend']['target']));
|
||
$taskSchedulePlan = TaskSchedulingPlan::where(['id', $task['scheduling_plan_id']])
|
||
->withJoin(['scheduling'], 'left')
|
||
->where('scheduling.company_type', 41)
|
||
->where('is_pay',0)
|
||
->with(['template_info'])
|
||
->find();
|
||
Log::info(['5.市场部长-供应链商户完成商品上架任务-$taskSchedulePlan', json_encode($taskSchedulePlan)]);
|
||
(new TownShareProfit())->dealTaskSettlementMarketingDirector3($task, $company, $taskSchedulePlan);
|
||
}
|
||
}
|
||
|
||
|
||
// 商品上架构后15天内是否完成库存更新
|
||
$startTime = $item['create_time'];
|
||
$endTime = bcadd($startTime, bcmul( 86400, bcadd($template['stage_day_one'], $template['stage_day_two']))) ;
|
||
// 只在上架完成15天后的最后一天结算
|
||
if (date('Y-m-d', $endTime) == date('Y-m-d', time())) {
|
||
$merIntentionId = $item['mer_intention_id'];
|
||
$param = [
|
||
'start_time' => $startTime,
|
||
'end_time' => $endTime,
|
||
'mer_intention_id' => $merIntentionId,
|
||
];
|
||
$result1 = ShopRequestLogic::getStockUpdate($param); // todo 返回字段要对接
|
||
Log::info(['4.市场部长-供应链商户完成库存更新任务-查询商城接口结果', json_encode($result)]);
|
||
if ($result1['is_done'] == 1){
|
||
// 结算金额 任务金额/目标数 * 天数
|
||
$task['money'] = bcmul($template['stage_day_two'], bcdiv($template['money_two'], $template['extend']['target']));
|
||
$taskSchedulePlan = TaskSchedulingPlan::where(['id', $task['scheduling_plan_id']])
|
||
->withJoin(['scheduling'], 'left')
|
||
->where('scheduling.company_type', 41)
|
||
->where('is_pay',0)
|
||
->with(['template_info'])
|
||
->find();
|
||
Log::info(['5.市场部长-供应链商户完成商品上架任务-$taskSchedulePlan', json_encode($taskSchedulePlan)]);
|
||
(new TownShareProfit())->dealTaskSettlementMarketingDirector3($task, $company, $taskSchedulePlan);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 未完成的情况下,每天自动关闭任务
|
||
$task = Task::where(['id'=>$taskSchedulePlan['task_id']])->find();
|
||
if ($task['status'] != 3) {
|
||
(new Task())->closeTask($task['id']);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 协助供应链商户采购任务 长期 判定与结算
|
||
* 根据每个商户入驻时间,推出各个周期范围的起始时间,商户申请id,指定商品id。请求商城接口
|
||
*/
|
||
public static function dealTaskMarketingDirector4($company, $template, $task)
|
||
{
|
||
// 商城商户入驻申请id 与商户已关联
|
||
$shopMerchantSettleinLogList= ShopMerchantSettleinLog::where(['town_company_id'=>$company['id']])->select()->toArray();
|
||
// 遍历农科公司区域下的商户,对每个商户进行判定
|
||
foreach ($shopMerchantSettleinLogList as $item) {
|
||
$startTime = $item['create_time']; // 入驻时间
|
||
$endTime = bcadd($startTime, bcmul(86400, $template['stage_day_one']));
|
||
$merIntentionId = $item['mer_intention_id'];
|
||
$param = [
|
||
'start_time' => $startTime,
|
||
'end_time' => $endTime,
|
||
'mer_intention_id' => $merIntentionId,
|
||
];
|
||
$result1 = ShopRequestLogic::getStockUpdate($param); // todo 返回字段要对接
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @param $taskSchedulePlan
|
||
* 服务部长任务结算
|
||
*/
|
||
private static function serviceManagerTaskSettlement($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)
|
||
{
|
||
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
|
||
$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;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// 下属小组服务公司有任务安排,也完成了任务
|
||
if ($isDone === 1 && $isTaskSchedule === 1) {
|
||
// 做任务结算,分润
|
||
(new TownShareProfit())->townTaskType1($taskInfo, $townCompany, $taskSchedulePlan);
|
||
} else {
|
||
// 关闭任务
|
||
(new Task())->closeTask($taskSchedulePlan['task_id']);
|
||
Log::info('协助总负责人开展工作任务,结算失败:' . $taskTemplateInfo['title'] . '未完成。任务:' . json_encode($taskInfo));
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 拓展小组服务团队工作任务 单次任务
|
||
* 当前任务进行天数 < 第一阶段天数 只刷新任务时间
|
||
* 当前任务进行天数 = 第一阶段天数 做第一阶段结算 如果第一阶段已完成全部任务,也要刷新任务时间,等到第二阶段结算时才结束任务
|
||
* 当前任务进行天数 > 第一阶段天数 但未到第二阶段结算时间 继续刷新任务时间
|
||
* 当前任务进行天数 = (第一阶段+第二阶段)天数 未完成则关闭任务 完成则结算第二阶段金额
|
||
*/
|
||
private static function dealTownTask2($taskSchedulePlan)
|
||
{
|
||
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
|
||
$taskTemplateInfo = $taskSchedulePlan['template_info'];
|
||
$townCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
|
||
$day = $taskTemplateInfo['stage_day_one'] + $taskTemplateInfo['stage_day_two'];
|
||
$task = Task::where('id', $taskSchedulePlan['task_id'])->with('director_info')->find();
|
||
|
||
// 当前任务进行天数 < 第一阶段天数 只刷新任务时间
|
||
if($taskTemplateInfo['day_count'] < $taskTemplateInfo['stage_day_one']) {
|
||
self::flushTaskTime($taskSchedulePlan);
|
||
return true;
|
||
}
|
||
|
||
// 当前任务进行天数 = 第一阶段天数 做第一阶段结算 如果第一阶段已完成全部任务,也要刷新任务时间,等到第二阶段结算时才结束任务
|
||
if($taskTemplateInfo['day_count'] == $taskTemplateInfo['stage_day_one']) {
|
||
// 已签约的小组服务合同个数
|
||
$contractCount = Contract::where(['party_a' => $townCompany['id'], 'status' => 1, 'contract_type' => 25])->count();
|
||
if ($contractCount < 9) {
|
||
self::flushTaskTime($taskSchedulePlan);
|
||
return false;
|
||
}
|
||
$totalMoney = bcmul($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['money'], 2);
|
||
$taskMoney = 0;
|
||
switch ($contractCount) {
|
||
case 9:
|
||
$taskMoney = bcmul($totalMoney, 0.4, 2);
|
||
break;
|
||
case 10:
|
||
$taskMoney = bcmul($totalMoney, 0.4, 2);
|
||
break;
|
||
case 11:
|
||
$taskMoney = bcmul($totalMoney, 0.5, 2);
|
||
break;
|
||
case 12:
|
||
$taskMoney = bcmul($totalMoney, 0.6, 2);
|
||
break;
|
||
case 13:
|
||
$taskMoney = bcmul($totalMoney, 0.6, 2);
|
||
break;
|
||
case 14:
|
||
$taskMoney = bcmul($totalMoney, 0.7, 2);
|
||
break;
|
||
case 15:
|
||
$taskMoney = bcmul($totalMoney, 1, 2);
|
||
break;
|
||
}
|
||
if ($contractCount > 15) {
|
||
$taskMoney = bcmul($totalMoney, 1, 2);
|
||
}
|
||
$task['money'] = $taskMoney; // 任务金额
|
||
(new TownShareProfit())->townTaskType2($task, $townCompany, $taskSchedulePlan, 1, $contractCount);
|
||
}
|
||
|
||
// 当前任务进行天数 > 第一阶段天数 但未到第二阶段结算 继续刷新任务时间
|
||
if($taskTemplateInfo['day_count'] > $taskTemplateInfo['stage_day_one'] && $taskTemplateInfo['day_count'] < $day){
|
||
self::flushTaskTime($taskSchedulePlan);
|
||
}
|
||
|
||
// 当前任务进行天数 = 第一+第二阶段天数 第二阶段结算
|
||
if ($taskTemplateInfo['day_count'] == $day) {
|
||
// 已签约的小组服务合同个数
|
||
$contractCount = Contract::where(['party_a' => $townCompany['id'], 'status' => 1, 'contract_type' => 25])->count();
|
||
// 第二阶段未完成
|
||
if ($contractCount < 15) {
|
||
// 关闭任务,并且没有奖励
|
||
(new Task())->closeTask($taskSchedulePlan['task_id']);
|
||
Log::info('结算失败:' . $taskTemplateInfo['title'] . '第二阶段未完成。任务:' . json_encode($task));
|
||
return false;
|
||
}
|
||
|
||
$taskMoney = bcmul($taskTemplateInfo['stage_day_two'], $taskTemplateInfo['money_two'], 2);
|
||
$task['money'] = $taskMoney; // 任务金额
|
||
|
||
(new TownShareProfit())->townTaskType2($task, $townCompany, $taskSchedulePlan, 2, $contractCount);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
private static function flushTaskTime($taskSchedulePlan)
|
||
{
|
||
$time = strtotime(date('Y-m-d')); // 今天的 00:00:00
|
||
|
||
TaskSchedulingPlan::where(['id' => $taskSchedulePlan['id']])->update(
|
||
[
|
||
'create_time' => $time+86400, //第二天的00:00:00
|
||
'update_time' =>time(),
|
||
'start_time'=>$time+86400, //第二天的00:00:00
|
||
'end_time'=>$time+86400+86399 //第二天的 23:59:59
|
||
]);
|
||
|
||
Task::where('id', $taskSchedulePlan['task_id'])->update(
|
||
[
|
||
'create_time' => $time+86400,
|
||
'update_time' => time(),
|
||
'start_time'=> $time+86400,
|
||
'end_time'=> $time+86400+86399
|
||
]);
|
||
}
|
||
|
||
private static function dealTownTask3($taskSchedulePlan)
|
||
{
|
||
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
|
||
$taskTemplateInfo = $taskSchedulePlan['template_info'];
|
||
$townCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
|
||
$groupServiceCompanyList = Company::where(['street' => $townCompany['street'], 'company_type' => 18])->select()->toArray();
|
||
$task = Task::where('id', $taskSchedulePlan['task_id'])->with('director_info')->find();
|
||
// 完成任务情况
|
||
list($groupServiceCompanyCount, $doneTaskGroupServiceCompanyCount) = self::taskType3DoneInfo($groupServiceCompanyList);
|
||
$doneRate = bcdiv($doneTaskGroupServiceCompanyCount, $groupServiceCompanyCount,2);
|
||
// <80% 未完成任务 关闭本次任务
|
||
if (bccomp($doneRate, 0.8, 2) == -1) {
|
||
(new Task())->closeTask($taskSchedulePlan['task_id']);
|
||
return true;
|
||
} else {
|
||
// 结算 分润
|
||
(new TownShareProfit())->townTaskType3($task, $townCompany, $taskSchedulePlan);
|
||
}
|
||
}
|
||
|
||
public static function taskType3DoneInfo($groupServiceCompanyList)
|
||
{
|
||
$groupServiceCompanyCount = count($groupServiceCompanyList); // 团队总数
|
||
$doneTaskGroupServiceCompanyCount = 0; // 完成任务团队总数
|
||
// 判定完成条件 组建成功的小组服务团队 每日完成档案更新任务和三轮车任务 的团队数量 >= 80% 小于80%则视为未完成
|
||
foreach ($groupServiceCompanyList as $groupServiceCompany) {
|
||
// 档案更新任务
|
||
$taskType31 = Task::where(['company_id' => $groupServiceCompany['id'], 'type' => 31, 'status' => 3])->whereDay('start_time', 'today')->find();
|
||
// 三轮车任务
|
||
$taskType32 = Task::where(['company_id' => $groupServiceCompany['id'], 'type' => 32, 'status' => 3])->whereDay('start_time', 'today')->find();
|
||
if (!empty($taskType31) && !empty($taskType32)) {
|
||
$doneTaskGroupServiceCompanyCount++;
|
||
}
|
||
}
|
||
return [$groupServiceCompanyCount, $doneTaskGroupServiceCompanyCount];
|
||
}
|
||
|
||
/**
|
||
* 督促小组服务团队学习任务 长期任务 前置操作:每天要从APP端提交资料上来,根据提交资料来判定当天任务有没有完成
|
||
* 任务完成条件:(学习照片5张,签到表一份,培训内容大纲 >= 50个字),每月提交>=4次
|
||
* 1 当前任务进行天数 < 第一阶段天数 只判断当天是否完成 状态未完成则关闭任务
|
||
* 2 当前任务进行天数 = 第一阶段天数 做第一阶段结算 且更改 task_schedule_plan 状态为已结算,后续将会根据这个时间来统计、判断各阶段的周期内是否达成完成条件(*)
|
||
* 3 第一阶段天数 < 当前任务进行天数 < (第一 + 第二) 只判断当天是否完成 状态未完成则关闭任务
|
||
* 4 当前任务进行天数 = (第一阶段+第二阶段)天数 第二阶段结算 且更改 task_schedule_plan 状态为已结算
|
||
* 5 第一阶段+第二阶段 < 当前任务进行天数 < (第一 + 第二 + 第三阶段天数) 只判断当天是否完成 状态未完成则关闭任务
|
||
* 6 当前任务进行天数 = (第一 + 第二 + 第三阶段天数) 第三阶段结算 且更改 task_schedule_plan 状态为已结算
|
||
* 7 当前任务进行天数 > (第一 + 第二 + 第三阶段天数) 但 当前任务进行天数/30 != 0 只判断当天是否完成 状态未完成则关闭任务
|
||
* 8 当前任务进行天数/30 = 0, 长期阶段结算 且更改 task_schedule_plan 状态为已结算
|
||
*/
|
||
private static function dealTownTask4($taskSchedulePlan)
|
||
{
|
||
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
|
||
$taskTemplateInfo = $taskSchedulePlan['template_info'];
|
||
$townCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
|
||
$taskDayCount = $taskTemplateInfo['day_count']; // 任务累计进行天数
|
||
$task = Task::where('id', $taskSchedulePlan['task_id'])->find();
|
||
$stageDayOneAccumulative = $taskTemplateInfo['stage_day_one']; // 第一阶段累计天数
|
||
$stageDayTwoAccumulative = intval(bcadd($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['stage_day_two'])); // 第二阶段累计天数 第一+第二
|
||
$stageDayThreeAccumulative = intval(bcadd($stageDayTwoAccumulative, $taskTemplateInfo['stage_day_three'])); // 第三阶段累计天数 第二阶段累计值+第三阶段天数
|
||
|
||
// 1 当前任务进行天数 < 第一阶段天数 只判断当天是否完成 状态未完成则关闭任务
|
||
if ($taskDayCount < $stageDayOneAccumulative) {
|
||
if ($task['status'] != 3) {
|
||
(new Task())->closeTask($task['id']);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 2 当前任务进行天数 = 第一阶段天数 做第一阶段结算 且更改 task_schedule_plan 状态为已结算,后续将会根据这个时间来筛选、统计、判断各阶段周期内是否达成完成条件
|
||
if($taskDayCount == $stageDayOneAccumulative){
|
||
$doneTaskCount = Task::where(['template_id'=>$taskTemplateInfo['id'], 'status'=>3])->count();
|
||
if ($doneTaskCount >= 4) {
|
||
$task['money'] = bcmul($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['money'], 2);
|
||
(new TownShareProfit())->townTaskType4($task, $townCompany, $taskSchedulePlan);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 3 第一阶段天数 < 当前任务进行天数 < (第一 + 第二) 只判断当天是否完成 状态未完成则关闭任务
|
||
if ($stageDayOneAccumulative < $taskDayCount && $taskDayCount < $stageDayTwoAccumulative) {
|
||
if ($task['status'] != 3) {
|
||
(new Task())->closeTask($task['id']);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 4 当前任务进行天数 = (第一阶段+第二阶段)天数 第二阶段结算 且更改 task_schedule_plan 状态为已结算
|
||
if ($taskDayCount == $stageDayTwoAccumulative) {
|
||
// 上一次做了结算的任务计划
|
||
$lastTaskSchedulePlan = TaskSchedulingPlan::where(['template_id'=>$taskTemplateInfo['id'], 'is_pay'=>1])->order('start_time', 'desc')->find();
|
||
// 上一次结算后到现在,完成的任务次数
|
||
$doneTaskCount = Task::where(['template_id'=>$taskTemplateInfo['id'], 'status'=>3])->whereBetween('start_time', [$lastTaskSchedulePlan['start_time'], time()])->count();
|
||
if ($doneTaskCount >= 8) {
|
||
$task['money'] = bcmul($taskTemplateInfo['stage_day_two'], $taskTemplateInfo['money_two'], 2);
|
||
(new TownShareProfit())->townTaskType4($task, $townCompany, $taskSchedulePlan);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 5 第一阶段+第二阶段 < 当前任务进行天数 < (第一 + 第二 + 第三阶段天数) 只判断当天是否完成 状态未完成则关闭任务
|
||
if ($stageDayTwoAccumulative < $taskDayCount && $taskDayCount < $stageDayThreeAccumulative) {
|
||
if ($task['status'] != 3) {
|
||
(new Task())->closeTask($task['id']);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 6 当前任务进行天数 = (第一 + 第二 + 第三阶段天数) 第三阶段结算 且更改 task_schedule_plan 状态为已结算
|
||
if ($taskDayCount == $stageDayThreeAccumulative) {
|
||
// 上一次做了结算的任务计划
|
||
$lastTaskSchedulePlan = TaskSchedulingPlan::where(['template_id'=>$taskTemplateInfo['id'], 'is_pay'=>1])->order('start_time', 'desc')->find();
|
||
// 上一次结算后到现在,完成的任务次数
|
||
$doneTaskCount = Task::where(['template_id'=>$taskTemplateInfo['id'], 'status'=>3])->whereBetween('start_time', [$lastTaskSchedulePlan['start_time'], time()])->count();
|
||
if ($doneTaskCount >= 8) {
|
||
$task['money'] = bcmul($taskTemplateInfo['stage_day_three'], $taskTemplateInfo['new_money_three'], 2);
|
||
(new TownShareProfit())->townTaskType4($task, $townCompany, $taskSchedulePlan);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 7 当前任务进行天数 > (第一 + 第二 + 第三阶段天数) 但 当前任务进行天数/30 != 0 只判断当天是否完成 状态未完成则关闭任务
|
||
if($taskDayCount > $stageDayThreeAccumulative && $taskDayCount%30 != 0) {
|
||
if ($task['status'] != 3) {
|
||
(new Task())->closeTask($task['id']);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// 8 当前任务进行天数/30 = 0, 长期阶段结算 且更改 task_schedule_plan 状态为已结算
|
||
if ($taskDayCount > $stageDayThreeAccumulative && $taskDayCount%30 == 0) {
|
||
// 上一次做了结算的任务计划
|
||
$lastTaskSchedulePlan = TaskSchedulingPlan::where(['template_id'=>$taskTemplateInfo['id'], 'is_pay'=>1])->order('start_time', 'desc')->find();
|
||
// 上一次结算后到现在,完成的任务次数
|
||
$doneTaskCount = Task::where(['template_id'=>$taskTemplateInfo['id'], 'status'=>3])->whereBetween('start_time', [$lastTaskSchedulePlan['start_time'], time()])->count();
|
||
if ($doneTaskCount >= 4) {
|
||
$task['money'] = bcmul(30, $taskTemplateInfo['money_three'], 2);
|
||
(new TownShareProfit())->townTaskType4($task, $townCompany, $taskSchedulePlan);
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 查镇所属小组服务公司当日实际完成金额总和+镇农科公司的资金池
|
||
* 查镇所属小组服务公司当日任务目标金额总和
|
||
*/
|
||
private static function dealTownTask5($taskSchedulePlan)
|
||
{
|
||
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
|
||
$taskTemplateInfo = $taskSchedulePlan['template_info'];
|
||
$townCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
|
||
$townTask = Task::where('id', $taskSchedulePlan['task_id'])->find();
|
||
$groupServiceCompanyList = Company::where(['street' => $townCompany['street'], 'company_type'=> 18])->select()->toArray();
|
||
$townTransactionPool = $taskTemplateInfo['transaction_pool']; // 镇交易池
|
||
$townTotalTradeAmount = 0; // 镇下属小组服务公司 每日实际总交易额
|
||
$targetAmount = 0; // 镇下属小组服务公司每日 目标总交易额
|
||
// 查镇所属小组服务公司当日任务目标金额总和
|
||
foreach ($groupServiceCompanyList as $groupServiceCompany) {
|
||
$tempTask = Task::where(['company_id'=> $groupServiceCompany['id'], 'status'=>3, 'type'=>33])
|
||
->whereDay('start_time','today')
|
||
->find();
|
||
if ($tempTask) {
|
||
$plan = TaskSchedulingPlan::where(['id'=>$tempTask['scheduling_plan_id']])->find();
|
||
if ($plan['is_pay'] == 1) {
|
||
$extend = json_decode($tempTask['extend'], true);
|
||
$targetAmount += $extend['transaction']['arr']['day_money'];
|
||
$townTotalTradeAmount += $extend['transaction']['arr']['total_price'];
|
||
}
|
||
}
|
||
}
|
||
// 完成条件: 查镇所属小组服务公司当日实际完成金额总和+镇农科公司的资金池 > 查镇所属小组服务公司当日任务目标金额总和
|
||
if($targetAmount != 0 && bcadd($townTransactionPool, $townTotalTradeAmount, 2) >= $targetAmount) {
|
||
// 将余下金额放入镇交易池
|
||
$leftTransactionPool = bcsub(bcadd($townTransactionPool, $townTotalTradeAmount, 2), $targetAmount, 2);
|
||
(new TownShareProfit())->townTaskType5($townTask, $townCompany, $taskSchedulePlan, $leftTransactionPool);
|
||
} else {
|
||
// 关闭任务
|
||
(new Task())->closeTask($taskSchedulePlan['task_id']);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 督促小组服务团队入股村联络员所成立的公司任务 单次任务
|
||
* 当前任务进行天数 < 第一+第二阶段天数 只刷新任务时间
|
||
* 当前任务进行天数 = 第一+第二阶段天数 判定任务是否完成 结算 分润
|
||
*/
|
||
private static function dealTownTask6($taskSchedulePlan)
|
||
{
|
||
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
|
||
$taskTemplateInfo = $taskSchedulePlan['template_info'];
|
||
$taskDayCount = $taskTemplateInfo['day_count']; // 任务累计进行天数
|
||
$task = Task::where('id', $taskSchedulePlan['task_id'])->find();
|
||
$stageDayOneAccumulative = $taskTemplateInfo['stage_day_one']; // 第一阶段累计天数
|
||
$stageDayTwoAccumulative = intval(bcadd($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['stage_day_two'])); // 第二阶段累计天数 第一+第二
|
||
$townCompany = Company::where('id', $taskTemplateInfo['company_id'])->find(); // 镇农科公司
|
||
$villageCompanyList = Company::where(['street' => $townCompany['street'], 'company_type'=> 17])->select()->toArray(); // 村管理公司
|
||
|
||
// 当前任务进行天数 < 第一+第二阶段天数 只刷新任务时间
|
||
if ($taskDayCount < $stageDayOneAccumulative) {
|
||
self::flushTaskTime($taskSchedulePlan);
|
||
return true;
|
||
}
|
||
|
||
// 当前任务进行天数 = 第一+第二阶段天数 判定任务是否完成 结算 分润
|
||
if($taskDayCount == $stageDayTwoAccumulative) {
|
||
// 小组服务公司总数
|
||
$groupServiceCompanyCount = Company::where(['street' => $townCompany['street'], 'company_type'=> 18])->count();
|
||
|
||
// 小组服务完成股金上交数
|
||
$sharecapitalPaidCount= Db::name('company_sharecapital_change_log')->where(['parent_company_id'=>$villageCompanyList['id']])->count();
|
||
|
||
$rate = bcdiv($sharecapitalPaidCount, $groupServiceCompanyCount, 2);
|
||
|
||
// 小于50% 未完成 关闭任务
|
||
if (bccomp($rate, 0.5, 2) == -1) {
|
||
(new Task())->closeTask($taskSchedulePlan['task_id']);
|
||
} else {
|
||
// 已完成 计算结算金额
|
||
$totalMoney = bcadd(bcmul($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['money'], 2) , bcmul($taskTemplateInfo['stage_day_two'], $taskTemplateInfo['money_two'], 2), 2);
|
||
// =50% - %59.9 x40%
|
||
if (bccomp($rate, 0.5, 2) == 0 || (bccomp($rate, 0.5, 2) == 1 && bccomp($rate, 0.599, 2) == -1)) {
|
||
$task['money'] = bcmul($totalMoney, 0.4, 2);
|
||
}
|
||
// =60% - %69.9 x50%
|
||
if (bccomp($rate, 0.6, 2) == 0 || (bccomp($rate, 0.6, 2) == 1 && bccomp($rate, 0.699, 2) == -1)) {
|
||
$task['money'] = bcmul($totalMoney, 0.5, 2);
|
||
}
|
||
|
||
// =70% - %79.9 x60%
|
||
if (bccomp($rate, 0.7, 2) == 0 || (bccomp($rate, 0.7, 2) == 1 && bccomp($rate, 0.799, 2) == -1)) {
|
||
$task['money'] = bcmul($totalMoney, 0.6, 2);
|
||
}
|
||
|
||
// =80% - %89.9 x70%
|
||
if (bccomp($rate, 0.8, 2) == 0 || (bccomp($rate, 0.8, 2) == 1 && bccomp($rate, 0.899, 2) == -1)) {
|
||
$task['money'] = bcmul($totalMoney, 0.7, 2);
|
||
}
|
||
// >=90% x100%
|
||
if (bccomp($rate, 0.9, 2) == 0 || bccomp($rate, 0.9, 2) == 1) {
|
||
$task['money'] = $totalMoney;
|
||
}
|
||
// 分润
|
||
(new TownShareProfit())->townTaskType6($task, $townCompany, $taskSchedulePlan);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 安全任务结算
|
||
private static function dealTownTask7($taskSchedulePlan)
|
||
{
|
||
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
|
||
$taskTemplateInfo = $taskSchedulePlan['template_info'];
|
||
|
||
$townCompany = Company::where('id', $taskTemplateInfo['company_id'])->find(); // 镇农科公司
|
||
$task = Task::where('id', $taskSchedulePlan['task_id'])->find();
|
||
|
||
// 片区下公司有任一投诉都判定为未完成
|
||
$isDone = 1;
|
||
$companyList = Company::where('street', $townCompany['street'])->select()->toArray();
|
||
foreach ($companyList as $company) {
|
||
$complain = CompanyComplaintFeedback::where(['company_id'=>$company['id']])->whereDay('create_time', 'today')->find();
|
||
if (!empty($complain)) {
|
||
$isDone = 0;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 完成任务 结算 分润
|
||
if ($isDone === 1) {
|
||
(new TownShareProfit())->townTaskType7($task, $townCompany, $taskSchedulePlan);
|
||
} else {
|
||
// 关闭任务
|
||
(new Task())->closeTask($task['id']);
|
||
}
|
||
|
||
}
|
||
}
|