From 73f79b6036194778318f428a53bdcf0e37ded783 Mon Sep 17 00:00:00 2001 From: chenbo <709206448@qq.com> Date: Mon, 23 Oct 2023 17:31:01 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E6=9D=91=E8=81=94=E7=BB=9C=E5=91=98?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=B8=8B=E5=8F=91=EF=BC=8C=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E5=88=A4=E5=AE=9A=EF=BC=8C=E5=88=86=E6=B6=A6.=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=87=AA=E5=8A=A8=E5=88=A4=E5=AE=9A=E7=9A=84=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=9A=84=E6=8F=90=E4=BA=A4=E5=92=8C=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E7=BB=93=E7=AE=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/approve/ApproveController.php | 13 +- .../setting/dict/DictDataController.php | 5 + .../logic/setting/dict/DictDataLogic.php | 5 + app/api/controller/CronController.php | 29 +- app/common/logic/ShopRequestLogic.php | 16 + .../logic/finance/VillageShareProfit.php | 196 ++++++++ app/common/logic/task/TaskLogic.php | 466 +++++++++++++++++- app/common/model/Approve.php | 2 + app/job/VillageTaskSettlementJob.php | 26 + 9 files changed, 748 insertions(+), 10 deletions(-) create mode 100644 app/common/logic/finance/VillageShareProfit.php create mode 100644 app/job/VillageTaskSettlementJob.php diff --git a/app/adminapi/controller/approve/ApproveController.php b/app/adminapi/controller/approve/ApproveController.php index c28e511a2..0e1161c35 100644 --- a/app/adminapi/controller/approve/ApproveController.php +++ b/app/adminapi/controller/approve/ApproveController.php @@ -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); + } } // 拒绝 diff --git a/app/adminapi/controller/setting/dict/DictDataController.php b/app/adminapi/controller/setting/dict/DictDataController.php index 294dd2fb8..a7558ca72 100755 --- a/app/adminapi/controller/setting/dict/DictDataController.php +++ b/app/adminapi/controller/setting/dict/DictDataController.php @@ -101,5 +101,10 @@ class DictDataController extends BaseAdminController return $this->data($result); } + public function getTaskApproveTypeList() + { + $result = DictDataLogic::getTaskApproveTypeList(); + return $this->data($result); + } } \ No newline at end of file diff --git a/app/adminapi/logic/setting/dict/DictDataLogic.php b/app/adminapi/logic/setting/dict/DictDataLogic.php index f537493aa..aba36e2b2 100755 --- a/app/adminapi/logic/setting/dict/DictDataLogic.php +++ b/app/adminapi/logic/setting/dict/DictDataLogic.php @@ -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'); + } } \ No newline at end of file diff --git a/app/api/controller/CronController.php b/app/api/controller/CronController.php index d629990a1..aded07c40 100644 --- a/app/api/controller/CronController.php +++ b/app/api/controller/CronController.php @@ -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('村管理公司定时任务结算执行成功'); + } } \ No newline at end of file diff --git a/app/common/logic/ShopRequestLogic.php b/app/common/logic/ShopRequestLogic.php index 1fe6cb4d1..d75e2f430 100644 --- a/app/common/logic/ShopRequestLogic.php +++ b/app/common/logic/ShopRequestLogic.php @@ -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; + } + } } \ No newline at end of file diff --git a/app/common/logic/finance/VillageShareProfit.php b/app/common/logic/finance/VillageShareProfit.php new file mode 100644 index 000000000..2ec1a8149 --- /dev/null +++ b/app/common/logic/finance/VillageShareProfit.php @@ -0,0 +1,196 @@ +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; + } + } + +} \ No newline at end of file diff --git a/app/common/logic/task/TaskLogic.php b/app/common/logic/task/TaskLogic.php index 5cd6d0521..ba911b2d5 100644 --- a/app/common/logic/task/TaskLogic.php +++ b/app/common/logic/task/TaskLogic.php @@ -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) + { + + } } diff --git a/app/common/model/Approve.php b/app/common/model/Approve.php index 33d000b6f..0ff18baa0 100644 --- a/app/common/model/Approve.php +++ b/app/common/model/Approve.php @@ -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'); diff --git a/app/job/VillageTaskSettlementJob.php b/app/job/VillageTaskSettlementJob.php new file mode 100644 index 000000000..3da50209c --- /dev/null +++ b/app/job/VillageTaskSettlementJob.php @@ -0,0 +1,26 @@ +delete(); + } +} \ No newline at end of file