|
|
@@ -0,0 +1,272 @@
|
|
|
+<?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'] = $item['passes_merits'] + $item['property_merits'] + $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'
|
|
|
+ ,'start_date','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 $value;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|