SaleCommissionLists.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeadmin快速开发前后端分离管理后台(PHP版)
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | 开源版本可自由商用,可去除界面版权logo
  7. // | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
  8. // | github下载:https://github.com/likeshop-github/likeadmin
  9. // | 访问官网:https://www.likeadmin.cn
  10. // | likeadmin团队 版权所有 拥有最终解释权
  11. // +----------------------------------------------------------------------
  12. // | author: likeadminTeam
  13. // +----------------------------------------------------------------------
  14. namespace app\adminapi\lists\sale;
  15. use app\adminapi\lists\BaseAdminDataLists;
  16. use app\common\model\group_activity\GroupOrder;
  17. use app\common\model\group_activity\GroupUserOrder;
  18. use app\common\model\master_worker\MasterWorker;
  19. use app\common\model\master_worker_register\MasterWorkerRegister;
  20. use app\common\lists\ListsSearchInterface;
  21. use app\common\model\property\PropertyHead;
  22. use app\common\model\sale\Sale;
  23. use app\workerapi\logic\MasterWorkerLogic;
  24. use think\facade\Db;
  25. /**
  26. * Sale列表
  27. * Class SaleLists
  28. * @package app\adminapi\lists
  29. */
  30. class SaleCommissionLists extends BaseAdminDataLists implements ListsSearchInterface
  31. {
  32. /**
  33. * @notes 设置搜索条件
  34. * @return \string[][]
  35. * @author likeadmin
  36. * @date 2024/12/15 10:53
  37. */
  38. public function setSearch(): array
  39. {
  40. return [
  41. '=' => ['id'],
  42. ];
  43. }
  44. /*public function queryWhere()
  45. {
  46. $where = [];
  47. if(isset($this->params['time_range']) && $this->params['time_range']){
  48. $startDateTime = strtotime($this->params['time_range'][0]);
  49. $endDateTime = strtotime($this->params['time_range'][1])+86400-1;
  50. $where[] = ['b.finished_time','BETWEEN',[$startDateTime,$endDateTime]];
  51. }
  52. return $where;
  53. }*/
  54. public function queryWhereTime()
  55. {
  56. //dd($this->params);
  57. if(isset($this->params['time_range']) && $this->params['time_range']){
  58. $startDateTime = strtotime($this->params['time_range'][0]);
  59. $endDateTime = strtotime($this->params['time_range'][1])+86400-1;
  60. } else {
  61. $startDateTime = strtotime(date('Y-m-01',time()));
  62. $endDateTime = time();
  63. }
  64. return [$startDateTime,$endDateTime];
  65. }
  66. /**
  67. * 获取数据权限
  68. * $this->adminInfo['data_rules']
  69. * province city admin_id sale_group_id sale_id property_head_id
  70. */
  71. public function queryDataWhere(){
  72. $where = [];
  73. $data_rules = $this->adminInfo['data_rules'];
  74. if (isset($data_rules['sale_group_id']) && !empty($data_rules['sale_group_id'])) {
  75. $where[] = ['sale_group_id','in' ,$data_rules['sale_group_id']];
  76. }
  77. if (isset($data_rules['sale_id']) && !empty($data_rules['sale_id'])) {
  78. $where[] = ['id','in' ,$data_rules['sale_id']];
  79. }
  80. return $where;
  81. }
  82. /**
  83. * @notes 获取列表
  84. * @return array
  85. * @throws \think\db\exception\DataNotFoundException
  86. * @throws \think\db\exception\DbException
  87. * @throws \think\db\exception\ModelNotFoundException
  88. * @author likeadmin
  89. * @date 2024/12/15 10:53
  90. */
  91. public function lists(): array
  92. {
  93. $list = Sale::with('saleGroupInfo')->where($this->searchWhere)
  94. ->where($this->queryDataWhere())
  95. ->field(['id','sale_name','mobile','sale_group_id',
  96. Db::raw("'".($this->queryWhereTime()[0]??'')."' AS start_date"),
  97. Db::raw("'".($this->queryWhereTime()[1]??'')."' AS end_date"),
  98. ])
  99. ->limit($this->limitOffset, $this->limitLength)
  100. ->select()->toArray();
  101. $passes_counts = $this->passesCounts($list,$this->queryWhereTime())??[];
  102. $property_counts = $this->propertyCounts($list,$this->queryWhereTime())??[];
  103. $group_counts = $this->groupCounts($list,$this->queryWhereTime())??[];
  104. // $this->passesMerits($passes_counts[$item['id']]??0) * $passes_counts[$item['id']]??0;
  105. // $this->propertyMerits($property_counts[$item['id']]??0) * $property_counts[$item['id']]??0;
  106. // * 0.05
  107. foreach ($list as &$item) {
  108. $item['passes_counts'] = $passes_counts[$item['id']]??0;
  109. $item['passes_merits'] = $this->passesMerits($passes_counts[$item['id']]??0);
  110. $item['property_counts'] = $property_counts[$item['id']]??0;
  111. $item['property_merits'] = $this->propertyMerits($property_counts[$item['id']]??0);
  112. $item['group_counts'] = $group_counts[$item['id']]??0;
  113. $item['group_merits'] = $this->groupMerits($group_counts[$item['id']]??0);
  114. $item['all_merits'] = (float)$item['passes_merits'] + (float)$item['property_merits'] + (float)$item['group_merits'];
  115. }
  116. return $list;
  117. }
  118. /**
  119. * @notes 获取数量
  120. * @return int
  121. * @author likeadmin
  122. * @date 2024/12/15 10:53
  123. */
  124. public function count(): int
  125. {
  126. return Sale::where($this->searchWhere)->where($this->queryDataWhere())->count();
  127. }
  128. public function setExcelComplexFields(): array
  129. {
  130. $zh_cn_fields = [
  131. '销售组','销售员', '销售手机号','工程师审核通过数量','入驻提成绩效','物业签约合计分数','物业提成绩效','拼团总流水','拼团提成绩效','总提成绩效'
  132. ,'开始日期','结束日期'
  133. ];
  134. $data_fields = [function($row){ return $row['saleGroupInfo']['sale_name']??''; },'sale_name','mobile',
  135. 'passes_counts','passes_merits','property_counts','property_merits','group_counts','group_merits','all_merits'
  136. ,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']):''; }
  137. ];
  138. return [
  139. 'zh_cn_fields' => $zh_cn_fields,
  140. 'data_fields' => $data_fields
  141. ];
  142. }
  143. public function passesCounts($list,$whereTime)
  144. {
  145. $sale_ids = array_column($list,'id');
  146. $passes_counts = [];
  147. foreach ($sale_ids as $sale_id) {
  148. $worker_ids = MasterWorkerRegister::where('sale_id','>',0)->where('worker_id','>',0)
  149. ->where('sale_id',$sale_id)
  150. ->whereBetween('create_time',[$whereTime[0],$whereTime[1]])
  151. ->column('worker_id');
  152. foreach ($worker_ids as $worker_id) {
  153. !isset($passes_counts[$sale_id]) && $passes_counts[$sale_id] = 0;
  154. $passes_counts[$sale_id] += $this->requiredMasterWorker($worker_id)?1:0;
  155. }
  156. }
  157. //dd($passes_counts);
  158. return $passes_counts;
  159. }
  160. public function passesMerits($value)
  161. {
  162. switch (true){
  163. case (60 <= $value && $value < 70):
  164. return 200;
  165. case (70 <= $value && $value < 80):
  166. return 400;
  167. case (80 <= $value && $value < 90):
  168. return 600;
  169. case (90 <= $value && $value < 100):
  170. return 800;
  171. case (100 <= $value ):
  172. return 1000;
  173. case ($value < 60):
  174. default:
  175. return 0;
  176. }
  177. }
  178. public function propertyCounts($list,$whereTime)
  179. {
  180. $sale_ids = array_column($list,'id');
  181. $propertyHeads = PropertyHead::where('sale_id','>',0)->where('is_cooperate','=',1)
  182. ->where('sale_id','in',$sale_ids)
  183. ->whereBetween('create_time',[$whereTime[0],$whereTime[1]])
  184. ->field([
  185. 'sale_id',
  186. Db::raw("SUM(rating_value) AS rating_values")
  187. ])
  188. ->group('sale_id')
  189. ->select()->toArray();
  190. return array_column($propertyHeads,'rating_values','sale_id');
  191. }
  192. public function propertyMerits($value)
  193. {
  194. switch (true){
  195. case (60 <= $value && $value < 70):
  196. return 200;
  197. case (70 <= $value && $value < 80):
  198. return 400;
  199. case (80 <= $value && $value < 90):
  200. return 600;
  201. case (90 <= $value && $value < 100):
  202. return 800;
  203. case (100 <= $value ):
  204. return 1000;
  205. case ($value < 60):
  206. default:
  207. return 0;
  208. }
  209. }
  210. public function groupCounts($list,$whereTime)
  211. {
  212. $sale_ids = array_column($list,'id');
  213. $groupCounts = [];
  214. foreach ($sale_ids as $sale_id) {
  215. $propertyHeadIds = PropertyHead::where('sale_id','>',0)->where('is_cooperate','=',1)->where('sale_id',$sale_id)->column('id')??[];
  216. $groupOrderIds = GroupOrder::whereIn('property_head_id',$propertyHeadIds)->column('id')??[];
  217. //->whereB('pay_time',1)->
  218. $paid_amounts = GroupUserOrder::whereIn('group_order_id',$groupOrderIds)
  219. ->where('status',1)
  220. ->whereBetween('pay_time',[$whereTime[0],$whereTime[1]])
  221. ->sum('paid_amount');
  222. $groupCounts[$sale_id] = $paid_amounts;
  223. }
  224. return $groupCounts;
  225. }
  226. public function groupMerits($value)
  227. {
  228. return bcmul($value, 0.05,2);
  229. }
  230. public function requiredMasterWorker($master_worker_id): bool
  231. {
  232. $masterWorker = MasterWorker::where('id',$master_worker_id)->findOrEmpty();
  233. if(!$masterWorker->isEmpty()){
  234. // 该工程师所有必须任务是否完成
  235. $taskRequired = MasterWorkerLogic::taskRequired($master_worker_id,$masterWorker->identity_source);
  236. if($masterWorker->audit_state == 1 && $taskRequired){
  237. return true;
  238. }
  239. }
  240. return false;
  241. }
  242. }