add:1.商户入驻审批通过时,记录通过时间作为商户入驻时间。shop_merchant_settle_log 2.市场部长任务1,2,3判定和结算

This commit is contained in:
chenbo 2023-10-13 18:19:23 +08:00
parent 6fb8556c59
commit f5f28988e5
6 changed files with 469 additions and 42 deletions

View File

@ -33,7 +33,7 @@ class ApproveController extends BaseApiController
if (!$approve) {
throw new Exception('数据不存在');
}
ApproveLogic::audit($approve, $params);
ApproveLogic::audit($approve, $params, $this->userInfo);
return $this->success('操作成功');
} catch (Exception $exception) {
return $this->fail(ApproveLogic::getError() ?? $exception->getMessage());

View File

@ -0,0 +1,80 @@
<?php
namespace app\common\logic;
use Symfony\Component\HttpClient\HttpClient;
use think\Exception;
class ShopRequestLogic extends BaseLogic
{
public static $shopUrlPrefix;
public function __construct()
{
self::$shopUrlPrefix = env('url.shop_prefix');
parent::__construct();
}
/**
* 查询时间范围内,某一农科公司下的 供应链商户入驻统计
*/
public static function getSupplyChainMerchantCount($param)
{
try {
$requestResponse = HttpClient::create()->request('GET', self::$shopUrlPrefix . '', [
'query' => $param
]);
return $requestResponse->getContent();
} catch (Exception $e) {
self::setError($e->getMessage());
return false;
}
}
/**
* 查询商户入驻5天内是否完成商品上架
*/
public static function getProductListing($param)
{
try {
$requestResponse = HttpClient::create()->request('GET', self::$shopUrlPrefix . '', [
'query' => $param
]);
return $requestResponse->getContent();
} catch (Exception $e) {
self::setError($e->getMessage());
return false;
}
}
/**
* 商户入驻20天后是否完成库存更新
*/
public static function getStockUpdate($param)
{
try {
$requestResponse = HttpClient::create()->request('GET', self::$shopUrlPrefix . '', [
'query' => $param
]);
return $requestResponse->getContent();
} catch (Exception $e) {
self::setError($e->getMessage());
return false;
}
}
/**
* 查询商户采购金额
*/
public static function getPurchaseAmount($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

@ -4,6 +4,7 @@ namespace app\common\logic\approve;
use app\common\logic\BaseLogic;
use app\common\model\Approve;
use app\common\model\ShopMerchantSettleinLog;
use Symfony\Component\HttpClient\HttpClient;
use think\facade\Db;
use think\facade\Log;
@ -11,7 +12,7 @@ use think\facade\Log;
class ApproveLogic extends BaseLogic
{
public static function audit($approve, $params)
public static function audit($approve, $params, $userInfo)
{
// 拒绝通过
if ($params['check_status'] == 3) {
@ -22,7 +23,7 @@ class ApproveLogic extends BaseLogic
}
// 修改任务完成状态
if ($params['check_status'] == 2) {
self::pass($approve);
self::pass($approve,$userInfo);
}
// 回调商城,通知审核状态
@ -32,10 +33,20 @@ class ApproveLogic extends BaseLogic
}
}
private static function pass(Approve $approve)
private static function pass(Approve $approve, $userInfo)
{
Db::startTrans();
$approve->check_status = 2;
$approve->save();
// 记录商户入驻时间,镇农科公司市场部长任务会使用到
$shopMerchantInfo = json_decode($approve['extend'], true);
$data = [
'town_company_id' => $userInfo['company_id'],
'mer_intention_id' => $shopMerchantInfo['mer_intention_id'],
'create_time' => time()
];
ShopMerchantSettleinLog::create($data);
Db::commit();
}
private static function refuse(Approve $approve, $params)

View File

@ -156,9 +156,23 @@ class TownShareProfit
$masterMoney = bcdiv($taskInfo['money'], 2, 2);
$remark = '来自任务【' . $taskSchedulePlan['template_info']['title'] . '】,';
//负责人收益 todo
if ($taskSchedulePlan['template_info']['extend']['task_role'] == 1) {
}
//市场部长收益
if ($taskSchedulePlan['template_info']['extend']['task_role'] == 2) {
$serviceManagerUser = User::where(['company_id' => $company['id'], 'group_id' => 16])->find();
Log::info([$taskSchedulePlan['template_info']['title'].'结算-市场部长用户信息', $serviceManagerUser]);
}
//服务部长收益 任务金额的50%为服务部长的收益
$serviceManagerUser = User::where(['company_id' => $company['id'], 'group_id' => 14])->find();
Log::info([$taskSchedulePlan['template_info']['title'].'结算-服务部长用户信息', $serviceManagerUser]);
if ($taskSchedulePlan['template_info']['extend']['task_role'] == 3) {
$serviceManagerUser = User::where(['company_id' => $company['id'], 'group_id' => 14])->find();
Log::info([$taskSchedulePlan['template_info']['title'].'结算-服务部长用户信息', $serviceManagerUser]);
}
// 用户收益变动
$arr = [$serviceManagerUser['id'], AccountLogEnum::UM_INC_TASK, AccountLogEnum::INC, $masterMoney, $taskSchedulePlan['sn'], $remark.'任务结算获得收益' . $masterMoney . '元', ['company_id' => $company['id'], 'proportion' => $proportion], 1];
$this->master($arr);
@ -213,4 +227,61 @@ class TownShareProfit
{
return AccountLogLogic::add($data[0], $data[1], $data[2], $data[3], $data[4], $data[5], $data[6], $data[7]);
}
/**
*
*/
public function dealTaskSettlementMarketingDirector1($taskInfo, $townCompany, $taskSchedulePlan)
{
try {
Db::startTrans();
$this->shareProfit($taskInfo, $townCompany, $taskSchedulePlan);
// 更改结算状态
(new TaskSchedulingPlan())->settlement($taskSchedulePlan['id']);
// 更改任务状态
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 3]);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error($taskSchedulePlan['template_info']['title'].'-任务结算失败:' . $e->getMessage());
return false;
}
}
public function dealTaskSettlementMarketingDirector2(Task $taskInfo, Company $townCompany, TaskSchedulingPlan $taskSchedulePlan)
{
try {
Db::startTrans();
$this->shareProfit($taskInfo, $townCompany, $taskSchedulePlan);
// 更改结算状态
(new TaskSchedulingPlan())->settlement($taskSchedulePlan['id']);
// 更改任务状态
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 3]);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error($taskSchedulePlan['template_info']['title'].'-任务结算失败:' . $e->getMessage());
return false;
}
}
public function dealTaskSettlementMarketingDirector3(Task $taskInfo, Company $townCompany, TaskSchedulingPlan $taskSchedulePlan)
{
try {
Db::startTrans();
$this->shareProfit($taskInfo, $townCompany, $taskSchedulePlan);
// 更改结算状态
(new TaskSchedulingPlan())->settlement($taskSchedulePlan['id']);
// 更改任务状态
Task::where(['id' => $taskSchedulePlan['task_id']])->update(['status' => 3]);
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
Log::error($taskSchedulePlan['template_info']['title'].'-任务结算失败:' . $e->getMessage());
return false;
}
}
}

