add 村联络员任务下发,结算判定,分润.无法自动判定的任务的提交和审批以及结算。

This commit is contained in:
chenbo 2023-10-23 17:31:01 +08:00
parent 3f164288ac
commit 73f79b6036
9 changed files with 748 additions and 10 deletions

View File

@ -56,7 +56,7 @@ class ApproveController extends BaseAdminController
}
Db::commit();
// 结算
// 镇农科公司任务-数字农贸宣传业务、加工业务的建设和招商工作任务 结算
if ($approve->type == Approve::APPROVE_TYPE_4) {
$taskSchedulePlan = TaskSchedulingPlan::where('la_task_scheduling_plan.id', $task['scheduling_plan_id'])
->where('is_pay',0)
@ -67,6 +67,17 @@ class ApproveController extends BaseAdminController
->toArray();
TaskLogic::dealTaskMarketingDirector10($taskSchedulePlan, $approve);
}
if ($approve->type == Approve::APPROVE_TYPE_5) {
$taskSchedulePlan = TaskSchedulingPlan::where('la_task_scheduling_plan.id', $task['scheduling_plan_id'])
->where('is_pay',0)
->with(['template_info'])
->withJoin(['scheduling'], 'left')
->where('scheduling.company_type', 17)
->find()
->toArray();
TaskLogic::dealVillageTask6($taskSchedulePlan, $approve);
}
}
// 拒绝

View File

@ -101,5 +101,10 @@ class DictDataController extends BaseAdminController
return $this->data($result);
}
public function getTaskApproveTypeList()
{
$result = DictDataLogic::getTaskApproveTypeList();
return $this->data($result);
}
}

View File

@ -84,4 +84,9 @@ class DictDataLogic extends BaseLogic
{
return DictData::whereIn('id', [30,16,41])->order('sort')->select()->toArray();
}
public static function getTaskApproveTypeList()
{
return DictData::where(['type_value' => 'task_approve_type', 'status' => 1])->column('value');
}
}

View File

@ -6,6 +6,7 @@ use app\job\TaskInformationJob;
use app\job\TownTaskAdd;
use app\job\TownTaskSettlementJob;
use app\job\VillageTaskAdd;
use app\job\VillageTaskSettlementJob;
use think\facade\Log;
use app\common\model\Company;
use app\common\model\task_template\TaskTemplate;
@ -136,7 +137,12 @@ class CronController extends BaseApiController
//任务下发
$time = strtotime(date('Y-m-d'));
// 查询系统 所有镇农科公司 未下发 的 任务安排
$taskSchedulingList = TaskScheduling::where('cron_time', '<', $time)->where('status', 1)->where('company_type', 17)->with('company_info')->select()->toArray();
$taskSchedulingList = TaskScheduling::where('cron_time', '<', $time)
->where('status', 1)
->where('company_type', 17)
->with('company_info')
->select()
->toArray();
$taskSchedulingIds = [];
$companyIds = [];
@ -158,4 +164,25 @@ class CronController extends BaseApiController
Log::info('村管理公司定时任务下发执行成功' . date('Y-m-d H:i:s'));
return $this->success('村管理公司定时任务下发执行成功');
}
/**
* 村管理公司任务结算
*/
public function village_task_settlement()
{
Log::info('村管理公司定时任务结算执行-开始'.date('Y-m-d H:i:s'));
//today 今日未结算的任务计划
$taskSchedulingPlanList = TaskSchedulingPlan::whereDay('end_time','today')
->withJoin(['scheduling'], 'left')
->where('scheduling.company_type', 17)
->where('is_pay',0)
->with(['template_info'])
->select()
->toArray();
foreach($taskSchedulingPlanList as $taskSchedulingPlan){
queue(VillageTaskSettlementJob::class, $taskSchedulingPlan);
}
Log::info('村管理公司定时任务结算执行-结束'.date('Y-m-d H:i:s'));
return $this->success('村管理公司定时任务结算执行成功');
}
}

View File

@ -189,4 +189,20 @@ class ShopRequestLogic extends BaseLogic
return false;
}
}
/**
* 查询村管理公司负责片区内的种养殖商户交易额
*/
public static function getPlantingAndBreedingMerchantTradeAmount($param)
{
try {
$requestResponse = HttpClient::create()->request('GET', self::$shopUrlPrefix . '', [
'query' => $param
]);
return $requestResponse->getContent();
} catch (Exception $e) {
self::setError($e->getMessage());
return false;
}
}
}

