SalaryItemPermanently.php 20 KB

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