View File

@ -16,9 +16,11 @@ namespace app\common\logic\task;
use app\common\logic\finance\TownShareProfit;
use app\common\logic\ShopRequestLogic;
use app\common\model\CompanyComplaintFeedback;
use app\common\model\contract\Contract;
use app\common\model\dict\DictData;
use app\common\model\ShopMerchantSettleinLog;
use app\common\model\task\Task;
use app\common\logic\BaseLogic;
use app\common\model\Company;
@ -508,47 +510,304 @@ class TaskLogic extends BaseLogic
try {
Log::info(['镇农科公司定时任务结算执行-任务计划', $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']]){
// 负责人任务结算 todo
if ($taskTemplateInfo['extend']['task_role'] == 1) {
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;
}
// 市场部长任务结算
if ($taskTemplateInfo['extend']['task_role'] == 2) {
self::marketingManagerTaskSettlement($taskSchedulePlan);
}
// 服务部长任务结算
if ($taskTemplateInfo['extend']['task_role'] == 3) {
self::serviceManagerTaskSettlement($taskSchedulePlan);
}
} catch (Exception $e) {
Log::error(['镇农科任务结算失败',$e]);
Log::error(['镇农科任务结算失败',$e->getFile(), $e->getLine(), $e->getMessage()]);
}
}
/**
* @param $taskSchedulePlan
* 市场部长任务结算
*/
private static function marketingManagerTaskSettlement($taskSchedulePlan)
{
$taskTemplateInfo = $taskSchedulePlan['template_info'];
// 任务类型用的数据字典主键id将id和value作映射避免测试和正式环境数据字典数据不一致时出问题
$townTaskTypeList = DictData::where(['type_value' => 'town_task_type_marketing_director', 'status' => 1])->column('value', 'id');
switch ($townTaskTypeList[$taskTemplateInfo['type']]){
// 协助总负责人开展工作
case 'town_task_type_marketing_director_1':
self::dealTaskMarketingDirector1($taskSchedulePlan);
break;
// 招驻供应链商户
case 'town_task_type_marketing_director_2':
self::dealTaskMarketingDirector2($taskSchedulePlan);
break;
case 'town_task_type_marketing_director_3':
self::dealTaskMarketingDirector3($taskSchedulePlan);
break;
case 'town_task_type_marketing_director_4':
break;
case 'town_task_type_marketing_director_5':
break;
case 'town_task_type_marketing_director_6':
break;
case 'town_task_type_marketing_director_7':
break;
case 'town_task_type_marketing_director_8':
break;
case 'town_task_type_marketing_director_9':
break;
case 'town_task_type_marketing_director_10':
break;
default:
return true;
}
}
/**
* @param $taskSchedulePlan
* 市场部长协助总负责人开展工作 任务完成判定和结算
*/
private static function dealTaskMarketingDirector1($taskSchedulePlan)
{
Log::info(['镇农科公司定时任务结算执行-'.$taskSchedulePlan['template_info']['title']]);
$taskTemplateInfo = $taskSchedulePlan['template_info'];
$taskInfo = Task::where(['id' => $taskSchedulePlan['task_id']])->find();
$townCompany = Company::where(['id' => $taskTemplateInfo['company_id']])->find();
$groupServiceCompanyList = Company::where(['street' => $townCompany['street'], 'company_type' => 18])->select()->toArray();
$isDone = 1; // 任务是否完成标记
$isTaskSchedule = 0; // 下属小组服务公司是否有每日任务安排标记
foreach ($groupServiceCompanyList as $groupServiceCompany) {
// 查询小组服务公司是否有对应的每日任务安排
$templateList = TaskTemplate::where(['company_id' => $groupServiceCompany['id']])->whereIn('type', [31, 32, 33])->select()->toArray();
// 未做任务安排的小组服务公司不在判定范围内,跳出本次循环
if(count($templateList) === 3) {
$isTaskSchedule = 1;
// 查询小组服务公司的循环任务有没有全部做完 任意有一个任务没有做完,则判定为该小组服务公司没有完成每日任务,即协助总负责人开展工作任务也认定失败
foreach ($templateList as $template) {
$task = Task::where(['template_id' => $template['id'], 'status' => 3])->find();
if (empty($task)) {
$isDone = 0;
break;
}
}
}
}
// 下属小组服务公司有任务安排,也完成了任务
if ($isDone === 1 && $isTaskSchedule === 1) {
// 做任务结算,分润
(new TownShareProfit())->dealTaskSettlementMarketingDirector1($taskInfo, $townCompany, $taskSchedulePlan);
} else {
// 关闭任务
(new Task())->closeTask($taskSchedulePlan['task_id']);
Log::info('协助总负责人开展工作任务,结算失败:' . $taskTemplateInfo['title'] . '未完成。任务:' . json_encode($taskInfo));
}
}
/**
* 招驻供应链商户 单次任务 任务完成判定和结算
* 判定条件 任务下发60天内供应链商户在商城开户并缴纳押金不少于5000>=6
* 当前任务进行天数 < 第一阶段天数 只刷新任务时间
* 当前任务进行天数 = 第一阶段天数 判定任务完成情况,结算
*/
private static function dealTaskMarketingDirector2($taskSchedulePlan)
{
$templateInfo = $taskSchedulePlan['template_info'];
$dayCount = $templateInfo['day_count'];
$townCompany = Company::where(['id' => $templateInfo['company_id']])->find();
$taskInfo = Task::where(['id' => $taskSchedulePlan['task_id']])->find();
// 当前任务进行天数 < 第一阶段天数 只刷新任务时间
if ($dayCount < $templateInfo['stage_day_one']) {
self::flushTaskTime($taskSchedulePlan);
return true;
}
// 当前任务进行天数 = 第一阶段天数 判定任务完成情况,结算
if ($dayCount == $templateInfo['stage_day_one']) {
// 请求商城接口,获取完成几家 todo
$param['start_time'] = strtotime(date('Y-m-d', $templateInfo['cretate_time'])) + 86400;
$param['end_time'] = time();
$result = ShopRequestLogic::getSupplyChainMerchantCount($param);
if (!$result) {
Log::error('查询供应链商户统计接口失败'.ShopRequestLogic::getError());
return false;
}
$count = 0; // todo 从$result取值
// 完成数小于3关闭任务不做结算
if ($count < 3){
(new Task())->closeTask($taskSchedulePlan['task_id']);
}
// 完成数大于等于3结算
$target = $templateInfo['extend']['target'];
$perMoney = bcdiv(bcmul($templateInfo['stage_day_one'], $templateInfo['money']), $target); // 完成单个金额
if ($count >= 6) {
$count = 6;
}
$taskInfo['money'] = bcmul($count, $perMoney); // 任务金额
// 结算,分润
(new TownShareProfit())->dealTaskSettlementMarketingDirector2($taskInfo, $townCompany, $taskSchedulePlan);
}
}
/**
* 协助供应链商户商品上架和库存更新 长期 判定与结算
* 请求商城接口查询每个商户入驻5天内是否完成商品上架
* 请求商城接口查询每个商户商品上架构后15天内是否完成库存更新
*
*/
public static function dealTaskMarketingDirector3($company, $template, $task, $type)
{
// 商城商户入驻申请id 与商户已关联
$shopMerchantSettleinLogList= ShopMerchantSettleinLog::where(['town_company_id'=>$company['id']])->select()->toArray();
// 遍历农科公司区域下的商户,对每个商户进行判定
foreach ($shopMerchantSettleinLogList as $item) {
// 入驻5天内是否完成商品上架
$startTime = $item['create_time']; // 入驻时间
$endTime = bcadd($startTime, bcmul(86400, $template['stage_day_one']));
// 只在入驻5天后的最后一天结算
if (date('Y-m-d', $endTime) == date('Y-m-d', time())) {
$merIntentionId = $item['mer_intention_id'];
$param = [
'start_time' => $startTime,
'end_time' => $endTime,
'mer_intention_id' => $merIntentionId,
];
$result = ShopRequestLogic::getProductListing($param);
Log::info(['4.市场部长-供应链商户完成商品上架和库存更新任务-查询商城接口结果', json_encode($result)]);
// 完成则结算 todo 返回字段要对接
if ($result['is_done'] == 1){
// 结算金额 任务金额/目标数 * 天数
$task['money'] = bcmul($template['stage_day_one'], bcdiv($template['money'], $template['extend']['target']));
$taskSchedulePlan = TaskSchedulingPlan::where(['id', $task['scheduling_plan_id']])
->withJoin(['scheduling'], 'left')
->where('scheduling.company_type', 41)
->where('is_pay',0)
->with(['template_info'])
->find();
Log::info(['5.市场部长-供应链商户完成商品上架任务-$taskSchedulePlan', json_encode($taskSchedulePlan)]);
(new TownShareProfit())->dealTaskSettlementMarketingDirector3($task, $company, $taskSchedulePlan);
}
}
// 商品上架构后15天内是否完成库存更新
$startTime = $item['create_time'];
$endTime = bcadd($startTime, bcmul( 86400, bcadd($template['stage_day_one'], $template['stage_day_two']))) ;
// 只在上架完成15天后的最后一天结算
if (date('Y-m-d', $endTime) == date('Y-m-d', time())) {
$merIntentionId = $item['mer_intention_id'];
$param = [
'start_time' => $startTime,
'end_time' => $endTime,
'mer_intention_id' => $merIntentionId,
];
$result1 = ShopRequestLogic::getStockUpdate($param); // todo 返回字段要对接
Log::info(['4.市场部长-供应链商户完成库存更新任务-查询商城接口结果', json_encode($result)]);
if ($result1['is_done'] == 1){
// 结算金额 任务金额/目标数 * 天数
$task['money'] = bcmul($template['stage_day_two'], bcdiv($template['money_two'], $template['extend']['target']));
$taskSchedulePlan = TaskSchedulingPlan::where(['id', $task['scheduling_plan_id']])
->withJoin(['scheduling'], 'left')
->where('scheduling.company_type', 41)
->where('is_pay',0)
->with(['template_info'])
->find();
Log::info(['5.市场部长-供应链商户完成商品上架任务-$taskSchedulePlan', json_encode($taskSchedulePlan)]);
(new TownShareProfit())->dealTaskSettlementMarketingDirector3($task, $company, $taskSchedulePlan);
}
}
}
// 未完成的情况下,每天自动关闭任务
$task = Task::where(['id'=>$taskSchedulePlan['task_id']])->find();
if ($task['status'] != 3) {
(new Task())->closeTask($task['id']);
}
}
/**
* 协助供应链商户采购任务 长期 判定与结算
* 根据每个商户入驻时间推出各个周期范围的起始时间商户申请id指定商品id。请求商城接口
*/
public static function dealTaskMarketingDirector4($company, $template, $task)
{
// 商城商户入驻申请id 与商户已关联
$shopMerchantSettleinLogList= ShopMerchantSettleinLog::where(['town_company_id'=>$company['id']])->select()->toArray();
// 遍历农科公司区域下的商户,对每个商户进行判定
foreach ($shopMerchantSettleinLogList as $item) {
$startTime = $item['create_time']; // 入驻时间
$endTime = bcadd($startTime, bcmul(86400, $template['stage_day_one']));
$merIntentionId = $item['mer_intention_id'];
$param = [
'start_time' => $startTime,
'end_time' => $endTime,
'mer_intention_id' => $merIntentionId,
];
$result1 = ShopRequestLogic::getStockUpdate($param); // todo 返回字段要对接
}
}
/**
* @param $taskSchedulePlan
* 服务部长任务结算
*/
private static function serviceManagerTaskSettlement($taskSchedulePlan)
{
$taskTemplateInfo = $taskSchedulePlan['template_info'];
// 任务类型用的数据字典主键id将id和value作映射避免测试和正式环境数据字典数据不一致时出问题
$townTaskTypeList = DictData::where(['type_value' => 'town_task_type', 'status' => 1])->column('value', 'id');
switch ($townTaskTypeList[$taskTemplateInfo['type']]){
case 'town_task_type_1':
// 协助总负责人开展工作任务
self::dealTownTask1($taskSchedulePlan);
break;
case 'town_task_type_2':
// 拓展小组服务团队工作任务
self::dealTownTask2($taskSchedulePlan);
break;
case 'town_task_type_3':
// 督促小组服务团队完成任务,协助开展工作,解决问题任务
self::dealTownTask3($taskSchedulePlan);
break;
case 'town_task_type_4':
// 督促小组服务团队学习任务
self::dealTownTask4($taskSchedulePlan);
break;
case 'town_task_type_5':
// 督促小组服务团队完成需求收集和交易任务
self::dealTownTask5($taskSchedulePlan);
break;
case 'town_task_type_6':
// 督促小组服务团队入股村联络员所成立的公司任务
self::dealTownTask6($taskSchedulePlan);
break;
case 'town_task_type_7':
// 安全工作任务
self::dealTownTask7($taskSchedulePlan);
break;
default :
return true;
}
}
/**
* 系统自动判定镇农科公司下属小组服务公司 是否100%完成每日任务:三轮车任务,档案更新任务,平台交易任务
*/
@ -576,8 +835,6 @@ class TaskLogic extends BaseLogic
break;
}
}
} else {
continue;
}
}
// 下属小组服务公司有任务安排,也完成了任务

View File

@ -0,0 +1,8 @@
<?php
namespace app\common\model;
class ShopMerchantSettleinLog extends BaseModel
{
protected $name = 'shop_merchant_settle_log';
}