View File

@ -0,0 +1,196 @@
<?php
namespace app\common\logic\finance;
use app\common\enum\user\AccountLogEnum;
use app\common\model\Company;
use app\common\model\company\CompanyAccountLog;
use app\common\model\task\Task;
use app\common\model\task_scheduling_plan\TaskSchedulingPlan;
use app\common\model\task_template\TaskTemplate;
use app\common\model\user\User;
use think\facade\Db;
use think\facade\Log;
class VillageShareProfit
{
/**
* 分润
*/
public function shareProfit($taskInfo, $company, $taskSchedulePlan)
{
$proportion = 0;
//总金额除以2等于不可提现账号金额和收益
$masterMoney = bcdiv($taskInfo['money'], 2, 2);
$remark = '来自任务【' . $taskSchedulePlan['template_info']['title'] . '】,';
$liaisonMan = (new User())->searchLiaisonMan($company['id']);
Log::info([$taskSchedulePlan['template_info']['title'].'结算-村联络员用户信息', $liaisonMan]);
// 用户收益变动
$arr = [$liaisonMan['id'], AccountLogEnum::UM_INC_TASK, AccountLogEnum::INC, $masterMoney, $taskSchedulePlan['sn'], $remark.'任务结算获得收益' . $masterMoney . '元', ['company_id' => $company['id'], 'proportion' => $proportion], 1];
$this->master($arr);
// 用户余额变动
$arr_two = [$liaisonMan['id'], AccountLogEnum::UM_INC_TASKUSER, AccountLogEnum::INC, $masterMoney, $taskSchedulePlan['sn'], $remark . '获得账户余额' . $masterMoney . '元', ['company_id' => $company['id'], 'proportion' => $proportion], 1];
$this->Account($arr_two);
// 公司收益
$deposit_count = bcadd($company['deposit'], $masterMoney, 2);
// 公司收益变动记录
$this->AccountLog($company['id'], $deposit_count, $masterMoney, 1, CompanyAccountLog::TASK_INC_INCOME);
$company_money_count = bcadd($company['company_money'], $masterMoney, 2);
//公司余额变动记录
$this->AccountLog($company['id'], $company_money_count, $masterMoney, 1, CompanyAccountLog::TASK_INC_COMPANY_MONEY);
// 变更公司收益和余额
Company::where('id', $company['id'])->update(['deposit' => Db::raw('deposit+' . $masterMoney), 'company_money' => Db::raw('company_money+' . $masterMoney)]);
}
public function dealVillageTaskSettlement1(Task $taskInfo, Company $townCompany, $taskSchedulePlan)
{
try {
Db::startTrans();
$this->shareProfit($taskInfo, $townCompany, $taskSchedulePlan);
// 更改结算状态
(new TaskSchedulingPlan())->settlement($taskSchedulePlan['id']);
// 更改任务状态
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 3,'money' => $taskInfo['money']]);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error($taskSchedulePlan['template_info']['title'].'-任务结算失败:' . $e->getMessage());
return false;
}
}
public function dealVillageTaskSettlement2($taskInfo, $townCompany, $taskSchedulePlan, $leftTransactionPool)
{
try {
Db::startTrans();
$this->shareProfit($taskInfo, $townCompany, $taskSchedulePlan);
// 更改结算状态
(new TaskSchedulingPlan())->settlement($taskSchedulePlan['id']);
// 更改任务状态
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 3,'money' => $taskInfo['money']]);
// 更新镇交易池
(new TaskTemplate())->updateTransactionPool($taskSchedulePlan['template_info']['id'], $leftTransactionPool);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error($taskSchedulePlan['template_info']['title'].'-任务结算失败:' . $e->getMessage());
return false;
}
}
public function dealVillageTaskSettlement3($taskInfo, $townCompany, $taskSchedulePlan, $leftTransactionPool)
{
try {
Db::startTrans();
$this->shareProfit($taskInfo, $townCompany, $taskSchedulePlan);
// 更改结算状态
(new TaskSchedulingPlan())->settlement($taskSchedulePlan['id']);
// 更改任务状态
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 3,'money' => $taskInfo['money']]);
// 更新镇交易池
(new TaskTemplate())->updateTransactionPool($taskSchedulePlan['template_info']['id'], $leftTransactionPool);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error($taskSchedulePlan['template_info']['title'].'-任务结算失败:' . $e->getMessage());
return false;
}
}
public function dealVillageTaskSettlement4(Task $taskInfo, Company $townCompany, $taskSchedulePlan)
{
try {
Db::startTrans();
$this->shareProfit($taskInfo, $townCompany, $taskSchedulePlan);
// 更改结算状态
(new TaskSchedulingPlan())->settlement($taskSchedulePlan['id']);
// 更改任务状态
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 3,'money' => $taskInfo['money']]);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error($taskSchedulePlan['template_info']['title'].'-任务结算失败:' . $e->getMessage());
return false;
}
}
public function dealVillageTaskSettlement5(Task $taskInfo, Company $townCompany, $taskSchedulePlan)
{
try {
Db::startTrans();
$this->shareProfit($taskInfo, $townCompany, $taskSchedulePlan);
// 更改结算状态
(new TaskSchedulingPlan())->settlement($taskSchedulePlan['id']);
// 更改任务状态
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 3,'money' => $taskInfo['money']]);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error($taskSchedulePlan['template_info']['title'].'-任务结算失败:' . $e->getMessage());
return false;
}
}
public function dealVillageTaskSettlement6(Task $taskInfo, Company $townCompany, $taskSchedulePlan)
{
try {
Db::startTrans();
$this->shareProfit($taskInfo, $townCompany, $taskSchedulePlan);
// 更改结算状态
(new TaskSchedulingPlan())->settlement($taskSchedulePlan['id']);
// 更改任务状态
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 3,'money' => $taskInfo['money']]);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error($taskSchedulePlan['template_info']['title'].'-任务结算失败:' . $e->getMessage());
return false;
}
}
public function dealVillageTaskSettlement7(Task $taskInfo, Company $townCompany, $taskSchedulePlan)
{
try {
Db::startTrans();
$this->shareProfit($taskInfo, $townCompany, $taskSchedulePlan);
// 更改结算状态
(new TaskSchedulingPlan())->settlement($taskSchedulePlan['id']);
// 更改任务状态
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 3,'money' => $taskInfo['money']]);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error($taskSchedulePlan['template_info']['title'].'-任务结算失败:' . $e->getMessage());
return false;
}
}
public function dealVillageTaskSettlement8(Task $taskInfo, Company $townCompany, $taskSchedulePlan)
{
try {
Db::startTrans();
$this->shareProfit($taskInfo, $townCompany, $taskSchedulePlan);
// 更改结算状态
(new TaskSchedulingPlan())->settlement($taskSchedulePlan['id']);
// 更改任务状态
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 3,'money' => $taskInfo['money']]);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error($taskSchedulePlan['template_info']['title'].'-任务结算失败:' . $e->getMessage());
return false;
}
}
}

