SalaryItemPermanently.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  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 workerInfo()
  29. {
  30. return $this->hasOne(MasterWorkerInfo::class, 'worker_id', 'master_worker_id');
  31. }
  32. public function getTermTextAttr($value,$data):string
  33. {
  34. $dictData = DictData::whereIn('type_value', 'salary_item')->column('name','value');
  35. return $dictData[$data['term']] ?? '';
  36. }
  37. // 接单服务费 - 每周一次 兼职、保单 不论等级都按 50%
  38. public function salary_item_1($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  39. {
  40. try {
  41. if($params['period_type'] == 2 && in_array($params['master_type'],[1,2])){
  42. //$params['start_time'] $params['end_time']
  43. $promotion_level = MasterWorker::where('id',$master_worker_id)->value('promotion_level');
  44. $ratio = 0.5;
  45. // 查询时间范围内所有已经完单的工单
  46. $order_list = ServiceWork::where('master_worker_id',$master_worker_id)->
  47. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  48. where('service_status',3)->where('work_pay_status',3)->
  49. field(['id','work_sn','work_amount','spare_total','master_worker_id','finished_time','service_status','work_pay_status'])->
  50. select()->toArray();
  51. $amount = 0.00;
  52. $spare_total = 0.00;
  53. foreach ($order_list as $item) {
  54. $amount += (float)bcsub($item['work_amount'] ,$item['spare_total']);//(float)bcmul(, $ratio,2);
  55. $spare_total += $item['spare_total'];
  56. }
  57. $term_amount = (float)bcmul($amount, $ratio,2);
  58. $itemData = [
  59. 'permanently_settlement_id' => $permanently_settlement_id,
  60. 'master_worker_id' => $master_worker_id,
  61. 'term' => 1,
  62. 'term_amount' => $term_amount,
  63. 'remark' => $params['item_name'].':配件总金额--'.$spare_total.': 奖励总金额--'.$term_amount.';比例:--'.$ratio,
  64. 'extra' => json_encode([
  65. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  66. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'promotion_level'=>$promotion_level,'ratio'=>$ratio,
  67. 'amount'=>$amount,'count_order'=>count($order_list),'order_ids'=> array_column($order_list,'id')
  68. ]),
  69. ];
  70. self::salaryCreateUpdate($itemData);
  71. }
  72. return true;
  73. } catch (\Exception $e) {
  74. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  75. return false;
  76. }
  77. }
  78. // 加单奖励
  79. public function salary_item_2($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  80. {
  81. try {
  82. if(in_array($params['period_type'],[1,2])){
  83. return false;
  84. }
  85. // work_type = 2
  86. $ratio = 0.1;
  87. // 查询时间范围内所有已经完单的工单
  88. $order_list = ServiceWork::where('master_worker_id',$master_worker_id)->
  89. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  90. where('service_status','=',3)->where('work_pay_status','=',3)->where('work_type','=',2)->
  91. field(['id','work_sn','work_amount','spare_total','master_worker_id','finished_time','service_status','work_pay_status'])->
  92. select()->toArray();
  93. $amount = 0.00;
  94. foreach ($order_list as $item) {
  95. $amount += (float)bcsub($item['work_amount'] ,$item['spare_total']);//(float)bcmul(, $ratio,2);
  96. }
  97. $term_amount = (float)bcmul($amount, $ratio,2);
  98. $itemData = [
  99. 'permanently_settlement_id' => $permanently_settlement_id,
  100. 'master_worker_id' => $master_worker_id,
  101. 'term' => 2,
  102. 'term_amount' => $term_amount,
  103. 'remark' => $params['item_name'].': 金额--'.$term_amount.';比例:--'.$ratio,
  104. 'extra' => json_encode([
  105. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  106. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'ratio'=>$ratio,
  107. 'amount'=>$amount,'count_order'=>count($order_list),'order_ids'=> array_column($order_list,'id')
  108. ]),
  109. ];
  110. self::salaryCreateUpdate($itemData);
  111. return true;
  112. } catch (\Exception $e) {
  113. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  114. return false;
  115. }
  116. }
  117. // 月度TOP3
  118. public function salary_item_3($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  119. {
  120. try {
  121. if(in_array($params['period_type'],[1,2])){
  122. return false;
  123. }
  124. $term_amount = 0;
  125. $ranking = 3;
  126. // 查询时间范围内所有已经完单的工单工程师排名 - 可以为当月月度
  127. $order_list = ServiceWork::
  128. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  129. where('service_status','=',3)->where('work_pay_status','=',3)->
  130. field('master_worker_id,count(id) as work_counts')->
  131. group('master_worker_id')->
  132. order('work_counts desc')->
  133. limit(3)->
  134. select()->toArray();
  135. $master_worker_ids = array_column($order_list,'master_worker_id');
  136. if(in_array($master_worker_id,$master_worker_ids)){
  137. $term_amount = 500;
  138. }
  139. $itemData = [
  140. 'permanently_settlement_id' => $permanently_settlement_id,
  141. 'master_worker_id' => $master_worker_id,
  142. 'term' => 3,
  143. 'term_amount' => $term_amount,
  144. 'remark' => $params['item_name'].': 金额--'.$term_amount.';排名:前三',
  145. 'extra' => json_encode([
  146. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  147. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time']
  148. ]),
  149. ];
  150. self::salaryCreateUpdate($itemData);
  151. return true;
  152. } catch (\Exception $e) {
  153. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  154. return false;
  155. }
  156. }
  157. // ≥4.8分且≥80单
  158. public function salary_item_4($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  159. {
  160. try {
  161. if(in_array($params['period_type'],[1,2])){
  162. return false;
  163. }
  164. $comprehensive_score = MasterWorkerScore::where('worker_id',$master_worker_id)->value('comprehensive_score');
  165. // 查询时间范围内所有已经完单的工单
  166. $order_count = ServiceWork::where('master_worker_id',$master_worker_id)->
  167. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  168. where('service_status','=',3)->where('work_pay_status','=',3)->count();
  169. $term_amount = 0;
  170. if( 4.8 <= (float)$comprehensive_score && 80 <= $order_count){
  171. $term_amount = 500;
  172. }
  173. $itemData = [
  174. 'permanently_settlement_id' => $permanently_settlement_id,
  175. 'master_worker_id' => $master_worker_id,
  176. 'term' => 4,
  177. 'term_amount' => $term_amount,
  178. 'remark' => $params['item_name'].': 金额--'.$term_amount.';评分:--'.$comprehensive_score.';总单量:--'.$order_count,
  179. 'extra' => json_encode([
  180. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  181. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'comprehensive_score'=>$comprehensive_score,'order_count'=>$order_count,
  182. 'amount'=>$term_amount
  183. ]),
  184. ];
  185. self::salaryCreateUpdate($itemData);
  186. return true;
  187. } catch (\Exception $e) {
  188. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  189. return false;
  190. }
  191. }
  192. // 工程师晋升
  193. public function salary_item_5($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  194. {
  195. try {
  196. if(in_array($params['period_type'],[1,2])){
  197. return false;
  198. }
  199. $title_promotion = MasterWorker::where('id',$master_worker_id)->value('title_promotion');
  200. $amount = 0.00;
  201. switch ($title_promotion){
  202. case 2:
  203. $amount = 1000;
  204. break;
  205. case 3:
  206. $amount = 1500;
  207. break;
  208. }
  209. $itemData = [
  210. 'permanently_settlement_id' => $permanently_settlement_id,
  211. 'master_worker_id' => $master_worker_id,
  212. 'term' => 5,
  213. 'term_amount' => $amount,
  214. 'remark' => $params['item_name'].': 金额--'.$amount.';称号:--'.$title_promotion,
  215. 'extra' => json_encode([
  216. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  217. 'title_promotion'=>$title_promotion,
  218. 'amount'=>$amount
  219. ]),
  220. ];
  221. self::salaryCreateUpdate($itemData);
  222. return true;
  223. } catch (\Exception $e) {
  224. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  225. return false;
  226. }
  227. }
  228. // 投诉订单
  229. public function salary_item_6($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  230. {
  231. try {
  232. if(in_array($params['period_type'],[1,2])){
  233. return false;
  234. }
  235. // 查询时间范围内所有投诉的工单
  236. $order_count = ReturnWork::where('master_worker_id',$master_worker_id)->
  237. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  238. where('return_work_status','=',4)->count();
  239. $amount = 50.00;
  240. $term_amount = -(float)bcmul($order_count, $amount,2);
  241. $itemData = [
  242. 'permanently_settlement_id' => $permanently_settlement_id,
  243. 'master_worker_id' => $master_worker_id,
  244. 'term' => 6,
  245. 'term_amount' => $term_amount,
  246. 'remark' => $params['item_name'].': 扣减金额--'.$term_amount.';投诉单量:--'.$order_count,// .'xx:--'.$ranking
  247. 'extra' => json_encode([
  248. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  249. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],
  250. 'amount'=>$amount,'order_count'=>$order_count
  251. ]),
  252. ];
  253. self::salaryCreateUpdate($itemData);
  254. return true;
  255. } catch (\Exception $e) {
  256. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  257. return false;
  258. }
  259. }
  260. // 全职工程师的当月基础薪资
  261. public function salary_item_7($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  262. {
  263. try {
  264. if($params['period_type'] == 3 && $params['master_type'] == 3){
  265. $itemData = [
  266. 'permanently_settlement_id' => $permanently_settlement_id,
  267. 'master_worker_id' => $master_worker_id,
  268. 'term' => 7,
  269. 'term_amount' => 4500,
  270. 'remark' => $params['item_name'].': 底薪--4500',// .'xx:--'.$ranking
  271. 'extra' => json_encode([
  272. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  273. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],
  274. 'amount'=>4500
  275. ]),
  276. ];
  277. self::salaryCreateUpdate($itemData);
  278. }
  279. return true;
  280. } catch (\Exception $e) {
  281. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  282. return false;
  283. }
  284. }
  285. // 全职工程师的当月的提成
  286. public function salary_item_8($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  287. {
  288. try {
  289. if($params['period_type'] == 3 && $params['master_type'] == 3){
  290. // 查询时间范围内所有已经完单的工单
  291. $order_list = ServiceWork::where('master_worker_id',$master_worker_id)->
  292. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  293. where('service_status','=',3)->where('work_pay_status','=',3)->
  294. field(['id','work_sn','work_amount','spare_total','master_worker_id','finished_time','service_status','work_pay_status'])->
  295. select()->toArray();
  296. // 15%(单价<300 元时提成15%)至20%(单价>=300元时提成 20%)
  297. $term_amount = 0.00;
  298. foreach ($order_list as $item) {
  299. if((float)$item['work_amount'] < 300){
  300. $ratio = 0.15;
  301. }else{
  302. $ratio = 0.2;
  303. }
  304. $term_amount += (float)bcmul($item['work_amount'], $ratio,2);
  305. }
  306. $itemData = [
  307. 'permanently_settlement_id' => $permanently_settlement_id,
  308. 'master_worker_id' => $master_worker_id,
  309. 'term' => 8,
  310. 'term_amount' => $term_amount,
  311. 'remark' => $params['item_name'].': 金额--'.$term_amount,
  312. 'extra' => json_encode([
  313. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  314. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'ratio'=>$ratio,
  315. 'amount'=>$term_amount,'count_order'=>count($order_list),'order_ids'=> array_column($order_list,'id')
  316. ]),
  317. ];
  318. self::salaryCreateUpdate($itemData);
  319. }
  320. return true;
  321. } catch (\Exception $e) {
  322. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  323. return false;
  324. }
  325. }
  326. // 接单服务费 - 每月一次
  327. public function salary_item_9($permanently_settlement_id,$master_worker_id,$params,$extra = [])
  328. {
  329. try {
  330. if($params['period_type'] == 3 && $params['master_type'] == 2){
  331. //$params['start_time'] $params['end_time']
  332. $promotion_level = MasterWorker::where('id',$master_worker_id)->value('promotion_level');
  333. $ratio = 0.00;
  334. switch ($promotion_level){
  335. case 1:
  336. $ratio = 0.65;
  337. break;
  338. case 2:
  339. $ratio = 0.63;
  340. break;
  341. case 3:
  342. $ratio = 0.61;
  343. break;
  344. case 4:
  345. $ratio = 0.59;
  346. break;
  347. case 5:
  348. $ratio = 0.57;
  349. break;
  350. case 6:
  351. $ratio = 0.55;
  352. break;
  353. case 7:
  354. $ratio = 0.5;
  355. break;
  356. }
  357. $ratio = $ratio - 0.5;
  358. if(empty($ratio)) return false;
  359. // 查询时间范围内所有已经完单的工单
  360. $order_list = ServiceWork::where('master_worker_id',$master_worker_id)->
  361. where('finished_time','between',[$params['start_time'],$params['end_time']])->
  362. where('service_status',3)->where('work_pay_status',3)->
  363. field(['id','work_sn','work_amount','spare_total','master_worker_id','finished_time','service_status','work_pay_status'])->
  364. select()->toArray();
  365. $amount = 0.00;
  366. $spare_total = 0.00;
  367. foreach ($order_list as $item) {
  368. $amount += (float)bcsub($item['work_amount'] ,$item['spare_total']);//(float)bcmul(, $ratio,2);
  369. $spare_total += $item['spare_total'];
  370. }
  371. $term_amount = (float)bcmul($amount, $ratio,2);
  372. $itemData = [
  373. 'permanently_settlement_id' => $permanently_settlement_id,
  374. 'master_worker_id' => $master_worker_id,
  375. 'term' => 9,
  376. 'term_amount' => $term_amount,
  377. 'remark' => $params['item_name'].':配件总金额--'.$spare_total.': 奖励总金额--'.$term_amount.';比例:--'.$ratio,
  378. 'extra' => json_encode([
  379. 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'],
  380. 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'promotion_level'=>$promotion_level,'ratio'=>$ratio,
  381. 'amount'=>$amount,'count_order'=>count($order_list),'order_ids'=> array_column($order_list,'id')
  382. ]),
  383. ];
  384. self::salaryCreateUpdate($itemData);
  385. }
  386. return true;
  387. } catch (\Exception $e) {
  388. Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage());
  389. return false;
  390. }
  391. }
  392. public function salaryCreateUpdate($itemData = [])
  393. {
  394. if(empty($itemData)) return false;
  395. $wh = ['permanently_settlement_id' => $itemData['permanently_settlement_id'], 'master_worker_id' => $itemData['master_worker_id'], 'term' => $itemData['term']];
  396. $info = self::where($wh)->findOrEmpty();
  397. if($info->isEmpty()){
  398. self::create($itemData);
  399. }else{
  400. self::where($wh)->update($itemData);
  401. }
  402. return true;
  403. }
  404. }