| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- <?php
- // +----------------------------------------------------------------------
- // | likeadmin快速开发前后端分离管理后台(PHP版)
- // +----------------------------------------------------------------------
- // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
- // | 开源版本可自由商用,可去除界面版权logo
- // | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
- // | github下载:https://github.com/likeshop-github/likeadmin
- // | 访问官网:https://www.likeadmin.cn
- // | likeadmin团队 版权所有 拥有最终解释权
- // +----------------------------------------------------------------------
- // | author: likeadminTeam
- // +----------------------------------------------------------------------
- namespace app\adminapi\lists\sale;
- use app\adminapi\lists\BaseAdminDataLists;
- use app\common\model\group_activity\GroupOrder;
- use app\common\model\group_activity\GroupUserOrder;
- use app\common\model\master_worker\MasterWorker;
- use app\common\model\master_worker_register\MasterWorkerRegister;
- use app\common\lists\ListsSearchInterface;
- use app\common\model\property\PropertyHead;
- use app\common\model\sale\Sale;
- use app\workerapi\logic\MasterWorkerLogic;
- use think\facade\Db;
- /**
- * Sale列表
- * Class SaleLists
- * @package app\adminapi\lists
- */
- class SaleCommissionLists extends BaseAdminDataLists implements ListsSearchInterface
- {
- /**
- * @notes 设置搜索条件
- * @return \string[][]
- * @author likeadmin
- * @date 2024/12/15 10:53
- */
- public function setSearch(): array
- {
- return [
- '=' => ['id'],
- ];
- }
- /*public function queryWhere()
- {
- $where = [];
- if(isset($this->params['time_range']) && $this->params['time_range']){
- $startDateTime = strtotime($this->params['time_range'][0]);
- $endDateTime = strtotime($this->params['time_range'][1])+86400-1;
- $where[] = ['b.finished_time','BETWEEN',[$startDateTime,$endDateTime]];
- }
- return $where;
- }*/
- public function queryWhereTime()
- {
- //dd($this->params);
- if(isset($this->params['time_range']) && $this->params['time_range']){
- $startDateTime = strtotime($this->params['time_range'][0]);
- $endDateTime = strtotime($this->params['time_range'][1])+86400-1;
- } else {
- $startDateTime = strtotime(date('Y-m-01',time()));
- $endDateTime = time();
- }
- return [$startDateTime,$endDateTime];
- }
- /**
- * 获取数据权限
- * $this->adminInfo['data_rules']
- * province city admin_id sale_group_id sale_id property_head_id
- */
- public function queryDataWhere(){
- $where = [];
- $data_rules = $this->adminInfo['data_rules'];
- if (isset($data_rules['sale_group_id']) && !empty($data_rules['sale_group_id'])) {
- $where[] = ['sale_group_id','in' ,$data_rules['sale_group_id']];
- }
- if (isset($data_rules['sale_id']) && !empty($data_rules['sale_id'])) {
- $where[] = ['id','in' ,$data_rules['sale_id']];
- }
- return $where;
- }
- /**
- * @notes 获取列表
- * @return array
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- * @author likeadmin
- * @date 2024/12/15 10:53
- */
- public function lists(): array
- {
- $list = Sale::with('saleGroupInfo')->where($this->searchWhere)
- ->where($this->queryDataWhere())
- ->field(['id','sale_name','mobile','sale_group_id',
- Db::raw("'".($this->queryWhereTime()[0]??'')."' AS start_date"),
- Db::raw("'".($this->queryWhereTime()[1]??'')."' AS end_date"),
- ])
- ->limit($this->limitOffset, $this->limitLength)
- ->select()->toArray();
- $passes_counts = $this->passesCounts($list,$this->queryWhereTime())??[];
- $property_counts = $this->propertyCounts($list,$this->queryWhereTime())??[];
- $group_counts = $this->groupCounts($list,$this->queryWhereTime())??[];
- // $this->passesMerits($passes_counts[$item['id']]??0) * $passes_counts[$item['id']]??0;
- // $this->propertyMerits($property_counts[$item['id']]??0) * $property_counts[$item['id']]??0;
- // * 0.05
- foreach ($list as &$item) {
- $item['passes_counts'] = $passes_counts[$item['id']]??0;
- $item['passes_merits'] = $this->passesMerits($passes_counts[$item['id']]??0);
- $item['property_counts'] = $property_counts[$item['id']]??0;
- $item['property_merits'] = $this->propertyMerits($property_counts[$item['id']]??0);
- $item['group_counts'] = $group_counts[$item['id']]??0;
- $item['group_merits'] = $this->groupMerits($group_counts[$item['id']]??0);
- $item['all_merits'] = (float)$item['passes_merits'] + (float)$item['property_merits'] + (float)$item['group_merits'];
- }
- return $list;
- }
- /**
- * @notes 获取数量
- * @return int
- * @author likeadmin
- * @date 2024/12/15 10:53
- */
- public function count(): int
- {
- return Sale::where($this->searchWhere)->where($this->queryDataWhere())->count();
- }
- public function setExcelComplexFields(): array
- {
- $zh_cn_fields = [
- '销售组','销售员', '销售手机号','工程师审核通过数量','入驻提成绩效','物业签约合计分数','物业提成绩效','拼团总流水','拼团提成绩效','总提成绩效'
- ,'开始日期','结束日期'
- ];
- $data_fields = [function($row){ return $row['saleGroupInfo']['sale_name']??''; },'sale_name','mobile',
- 'passes_counts','passes_merits','property_counts','property_merits','group_counts','group_merits','all_merits'
- ,function($row){ return $row['start_date']?date('Y-m-d',$row['start_date']):''; },function($row){ return $row['end_date']?date('Y-m-d',$row['end_date']):''; }
- ];
- return [
- 'zh_cn_fields' => $zh_cn_fields,
- 'data_fields' => $data_fields
- ];
- }
- public function passesCounts($list,$whereTime)
- {
- $sale_ids = array_column($list,'id');
- $passes_counts = [];
- foreach ($sale_ids as $sale_id) {
- $worker_ids = MasterWorkerRegister::where('sale_id','>',0)->where('worker_id','>',0)
- ->where('sale_id',$sale_id)
- ->whereBetween('create_time',[$whereTime[0],$whereTime[1]])
- ->column('worker_id');
- foreach ($worker_ids as $worker_id) {
- !isset($passes_counts[$sale_id]) && $passes_counts[$sale_id] = 0;
- $passes_counts[$sale_id] += $this->requiredMasterWorker($worker_id)?1:0;
- }
- }
- //dd($passes_counts);
- return $passes_counts;
- }
- public function passesMerits($value)
- {
- switch (true){
- case (60 <= $value && $value < 70):
- return 200;
- case (70 <= $value && $value < 80):
- return 400;
- case (80 <= $value && $value < 90):
- return 600;
- case (90 <= $value && $value < 100):
- return 800;
- case (100 <= $value ):
- return 1000;
- case ($value < 60):
- default:
- return 0;
- }
- }
- public function propertyCounts($list,$whereTime)
- {
- $sale_ids = array_column($list,'id');
- $propertyHeads = PropertyHead::where('sale_id','>',0)->where('is_cooperate','=',1)
- ->where('sale_id','in',$sale_ids)
- ->whereBetween('create_time',[$whereTime[0],$whereTime[1]])
- ->field([
- 'sale_id',
- Db::raw("SUM(rating_value) AS rating_values")
- ])
- ->group('sale_id')
- ->select()->toArray();
- return array_column($propertyHeads,'rating_values','sale_id');
- }
- public function propertyMerits($value)
- {
- switch (true){
- case (60 <= $value && $value < 70):
- return 200;
- case (70 <= $value && $value < 80):
- return 400;
- case (80 <= $value && $value < 90):
- return 600;
- case (90 <= $value && $value < 100):
- return 800;
- case (100 <= $value ):
- return 1000;
- case ($value < 60):
- default:
- return 0;
- }
- }
- public function groupCounts($list,$whereTime)
- {
- $sale_ids = array_column($list,'id');
- $groupCounts = [];
- foreach ($sale_ids as $sale_id) {
- $propertyHeadIds = PropertyHead::where('sale_id','>',0)->where('is_cooperate','=',1)->where('sale_id',$sale_id)->column('id')??[];
- $groupOrderIds = GroupOrder::whereIn('property_head_id',$propertyHeadIds)->column('id')??[];
- //->whereB('pay_time',1)->
- $paid_amounts = GroupUserOrder::whereIn('group_order_id',$groupOrderIds)
- ->where('status',1)
- ->whereBetween('pay_time',[$whereTime[0],$whereTime[1]])
- ->sum('paid_amount');
- $groupCounts[$sale_id] = $paid_amounts;
- }
- return $groupCounts;
- }
- public function groupMerits($value)
- {
- return bcmul($value, 0.05,2);
- }
- public function requiredMasterWorker($master_worker_id): bool
- {
- $masterWorker = MasterWorker::where('id',$master_worker_id)->findOrEmpty();
- if(!$masterWorker->isEmpty()){
- // 该工程师所有必须任务是否完成
- $taskRequired = MasterWorkerLogic::taskRequired($master_worker_id,$masterWorker->identity_source);
- if($masterWorker->audit_state == 1 && $taskRequired){
- return true;
- }
- }
- return false;
- }
- }
|