From 0e5697f4541f89e213f3066c76ceefa8ff9d80d2 Mon Sep 17 00:00:00 2001
From: chenbo <709206448@qq.com>
Date: Sat, 23 Sep 2023 10:38:07 +0800
Subject: [PATCH] =?UTF-8?q?=E9=95=87=E7=AE=A1=E7=90=86=E5=85=AC=E5=8F=B8?=
 =?UTF-8?q?=E4=BB=BB=E5=8A=A1-=E4=BB=BB=E5=8A=A15=E7=BB=93=E7=AE=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/common/logic/finance/TownShareProfit.php  |  21 ++++
 app/common/logic/task/TaskLogic.php           | 104 ++++++++++++------
 .../model/task_template/TaskTemplate.php      |   4 +
 3 files changed, 94 insertions(+), 35 deletions(-)

diff --git a/app/common/logic/finance/TownShareProfit.php b/app/common/logic/finance/TownShareProfit.php
index 934a92a8a..c7da1bde6 100644
--- a/app/common/logic/finance/TownShareProfit.php
+++ b/app/common/logic/finance/TownShareProfit.php
@@ -8,6 +8,7 @@ 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\UserAccountLog;
 use app\common\model\user\User;
 use think\facade\Db;
@@ -84,6 +85,26 @@ class TownShareProfit
             return false;
         }
     }
+
+    public function townTaskType5($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]);
+            // 更新镇交易池
+            (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;
+        }
+    }
     /**
      * 分润
      */
diff --git a/app/common/logic/task/TaskLogic.php b/app/common/logic/task/TaskLogic.php
index 40992d22c..433c5cb3d 100644
--- a/app/common/logic/task/TaskLogic.php
+++ b/app/common/logic/task/TaskLogic.php
@@ -25,6 +25,7 @@ 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;
 
@@ -408,42 +409,47 @@ class TaskLogic extends BaseLogic
      */
     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']]){
+        try {
+            $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;
+                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;
+            }
+        } catch (Exception $e) {
+            Log::error('镇管理任务结算失败'.$e->getMessage());
         }
+
     }
 
     /**
@@ -734,16 +740,44 @@ class TaskLogic extends BaseLogic
         }
     }
 
+    /**
+     * 查镇所属小组服务公司当日实际完成金额总和+镇管理公司的资金池
+     * 查镇所属小组服务公司当日任务目标金额总和
+     */
     private static function dealTownTask5($taskSchedulePlan)
     {
         $taskTemplateInfo = $taskSchedulePlan['template_info'];
-        $taskScheduleInfo = $taskSchedulePlan['scheduling'];
+        $townCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
+        $townTask = Task::where('id', $taskSchedulePlan['task_id'])->find();
+        $groupServiceCompanyList = Company::where(['street' => $townCompany['street']])->select()->toArray();
+        $townTransactionPool = $taskTemplateInfo['transaction_pool']; // 镇交易池
+        $townTotalTradeAmount = 0; // 镇下属小组服务公司 每日实际总交易额
+        $targetAmount = 0; // 镇下属小组服务公司每日 目标总交易额
+        // 查镇所属小组服务公司当日任务目标金额总和
+        foreach ($groupServiceCompanyList as $groupServiceCompany) {
+            $tempTask = Task::withJoin(['task_schedule_plan'],'left')->where('task_schedule_plan.is_pay', 1)->where(['company_id'=> $groupServiceCompany['id'], 'status'=>3, 'type'=>33])->whereDay('start_time','today')->find();
+            if ($tempTask) {
+                $extend = json_decode($tempTask['extend'], true);
+                $targetAmount += $extend['transaction']['arr']['day_money'];
+                $townTotalTradeAmount += $extend['transaction']['arr']['total_price'];
+            }
+        }
+        // 完成条件: 查镇所属小组服务公司当日实际完成金额总和+镇管理公司的资金池 > 查镇所属小组服务公司当日任务目标金额总和
+        if(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)
     {
         $taskTemplateInfo = $taskSchedulePlan['template_info'];
         $taskScheduleInfo = $taskSchedulePlan['scheduling'];
+
     }
 
     private static function dealTownTask7($taskSchedulePlan)
diff --git a/app/common/model/task_template/TaskTemplate.php b/app/common/model/task_template/TaskTemplate.php
index f8c37a3d9..f3bceeb99 100644
--- a/app/common/model/task_template/TaskTemplate.php
+++ b/app/common/model/task_template/TaskTemplate.php
@@ -53,4 +53,8 @@ class TaskTemplate extends BaseModel
             return json_decode($value,true);
         }
     }
+    public function updateTransactionPool($id, $transactionPool)
+    {
+        return TaskTemplate::where('id', $id)->save(['transaction_pool' => $transactionPool]);
+    }
 }
\ No newline at end of file