View File

@ -16,7 +16,9 @@ namespace app\common\logic\task;
use app\common\logic\finance\TownShareProfit;
use app\common\logic\finance\VillageShareProfit;
use app\common\logic\ShopRequestLogic;
use app\common\model\company\CompanyAccountLog;
use app\common\model\CompanyComplaintFeedback;
use app\common\model\contract\Contract;
use app\common\model\dict\DictData;
@ -325,7 +327,7 @@ class TaskLogic extends BaseLogic
Log::info(['村管理公司定时任务下发-添加plan结果', $TaskSchedulingPlan]);
// 添加任务
$task_id = self::addTask($taskTemplate, $TaskSchedulingPlan, $time, $directorUid);
$task_id = self::addVillageTask($taskTemplate, $TaskSchedulingPlan, $time, $directorUid);
Log::info(['村管理公司定时任务下发-添加task结果', $task_id]);
// 关联任务计划和任务
@ -340,6 +342,81 @@ class TaskLogic extends BaseLogic
Log::error(['村管理公司定时任务添加失败', $e->getFile(), $e->getLine(), $e->getMessage()]);
}
}
private static function addVillageTask($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;
$data['money'] = self::countVillageTaskMoney($taskTemplate);
$task_id = (new Task())->insertGetId($data);
return $task_id;
}
private static function countVillageTaskMoney($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' => 'village_task_type', 'status' => 1])->column('value', 'id');
if (isset($townTaskTypeList[$template['type']]) && $townTaskTypeList[$template['type']]=== 'village_task_type_2') {
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 && $template['stage_day_three'] == 0) {
// 第三阶段为空,返回长期金额
return $template['money_three'];
} else if ( $stageDayTwoAccumulative < $v_day_count && $v_day_count <=$stageDayThreeAccumulative) {
// 第三阶段金额
return $template['new_money_three'];
} else {
// 长期金额
return $template['money_three'];
}
}
}
/**
* 定时添加任务
@ -644,7 +721,8 @@ class TaskLogic extends BaseLogic
$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();
$groupServiceCompanyList = Db::query("select * from la_company where company_type=:company_type and FIND_IN_SET(:street,responsible_area)", ['company_type' => 18,'street'=>$townCompany['street']], true);
// $groupServiceCompanyList = Company::where(['street' => $townCompany['street'], 'company_type' => 18])->select()->toArray();
$isDone = 1; // 任务是否完成标记
$isTaskSchedule = 0; // 下属小组服务公司是否有每日任务安排标记
@ -1664,7 +1742,8 @@ class TaskLogic extends BaseLogic
$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();
$groupServiceCompanyList = Db::query("select * from la_company where company_type=:company_type and FIND_IN_SET(:street,responsible_area)", ['company_type' => 18,'street'=>$townCompany['street']], true);
// $groupServiceCompanyList = Company::where(['street' => $townCompany['street'], 'company_type' => 18])->select()->toArray();
$isDone = 1; // 任务是否完成标记
$isTaskSchedule = 0; // 下属小组服务公司是否有每日任务安排标记
@ -1806,7 +1885,8 @@ class TaskLogic extends BaseLogic
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();
$groupServiceCompanyList = Db::query("select * from la_company where company_type=:company_type and FIND_IN_SET(:street,responsible_area)", ['company_type' => 18,'street'=>$townCompany['street']], true);
// $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);
@ -1953,7 +2033,9 @@ class TaskLogic extends BaseLogic
$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();
// $groupServiceCompanyList = Company::where(['street' => $townCompany['street'], 'company_type'=> 18])->select()->toArray();
$groupServiceCompanyList = Db::query("select * from la_company where company_type=:company_type and FIND_IN_SET(:street,responsible_area)", ['company_type' => 18,'street'=>$townCompany['street']], true);
$townTransactionPool = $taskTemplateInfo['transaction_pool']; // 镇交易池
$townTotalTradeAmount = 0; // 镇下属小组服务公司 每日实际总交易额
$targetAmount = 0; // 镇下属小组服务公司每日 目标总交易额
@ -2083,39 +2165,407 @@ class TaskLogic extends BaseLogic
public static function villageTaskSettlement($taskSchedulePlan)
{
try {
Log::info(['镇农科公司定时任务结算执行-任务计划', $taskSchedulePlan]);
Log::info(['存管理公司定时任务结算执行-任务计划', $taskSchedulePlan]);
$taskTemplateInfo = $taskSchedulePlan['template_info'];
// 任务类型用的数据字典主键id将id和value作映射避免测试和正式环境数据字典数据不一致时出问题
$townTaskTypeList = DictData::where(['type_value' => 'village_task_type', 'status' => 1])->column('value', 'id');
switch ($townTaskTypeList[$taskTemplateInfo['type']]){
// 组建小组服务团队
case 'village_task_type_1':
self::dealVillageTask1($taskSchedulePlan);
break;
// 协助小组服务团队完成辖区内的交易任务
case 'village_task_type_2':
self::dealVillageTask2($taskSchedulePlan);
break;
// 负责辖区内农产品安检和溯源
case 'village_task_type_3':
self::dealVillageTask3($taskSchedulePlan);
break;
// 督促小组服务团队入股
case 'village_task_type_4':
self::dealVillageTask4($taskSchedulePlan);
break;
// 入股甲方公司
case 'village_task_type_5':
self::dealVillageTask5($taskSchedulePlan);
break;
// 信息平台铺设工作
case 'village_task_type_6':
// 该任务的判定都需要上传资料,后台审批任务是否完成. 因此每天自动结算时,任务状态不为完成的,都做关闭任务处理
$task = Task::where(['id'=>$taskSchedulePlan['task_id']])->find();
if ($task['status'] != 3) {
(new Task())->closeTask($taskSchedulePlan['task_id']);
}
break;
// 种养殖基地订单匹配
case 'village_task_type_7':
self::dealVillageTask7($taskSchedulePlan);
break;
// 日常管理及其他临时任务
case 'village_task_type_8':
// 该任务的判定都需要上传资料,后台审批任务是否完成. 因此每天自动结算时,任务状态不为完成的,都做关闭任务处理
$task = Task::where(['id'=>$taskSchedulePlan['task_id']])->find();
if ($task['status'] != 3) {
(new Task())->closeTask($taskSchedulePlan['task_id']);
}
break;
default:
return true;
}
} catch (Exception $e) {
Log::error(['镇农科任务结算失败',$e->getFile(), $e->getLine(), $e->getMessage()]);
Log::error(['村管理任务结算失败',$e->getFile(), $e->getLine(), $e->getMessage()]);
}
}
/**
* @param $taskSchedulePlan
* 组建小组服务团队 单次任务
* 任务累计天数 < 第一阶段+第二阶段 刷新任务
* 任务累计天数 = 第一阶段+第二阶段 任务判定,计算金额,结算分润
*/
private static function dealVillageTask1($taskSchedulePlan)
{
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$dayCount = $taskTemplateInfo['day_count'];
$target = $taskTemplateInfo['extend']['target'];
$stageDayCount = bcadd($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['stage_day_two']);
$villageCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
$task = Task::where('id', $taskSchedulePlan['task_id'])->find();
// 村地区码与村管理公司一样且在村管理公司负责小队中
$groupServiceCompanyList = Company::where(['village' => $villageCompany['village'], 'company_type'=> 18])->whereIn('brigade', $villageCompany['responsible_area'])->select()->toArray();
// 任务累计天数 < 第一阶段+第二阶段 刷新任务
if ($dayCount < $stageDayCount) {
self::flushTaskTime($taskSchedulePlan);
return true;
}
// 任务累计天数 = 第一阶段+第二阶段 任务判定,计算金额,结算分润
if ($dayCount == $stageDayCount) {
$totalMoney = bcadd(bcmul($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['money'], 2), bcmul($taskTemplateInfo['stage_day_two'], $taskTemplateInfo['money_two'], 2), 2) ;
$taskMoney = 0;
$groupServiceCompanyCount = count($groupServiceCompanyList);
$rate = bcdiv($groupServiceCompanyCount, $target, 2);
if (bccomp($rate, 0.5, 2) == -1) {
self::flushTaskTime($taskSchedulePlan);
return true;
}
if (bccomp($rate, 0.5, 2) == 0 || bccomp($rate, 0.5, 2) == 1 || bccomp(0.8, $rate, 2) == 1) {
$taskMoney = bcmul($totalMoney, bcmul($rate, 0.6, 2), 2);
}
if (bccomp($rate, 0.8, 2) == 0 || bccomp($rate, 0.8, 2)) {
$taskMoney = bcmul($totalMoney, bcmul($rate, 1, 2), 2);
}
$task['money'] = $taskMoney;
(new VillageShareProfit())->dealVillageTaskSettlement1($task, $villageCompany, $taskSchedulePlan);
}
}
/**
* @param $taskSchedulePlan
* 协助小组服务团队完成交易任务
*
*/
private static function dealVillageTask2($taskSchedulePlan)
{
Log::info(['村管理公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$villageCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
$task = Task::where('id', $taskSchedulePlan['task_id'])->find();
$groupServiceCompanyList = Company::where(['village' => $villageCompany['village'], 'company_type'=> 18])->whereIn('brigade', $villageCompany['responsible_area'])->select()->toArray();
$villageTransactionPool = $taskTemplateInfo['transaction_pool']; // 村交易池
$villageTotalTradeAmount = 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'];
$villageTotalTradeAmount += $extend['transaction']['arr']['total_price'];
}
}
}
// 完成条件: 查村所属小组服务公司当日实际完成金额总和+村管理公司的资金池 > 查镇所属小组服务公司当日任务目标金额总和
if($targetAmount != 0 && bcadd($villageTransactionPool, $villageTotalTradeAmount, 2) >= bcmul($targetAmount, 0.8, 2)) {
// 将余下金额放入镇交易池
$leftTransactionPool = bcsub(bcadd($villageTransactionPool, $villageTotalTradeAmount, 2), $targetAmount, 2);
(new VillageShareProfit())->dealVillageTaskSettlement2($task, $villageCompany, $taskSchedulePlan, $leftTransactionPool);
} else {
// 关闭任务
(new Task())->closeTask($taskSchedulePlan['task_id']);
}
}
/**
* @param $taskSchedulePlan
* 负责辖区内农产品安检和溯源
*/
private static function dealVillageTask3($taskSchedulePlan)
{
Log::info(['村管理公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$villageCompany = Company::where('id', $taskTemplateInfo['company_id'])->find(); // 村管理公司
$task = Task::where('id', $taskSchedulePlan['task_id'])->find();
// 片区下公司有任一投诉都判定为未完成
$isDone = 1;
$companyList = Company::where(['village' => $villageCompany['village'], 'company_type'=> 18])
->whereIn('brigade', $villageCompany['responsible_area'])
->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 VillageShareProfit())->dealVillageTaskSettlement3($task, $villageCompany, $taskSchedulePlan);
} else {
// 关闭任务
(new Task())->closeTask($task['id']);
}
}
/**
* @param $taskSchedulePlan
* 督促小组服务团队入股
*/
private static function dealVillageTask4($taskSchedulePlan)
{
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$dayCount = $taskTemplateInfo['day_count'];
$target = $taskTemplateInfo['extend']['target'];
$stageDayCount = bcadd($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['stage_day_two']);
$villageCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
$task = Task::where('id', $taskSchedulePlan['task_id'])->find();
// 村地区码与村管理公司一样且在村管理公司负责小队中
$groupServiceCompanyList = Company::where(['village' => $villageCompany['village'], 'company_type'=> 18])->whereIn('brigade', $villageCompany['responsible_area'])->select()->toArray();
// 任务累计天数 < 第一阶段+第二阶段 刷新任务
if ($dayCount < $stageDayCount) {
self::flushTaskTime($taskSchedulePlan);
return true;
}
// 任务累计天数 = 第一阶段+第二阶段 任务判定,计算金额,结算分润
if ($dayCount == $stageDayCount) {
$totalMoney = bcadd(bcmul($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['money'], 2), bcmul($taskTemplateInfo['stage_day_two'], $taskTemplateInfo['money_two'], 2), 2) ;
$groupServiceCompanyCount = count($groupServiceCompanyList);
$rate = bcdiv($groupServiceCompanyCount, $target, 2);
if (bccomp($rate, 0.5, 2) == -1) {
(new Task())->closeTask($task['id']);
return true;
}
$task['money'] = self::countSettelmentMoney($rate, $totalMoney);
(new VillageShareProfit())->dealVillageTaskSettlement4($task, $villageCompany, $taskSchedulePlan);
}
}
private static function countSettelmentMoney($rate, $totalMoney)
{
$settlementMoney = 0;
// =50% - %59.9 x40%
if (bccomp($rate, 0.5, 2) == 0 || (bccomp($rate, 0.5, 2) == 1 && bccomp($rate, 0.599, 2) == -1)) {
$settlementMoney= 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)) {
$settlementMoney = 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)) {
$settlementMoney = 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)) {
$settlementMoney = bcmul($totalMoney, 0.7, 2);
}
// >=90% x100%
if (bccomp($rate, 0.9, 2) == 0 || bccomp($rate, 0.9, 2) == 1) {
$settlementMoney = $totalMoney;
}
return $settlementMoney;
}
/**
* @param $taskSchedulePlan
* 入股甲方公司
* 任务累计天数 < 第一+第二阶段天数 刷新任务
* 任务累计天数 = 第一阶段+第二阶段 任务判定,计算金额,结算分润
*/
private static function dealVillageTask5($taskSchedulePlan)
{
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$dayCount = $taskTemplateInfo['day_count'];
$target = $taskTemplateInfo['extend']['target'];
$stageDayCount = bcadd($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['stage_day_two']);
// $townCompany = Db::query("select * from la_company where company_type=:company_type and FIND_IN_SET(:street,responsible_area)", ['company_type' => 41,'street'=>$villageCompany['street']], true)[0];
// 任务累计天数 < 第一+第二阶段天数 刷新任务
if ($dayCount < $stageDayCount) {
self::flushTaskTime($taskSchedulePlan['task_id']);
return true;
}
// 任务累计天数 = 第一阶段+第二阶段 任务判定,计算金额,结算分润
if ($dayCount == $stageDayCount) {
$villageCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
$task = Task::where('id', $taskSchedulePlan['task_id'])->find();
// 小组公司列表 村地区码与村管理公司一样且在村管理公司负责小队
$groupServiceCompanyList = Company::where(['village' => $villageCompany['village'], 'company_type'=> 18])->whereIn('brigade', $villageCompany['responsible_area'])->select()->toArray();
$shareholderedMoney = 0; // 已入股股金总额
// 查询公司股金变动流水记录
$companyIds[] = $villageCompany['id'];
foreach ($groupServiceCompanyList as $company) {
$companyIds[] = $company['id'];
}
// 已入股股金总额
$shareholderedMoney = CompanyAccountLog::where(['change_object'=>CompanyAccountLog::SHAREHOLDER, 'change_type'=>CompanyAccountLog::TASK_INC_SHAREHOLDER_MONEY])
->whereIn('company_id', $companyIds)
->sum('change_amount');
$targetShareholderedMoney = bcadd(bcmul($target, 3000), 6000); // 小组应组建团队数量*3000 + 村 6000
$rate = bcdiv($shareholderedMoney, $targetShareholderedMoney, 2);
$totalMoney = bcadd(bcmul($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['money'], 2), bcmul($taskTemplateInfo['stage_day_two'], $taskTemplateInfo['money_two'], 2), 2) ;
$task['money'] = self::countSettelmentMoney($rate, $totalMoney);
(new VillageShareProfit())->dealVillageTaskSettlement5($task, $villageCompany, $taskSchedulePlan);
}
}
/**
* @param $taskSchedulePlan
* 信息平台铺设工作 app提交凭证后台审批。通过后一次性发送
*/
public static function dealVillageTask6($taskSchedulePlan)
{
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$villageCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
$task = Task::where('id', $taskSchedulePlan['task_id'])->find();
// 结算
$stageDayOneTotalTaskMoney = bcmul($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['money'], 2);
$stageDayTwoTotalTaskMoney = bcmul($taskTemplateInfo['stage_day_two'], $taskTemplateInfo['money_two'], 2);
$taskMoney = bcadd($stageDayOneTotalTaskMoney, $stageDayTwoTotalTaskMoney, 2);
$taskInfo['money'] = $taskMoney;
(new VillageShareProfit())->dealVillageTaskSettlement6($task, $villageCompany, $taskSchedulePlan);
}
/**
* @param $taskSchedulePlan
* 种养殖基地订单匹配
* 任务累计天数 < stage1 关闭任务
* 任务累计天数 = stage1 从商城查询种养殖商户的交易额,判定是否完成任务,完成则结算
* 任务累计天数 < stage1+stage2 关闭任务,不结算
* 任务累计天数 = stage1+stage2 从商城查询种养殖商户的交易额,判定是否完成任务,完成则结算
* 任务累计天数 < stage1 + stage2 + stage3 关闭任务,不结算
* 任务累计天数 = stage1 + stage2 + stage3 从商城查询种养殖商户的交易额,判定是否完成任务,完成
* 任务累计天数 - (stage1 + stage2 + stage3) 不能整除30 关闭任务
* 任务累计天数 - (stage1 + stage2 + stage3) 整除30 从商城查询种养殖商户的交易额,判定是否完成任务,完成
*/
private static function dealVillageTask7($taskSchedulePlan)
{
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$dayCount = $taskTemplateInfo['day_count'];
$target = $taskTemplateInfo['extend']['target'];
$stageDayOne = $taskTemplateInfo['stage_day_one'];
$stageDayTwoCount = bcadd($taskTemplateInfo['stage_day_one'], $taskTemplateInfo['stage_day_two']);
$stageDayThreeCount = bcadd($stageDayTwoCount, $taskTemplateInfo['stage_day_three']);
$villageCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
$task = Task::where('id', $taskSchedulePlan['task_id'])->find();
// 任务累计天数 < stage1 关闭任务
if ($dayCount < $stageDayOne) {
(new Task())->closeTask($taskSchedulePlan['task_id']);
}
// 任务累计天数 = stage1 从商城查询种养殖商户的交易额,判定是否完成任务,完成则结算
if ($dayCount == $stageDayOne) {
$startTime = strtotime(date('Y-m-d',strtotime($taskTemplateInfo['create_time'])))+86400;
$endTime = strtotime('+30 day', $startTime);
self::finishVillageTask7($startTime, $endTime, 13000, $taskTemplateInfo['stage_day_one'], $taskTemplateInfo['money'], $villageCompany, $taskSchedulePlan);
}
// 任务累计天数 < stage1+stage2 关闭任务,不结算
if ($dayCount < $stageDayTwoCount) {
(new Task())->closeTask($taskSchedulePlan['task_id']);
}
// 任务累计天数 = stage1+stage2 从商城查询种养殖商户的交易额,判定是否完成任务,完成则结算
if ($dayCount == $stageDayTwoCount) {
$startTime = strtotime('-30 day', $endTime);
$endTime = strtotime(date('Y-m-d', time()));
self::finishVillageTask7($startTime, $endTime, 17000, $taskTemplateInfo['stage_day_two'], $taskTemplateInfo['money_two'], $villageCompany, $taskSchedulePlan);
}
// 任务累计天数 < stage1 + stage2 + stage3 关闭任务,不结算
if ($dayCount < $stageDayThreeCount) {
(new Task())->closeTask($taskSchedulePlan['task_id']);
}
// 任务累计天数 = stage1 + stage2 + stage3 从商城查询种养殖商户的交易额,判定是否完成任务,完成
if ($dayCount == $stageDayThreeCount) {
$startTime = strtotime('-30 day', $endTime);
$endTime = strtotime(date('Y-m-d', time()));
self::finishVillageTask7($startTime, $endTime, 17000, $taskTemplateInfo['stage_day_three'], $taskTemplateInfo['new_money_three'], $villageCompany, $taskSchedulePlan);
}
// 任务累计天数 - (stage1 + stage2 + stage3) 不能整除30 关闭任务
if ($dayCount > $stageDayThreeCount && $dayCount % 30 != 0) {
(new Task())->closeTask($taskSchedulePlan['task_id']);
}
// 任务累计天数 - (stage1 + stage2 + stage3) 整除30 从商城查询种养殖商户的交易额,,判定是否完成任务,完成
if ($dayCount > $stageDayThreeCount && $dayCount % 30 == 0) {
$startTime = strtotime('-30 day', $endTime);
$endTime = strtotime(date('Y-m-d', time()));
self::finishVillageTask7($startTime, $endTime, 17000, 30, $taskTemplateInfo['money_three'], $villageCompany, $taskSchedulePlan);
}
}
/**
* @param $startTime
* @param $endTime
* @param $targetAmount 任务目标金额
* @param $dayNum 结算周期天数
* @param $perMoney 每天金额
* @param $villageCompany
* @param $taskSchedulePlan
* @return void
*/
private static function finishVillageTask7( $startTime, $endTime, $targetAmount, $dayNum, $perMoney, $villageCompany, $taskSchedulePlan)
{
$param = [
'start_time' => $startTime,
'end_time' => $endTime,
'village' => $villageCompany['village']
];
$tradeAmount = ShopRequestLogic::getPlantingAndBreedingMerchantTradeAmount($param);
if ($tradeAmount >= $targetAmount) {
$task['money'] = bcmul($dayNum, $perMoney, 2);
(new VillageShareProfit())->dealVillageTaskSettlement7($task, $villageCompany, $taskSchedulePlan);
}
}
public static function dealVillageTask8($taskSchedulePlan)
{
}
}

View File

@ -16,6 +16,8 @@ class Approve extends BaseModel
const APPROVE_TYPE_3 = 3; // 开通交易
const APPROVE_TYPE_4 = 4; // 镇农科市场部长数字农贸宣传业务、加工业务的建设和招商任务
const APPROVE_TYPE_5 = 5; // 村联络员任务-信息平台铺设工作任务
public function task()
{
return $this->hasOne(Task::class, 'id', 'task_id');

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 VillageTaskSettlementJob
{
/**
* 镇农科公司任务结算
*/
public function fire(Job $job, $taskSchedulingPlan)
{
TaskLogic::villageTaskSettlement($taskSchedulingPlan);
//如果任务执行成功后 记得删除任务不然这个任务会重复执行直到达到最大重试次数后失败后执行failed方法
$job->delete();
}
}