镇管理公司任务下发和结算

This commit is contained in:
chenbo 2023-09-21 14:12:55 +08:00
parent 8ec2db7bb6
commit 460d2b65ea
7 changed files with 480 additions and 0 deletions

View File

@ -70,6 +70,15 @@ class LoginLogic extends BaseLogic
if ($params['is_captain']) {
$group_id=2;
}
// 镇管理公司服务部长
if ($params['is_service_manager'] == 1) {
$user = User::where(['company_id' => $params['company_id'], 'group_id' => 14])->find();
if (!empty($user)) {
self::setError('公司已创建服务部长账号');
return false;
}
$group_id=14;
}
User::create([
'sn' => $userSn,
'avatar' => $avatar,

View File

@ -0,0 +1,108 @@
<?php
namespace app\common\logic\finance;
use app\common\enum\user\AccountLogEnum;
use app\common\logic\AccountLogLogic;
use app\common\model\Company;
use app\common\model\company\CompanyAccountLog;
use app\common\model\task\Task;
use app\common\model\user\UserAccountLog;
use app\common\model\user\User;
use think\facade\Db;
use think\facade\Log;
class TownShareProfit
{
public function townTaskType1($taskInfo, $company, $taskSchedulePlan)
{
// if ($company['day_count'] <= $data['proportion_one']) {
// $proportion = $data['proportion_one'];
// } else {
// $proportion = $data['proportion_two'];
// }
Db::startTrans();
try {
$proportion = 0;
//总金额除以2等于不可提现账号金额和收益
$masterMoney = bcdiv($taskInfo['money'], 2, 2);
//收益的25%为负责人的收益 其余为成员的平分收益
$masterUserMoney = bcdiv($masterMoney, 2, 2);
//成员数量
$userAll = User::where('company_id', $company['company_id'])->where('admin_id', 0)->field('id,user_money')->select();
$userAllCount = count($userAll);
// 每个成员的收益
$perUserMoney = bcdiv($masterUserMoney, $userAllCount, 2);
$remark = '来自任务【' . $taskSchedulePlan['template_info']['title'] . '】,完成方:服务部长。';
// 服务部长
$serviceManagerUser = User::where(['company_id' => $company['id'], 'group_id' => 14])->find();
$arr = [$serviceManagerUser['id'], AccountLogEnum::UM_INC_TASK, AccountLogEnum::INC, $masterUserMoney, $taskSchedulePlan['sn'], $remark.'任务结算获得收益' . $masterUserMoney . '元', ['company_id' => $company['id'], 'proportion' => $proportion], 1];
$this->master($arr);
$arr_two = [$serviceManagerUser['id'], AccountLogEnum::UM_INC_TASKUSER, AccountLogEnum::INC, $masterUserMoney, $taskSchedulePlan['sn'], $remark . '获得账户余额' . $masterUserMoney . '元', ['company_id' => $company['id'], 'proportion' => $proportion], 1];
$this->Account($arr_two);
// 成员
foreach ($userAll as $value) {
$arr = [$value['id'], AccountLogEnum::UM_INC_TASK, AccountLogEnum::INC, $perUserMoney, $taskSchedulePlan['sn'], $remark. '获得收益' . $perUserMoney . '元', ['company_id' => $company['id'], 'proportion' => $proportion], 1];
$this->member($arr);
$arr_two = [$value['id'], AccountLogEnum::UM_INC_TASKUSER, AccountLogEnum::INC, $perUserMoney, $taskSchedulePlan['sn'], $remark. '获得账户余额' . $perUserMoney . '元', ['company_id' => $company['id'], 'proportion' => $proportion], 1];
$this->Account($arr_two);
}
// 公司
if ($taskSchedulePlan['company_account_type'] == 1) {
$deposit_count = bcadd($company['deposit'], $masterMoney, 2);
$this->AccountLog($company['id'], $deposit_count, $masterMoney);
$company_money_count = bcadd($company['company_money'], $masterMoney, 2);
$this->AccountLog($company['id'], $company_money_count, $masterMoney);
Company::where('id', $company['id'])->update(['deposit' => Db::raw('deposit+' . $masterMoney), 'company_money' => Db::raw('company_money+' . $masterMoney)]);
}
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error('54-任务结算失败:' . $e->getMessage());
return false;
}
}
public function AccountLog($companyId, $left_amount, $changeAmount, $change_object = 1, $change_type = 1, $action = 1)
{
$company_log = [
'sn' => generate_sn(UserAccountLog::class, 'sn', 20),
'company_id' => $companyId,
'change_object' => $change_object, //变动对象
'change_type' => $change_type, //变动类型
'action' => $action, //1-增加 2-减少
'left_amount' => $left_amount, //变动后数量
'change_amount' => $changeAmount, //变动数量
'status' => 1,
];
CompanyAccountLog::create($company_log);
}
/**负责人的分润
* @param $data
*/
private function master($data)
{
User::where('id', $data[0])->update(['deposit'=>Db::raw('deposit+' . $data[3]),'user_money'=>Db::raw('user_money+' . $data[3])]);
return AccountLogLogic::add($data[0], $data[1], $data[2], $data[3], $data[4], $data[5], $data[6], $data[7]);
}
/**成员分润
* @param $data
*/
private function member($data)
{
User::where('id', $data[0])->update(['deposit'=>Db::raw('deposit+' . $data[3]),'user_money'=>Db::raw('user_money+' . $data[3])]);
return AccountLogLogic::add($data[0], $data[1], $data[2], $data[3], $data[4], $data[5], $data[6], $data[7]);
}
private function Account($data)
{
return AccountLogLogic::add($data[0], $data[1], $data[2], $data[3], $data[4], $data[5], $data[6], $data[7]);
}
}

View File

@ -15,6 +15,8 @@
namespace app\common\logic\task;
use app\common\logic\finance\TownShareProfit;
use app\common\model\dict\DictData;
use app\common\model\task\Task;
use app\common\logic\BaseLogic;
use app\common\model\Company;
@ -281,4 +283,226 @@ class TaskLogic extends BaseLogic
}
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) {
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;
}
}
if ($isDone === 1 && $isTaskSchedule === 1) {
// 下属小组服务公司有任务安排,也完成了任务 做任务结算,分润
(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'];
}
}

