SalaryItemPermanently.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  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\common\model\master_worker;
  15. use app\common\model\BaseModel;
  16. use app\common\model\dict\DictData;
  17. use app\common\model\works\ReturnWork;
  18. use app\common\model\works\ServiceWork;
  19. use think\facade\Log;
  20. /**
  21. * SalaryItemPermanently模型
  22. * Class SalaryItemPermanently
  23. * @package app\common\model
  24. */
  25. class SalaryItemPermanently extends BaseModel
  26. {
  27. protected $name = 'salary_item_permanently';
  28. public function getTermTextAttr($value,$data):string
  29. {
  30. $dictData = DictData::whereIn('type_value', 'salary_item')->column('name','value');
  31. return $dictData[$data['term']] ?? '';
  32. }
  33. // 接单服务费
  34. public function salary_item_1($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  35. {
  36. try {
  37. //$params['start_time'] $params['end_time']
  38. $promotion_level = MasterWorker::where('id',$master_worker_id)->value('promotion_level');
  39. $ratio = 0.00;
  40. switch ($promotion_level){
  41. case 1:
  42. $ratio = 0.65;
  43. break;
  44. case 2:
  45. $ratio = 0.63;
  46. break;
  47. case 3:
  48. $ratio = 0.55;
  49. break;
  50. case 4:
  51. $ratio = 0.57;
  52. break;
  53. case 5:
  54. $ratio = 0.59;
  55. break;
  56. case 6:
  57. $ratio = 0.61;
  58. break;
  59. case 7:
  60. $ratio = 0.5;
  61. break;
  62. }
  63. //$ratio
  64. // 查询时间范围内所有已经完单的工单
  65. $order_list = ServiceWork::where('master_worker_id',$master_worker_id)->
  66. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  67. where('service_status','=',3)->where('work_pay_status','=',2)->
  68. select(['id','work_sn','work_amount','spare_total','master_worker_id','finished_time','service_status','work_pay_status'])->toArray();
  69. $amount = 0.00;
  70. foreach ($order_list as $item) {
  71. $amount += (float)bcsub($item['work_amount'] ,$item['spare_total']);//(float)bcmul(, $ratio,2);
  72. }
  73. $term_amount = (float)bcmul($amount, $ratio,2);
  74. $itemData = [
  75. 'permanently_settlement_id' => $permanently_settlement_id,
  76. 'master_worker_id' => $master_worker_id,
  77. 'term' => 1,
  78. 'term_amount' => $term_amount,
  79. 'remark' => $params['item_name'].': 金额--'.$term_amount.';比例:--'.$ratio,
  80. 'extra' => json_encode([
  81. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  82. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'promotion_level'=>$promotion_level,'ratio'=>$ratio,
  83. 'amount'=>$amount,'count_order'=>count($order_list),'order_ids'=> array_column($order_list,'id')
  84. ]),
  85. ];
  86. self::salaryCreateUpdate($itemData);
  87. return true;
  88. } catch (\Exception $e) {
  89. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  90. return false;
  91. }
  92. }
  93. // 加单奖励
  94. public function salary_item_2($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  95. {
  96. try {
  97. // work_type = 2
  98. $ratio = 0.1;
  99. // 查询时间范围内所有已经完单的工单
  100. $order_list = ServiceWork::where('master_worker_id',$master_worker_id)->
  101. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  102. where('service_status','=',3)->where('work_pay_status','=',2)->where('work_type','=',2)->
  103. select(['id','work_sn','work_amount','spare_total','master_worker_id','finished_time','service_status','work_pay_status'])->toArray();
  104. $amount = 0.00;
  105. foreach ($order_list as $item) {
  106. $amount += (float)bcsub($item['work_amount'] ,$item['spare_total']);//(float)bcmul(, $ratio,2);
  107. }
  108. $term_amount = (float)bcmul($amount, $ratio,2);
  109. $itemData = [
  110. 'permanently_settlement_id' => $permanently_settlement_id,
  111. 'master_worker_id' => $master_worker_id,
  112. 'term' => 2,
  113. 'term_amount' => $term_amount,
  114. 'remark' => $params['item_name'].': 金额--'.$term_amount.';比例:--'.$ratio,
  115. 'extra' => json_encode([
  116. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  117. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'ratio'=>$ratio,
  118. 'amount'=>$amount,'count_order'=>count($order_list),'order_ids'=> array_column($order_list,'id')
  119. ]),
  120. ];
  121. self::salaryCreateUpdate($itemData);
  122. return true;
  123. } catch (\Exception $e) {
  124. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  125. return false;
  126. }
  127. }
  128. // 月度TOP3
  129. public function salary_item_3($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  130. {
  131. try {
  132. $term_amount = 0;
  133. $ranking = 3;
  134. // 查询时间范围内所有已经完单的工单工程师排名 - 可以为当月月度
  135. $order_list = ServiceWork::
  136. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  137. where('service_status','=',3)->where('work_pay_status','=',2)->
  138. field('master_worker_id,count(id) as work_counts')->
  139. group('master_worker_id')->
  140. order('work_counts desc')->
  141. limit(3)->
  142. select()->toArray();
  143. $master_worker_ids = array_column($order_list,'master_worker_id');
  144. if(in_array($master_worker_id,$master_worker_ids)){
  145. $term_amount = 500;
  146. }
  147. $itemData = [
  148. 'permanently_settlement_id' => $permanently_settlement_id,
  149. 'master_worker_id' => $master_worker_id,
  150. 'term' => 3,
  151. 'term_amount' => $term_amount,
  152. 'remark' => $params['item_name'].': 金额--'.$term_amount.';排名:前三',
  153. 'extra' => json_encode([
  154. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  155. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time']
  156. ]),
  157. ];
  158. self::salaryCreateUpdate($itemData);
  159. return true;
  160. } catch (\Exception $e) {
  161. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  162. return false;
  163. }
  164. }
  165. // ≥4.8分且≥80单
  166. public function salary_item_4($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  167. {
  168. try {
  169. $comprehensive_score = MasterWorkerScore::where('worker_id',$master_worker_id)->value('comprehensive_score');
  170. // 查询时间范围内所有已经完单的工单
  171. $order_count = ServiceWork::where('master_worker_id',$master_worker_id)->
  172. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  173. where('service_status','=',3)->where('work_pay_status','=',2)->count();
  174. $term_amount = 0;
  175. if( 4.8 <= (float)$comprehensive_score && 80 <= $order_count){
  176. $term_amount = 500;
  177. }
  178. $itemData = [
  179. 'permanently_settlement_id' => $permanently_settlement_id,
  180. 'master_worker_id' => $master_worker_id,
  181. 'term' => 4,
  182. 'term_amount' => $term_amount,
  183. 'remark' => $params['item_name'].': 金额--'.$term_amount.';评分:--'.$comprehensive_score.';总单量:--'.$order_count,
  184. 'extra' => json_encode([
  185. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  186. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'comprehensive_score'=>$comprehensive_score,'order_count'=>$order_count,
  187. 'amount'=>$term_amount
  188. ]),
  189. ];
  190. self::salaryCreateUpdate($itemData);
  191. return true;
  192. } catch (\Exception $e) {
  193. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  194. return false;
  195. }
  196. }
  197. // 工程师晋升
  198. public function salary_item_5($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  199. {
  200. try {
  201. $title_promotion = MasterWorker::where('id',$master_worker_id)->value('title_promotion');
  202. $amount = 0.00;
  203. switch ($title_promotion){
  204. case 2:
  205. $amount = 1000;
  206. break;
  207. case 3:
  208. $amount = 1500;
  209. break;
  210. }
  211. $itemData = [
  212. 'permanently_settlement_id' => $permanently_settlement_id,
  213. 'master_worker_id' => $master_worker_id,
  214. 'term' => 5,
  215. 'term_amount' => $amount,
  216. 'remark' => $params['item_name'].': 金额--'.$amount.';称号:--'.$title_promotion,
  217. 'extra' => json_encode([
  218. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  219. 'title_promotion'=>$title_promotion,
  220. 'amount'=>$amount
  221. ]),
  222. ];
  223. self::salaryCreateUpdate($itemData);
  224. return true;
  225. } catch (\Exception $e) {
  226. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  227. return false;
  228. }
  229. }
  230. // 投诉订单
  231. public function salary_item_6($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  232. {
  233. try {
  234. // 查询时间范围内所有投诉的工单
  235. $order_count = ReturnWork::where('master_worker_id',$master_worker_id)->
  236. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  237. where('return_work_status','=',4)->count();
  238. $amount = 50.00;
  239. $term_amount = -(float)bcmul($order_count, $amount,2);
  240. $itemData = [
  241. 'permanently_settlement_id' => $permanently_settlement_id,
  242. 'master_worker_id' => $master_worker_id,
  243. 'term' => 6,
  244. 'term_amount' => $term_amount,
  245. 'remark' => $params['item_name'].': 扣减金额--'.$term_amount.';投诉单量:--'.$order_count,// .'xx:--'.$ranking
  246. 'extra' => json_encode([
  247. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  248. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],
  249. 'amount'=>$amount,'order_count'=>$order_count
  250. ]),
  251. ];
  252. self::salaryCreateUpdate($itemData);
  253. return true;
  254. } catch (\Exception $e) {
  255. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  256. return false;
  257. }
  258. }
  259. public function salaryCreateUpdate($itemData = [])
  260. {
  261. $wh = ['permanently_settlement_id' => $itemData['permanently_settlement_id'], 'master_worker_id' => $itemData['master_worker_id'], 'term' => $itemData['term']];
  262. $info = self::where($wh)->findOrEmpty();
  263. if($info->isEmpty()){
  264. self::create($itemData);
  265. }else{
  266. self::where($wh)->update($itemData);
  267. }
  268. return true;
  269. }
  270. }