23
app/job/TownTaskAdd.php Normal file
View File

@ -0,0 +1,23 @@
<?php
namespace app\job;
use app\common\logic\task\TaskLogic;
use think\queue\Job;
/**
* 镇管理公司任务下发执行的具体逻辑
*/
class TownTaskAdd
{
public function fire(Job $job, $template)
{
if ($job->attempts() > 3) {
//通过这个方法可以检查这个任务已经重试了几次了
}
TaskLogic::TownCronAdd($template);
//如果任务执行成功后 记得删除任务不然这个任务会重复执行直到达到最大重试次数后失败后执行failed方法
$job->delete();
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace app\job;
use app\api\controller\RemoteController;
use app\common\logic\finance\ShareProfit;
use app\common\logic\task\TaskLogic;
use app\common\model\Company;
use app\common\model\task\Task;
use app\common\model\task_scheduling_plan\TaskSchedulingPlan;
use app\common\model\task_template\TaskTemplate;
use think\facade\Log;
use think\queue\Job;
class TownTaskSettlementJob
{
/**
* 镇管理公司任务结算
*/
public function fire(Job $job, $taskSchedulingPlan)
{
TaskLogic::townTaskSettlement($taskSchedulingPlan);
//如果任务执行成功后 记得删除任务不然这个任务会重复执行直到达到最大重试次数后失败后执行failed方法
$job->delete();
}
}

51
app/task/TownTaskCron.php Normal file
View File

@ -0,0 +1,51 @@
<?php
namespace app\task;
use app\common\logic\task\TaskLogic;
use app\common\model\Company;
use app\common\model\task_scheduling\TaskScheduling;
use app\common\model\task_template\TaskTemplate;
use app\job\TaskAdd;
use app\job\TownTaskAdd;
use think\facade\Log;
use yunwuxin\cron\Task;
class TownTaskCron extends Task {
public function configure()
{
$this->daily(); //设置任务的周期,每天执行一次,更多的方法可以查看源代码,都有注释
// $this->everyMinute();//每分钟
}
/**
* 镇管理公司任务下发
*/
protected function execute()
{
//任务下发
$time = strtotime(date('Y-m-d'));
// 查询系统 所有镇管理公司 未下发 的 任务安排
$taskSchedulingList = TaskScheduling::where('cron_time', '<', $time)->where('status', 1)->where('company_type', 41)->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(TownTaskAdd::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'));
}
}

View File

@ -0,0 +1,39 @@
<?php
namespace app\task;
use app\common\model\task_scheduling_plan\TaskSchedulingPlan;
use app\job\TownTaskSettlementJob;
use think\facade\Log;
use yunwuxin\cron\Task;
class TownTaskSettlementCron extends Task
{
public function configure()
{
$this->daily(); //设置任务的周期,每天执行一次,更多的方法可以查看源代码,都有注释
// $this->everyMinute();//每分钟
}
/**
* 镇管理公司任务结算
* @return mixed
*/
protected function execute()
{
Log::info('定时任务结算执行-开始'.date('Y-m-d H:i:s'));
//yesterday 昨日未结算的任务计划
$taskSchedulingPlanList = TaskSchedulingPlan::whereDay('end_time','yesterday')
->withJoin(['scheduling'], 'left')
->where('scheduling.company_type', 41)
->where('is_pay',0)
->with(['template_info'])
->select()
->toArray();
foreach($taskSchedulingPlanList as $taskSchedulingPlan){
queue(TownTaskSettlementJob::class, $taskSchedulingPlan);
}
Log::info('定时任务结算执行-结束'.date('Y-m-d H:i:s'));
//...具体的任务执行
}
}