EngineerSettlementPermanentlyLogic.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  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\logic\master_worker;
  15. use app\common\model\dict\DictData;
  16. use app\common\model\master_worker\EngineerSettlementPermanently;
  17. use app\common\logic\BaseLogic;
  18. use app\common\model\master_worker\MasterWorker;
  19. use app\common\model\master_worker\SalaryItemPermanently;
  20. use DateTime;
  21. use think\facade\Db;
  22. use think\facade\Log;
  23. /**
  24. * EngineerSettlementPermanently逻辑
  25. * Class EngineerSettlementPermanentlyLogic
  26. * @package app\adminapi\logic
  27. */
  28. class EngineerSettlementPermanentlyLogic extends BaseLogic
  29. {
  30. protected static int $conf_step_days = 7;
  31. protected static string $conf_days = '2025-06-09 23:59:59';
  32. /**
  33. * @notes 添加
  34. * @param array $params
  35. * @return bool
  36. * @author likeadmin
  37. * @date 2025/06/09 10:33
  38. */
  39. public static function add(array $params): bool
  40. {
  41. Db::startTrans();
  42. try {
  43. EngineerSettlementPermanently::create([
  44. 'master_worker_id' => $params['master_worker_id'],
  45. 'last_settlement_time' => $params['last_settlement_time'],
  46. 'settlement_time' => $params['settlement_time'],
  47. 'step_days' => $params['step_days'],
  48. 'status' => $params['status'],
  49. 'admin_id' => $params['admin_id'],
  50. 'remark' => $params['remark']
  51. ]);
  52. Db::commit();
  53. return true;
  54. } catch (\Exception $e) {
  55. Db::rollback();
  56. self::setError($e->getMessage());
  57. return false;
  58. }
  59. }
  60. /**
  61. * @notes 编辑
  62. * @param array $params
  63. * @return bool
  64. * @author likeadmin
  65. * @date 2025/06/09 10:33
  66. */
  67. public static function edit(array $params): bool
  68. {
  69. //Db::startTrans();
  70. try {
  71. /*EngineerSettlementPermanently::where('id', $params['id'])->update([
  72. 'amount' => $params['amount']??0,
  73. 'payment_time' => $params['payment_time']??'',
  74. 'deduction_amount' => $params['deduction_amount']??0,
  75. 'deduction_describe' => $params['deduction_describe']??'',
  76. 'status' => 1,
  77. 'admin_id' => $params['admin_id']??0,
  78. 'remark' => $params['remark']??''
  79. ]);*/
  80. if(self::settlement($params)){
  81. throw new \Exception(self::getError());
  82. }
  83. //Db::commit();
  84. return true;
  85. } catch (\Exception $e) {
  86. //Db::rollback();
  87. self::setError($e->getMessage());
  88. return false;
  89. }
  90. }
  91. /**
  92. * @notes 删除
  93. * @param array $params
  94. * @return bool
  95. * @author likeadmin
  96. * @date 2025/06/09 10:33
  97. */
  98. public static function delete(array $params): bool
  99. {
  100. return EngineerSettlementPermanently::destroy($params['id']);
  101. }
  102. /**
  103. * @notes 获取详情
  104. * @param $params
  105. * @return array
  106. * @author likeadmin
  107. * @date 2025/06/09 10:33
  108. */
  109. public static function detail($params): array
  110. {
  111. function getAllSalary($salaryItemPermanently): float {
  112. $all_salary = 0.00;
  113. foreach ($salaryItemPermanently as $item) {
  114. $all_salary += $item['term_amount'];
  115. }
  116. return $all_salary;
  117. }
  118. $item = EngineerSettlementPermanently::with(['bankAccount','workerInfo','salaryItemPermanently'])->findOrEmpty($params['id'])->toArray();
  119. $item['all_salary'] = getAllSalary($item['salaryItemPermanently']);
  120. return $item;
  121. }
  122. /**
  123. * @notes 执行结算
  124. * @param $params
  125. * @author likeadmin
  126. * @date 2025/06/09 10:33
  127. */
  128. public static function settlement($params)
  129. {
  130. Db::startTrans();
  131. try {
  132. $settlementPermanently = EngineerSettlementPermanently::where('id', $params['id'])->findOrEmpty();
  133. if($settlementPermanently->isEmpty()){
  134. throw new \Exception('结算记录不存在');
  135. }
  136. //$amount = SalaryItemPermanently::where('permanently_settlement_id', $params['id'])->sum('term_amount');
  137. $settlementPermanently->payment_time = $params['payment_time']?:date('Y-m-d', time());
  138. $settlementPermanently->deduction_amount = $params['deduction_amount']??0;
  139. $settlementPermanently->deduction_describe = $params['deduction_describe']??'';
  140. $settlementPermanently->remark = $params['remark']??'';
  141. $settlementPermanently->status = 1;
  142. $settlementPermanently->admin_id = $params['admin_id']??0;
  143. $settlementPermanently->amount = $params['amount']??0;
  144. $settlementPermanently->save();
  145. Db::commit();
  146. // 删除该日期步进天数内的之前的快照
  147. /*$ids = EngineerSettlementPermanently::where('status',0)->
  148. where('settlement_time','between',[$settlementPermanently->last_settlement_time,$settlementPermanently->settlement_time])->column('id')??[];
  149. if(!empty($ids)){
  150. EngineerSettlementPermanently::where('id',$ids)->delete();
  151. SalaryItemPermanently::where('permanently_settlement_id',$ids)->delete();
  152. }*/
  153. return true;
  154. } catch (\Exception $e) {
  155. Db::rollback();
  156. self::setError($e->getMessage());
  157. return false;
  158. }
  159. }
  160. public static function getLastSettlementTime($master_worker_id,$conf_step_days = 7,$conf_days = null)
  161. {
  162. //查询该工程师上个结算日期
  163. $last_settlement_time = EngineerSettlementPermanently::where('master_worker_id',$master_worker_id)->where('status',1)->order('settlement_time','desc')->value('settlement_time');
  164. if(empty($last_settlement_time) || $last_settlement_time === '0000-00-00'){
  165. return strtotime($conf_days);
  166. }
  167. $current_time = strtotime(date("Y-m-d",time()));
  168. $last_st_time = $current_time - ($conf_step_days * 86400);
  169. if(strtotime($last_settlement_time) < $last_st_time){
  170. return $last_st_time;
  171. }else{
  172. return strtotime($last_settlement_time);
  173. }
  174. }
  175. /**
  176. * @notes 定时任务 - 每天
  177. * @author likeadmin
  178. * @date 2025/06/09 10:33
  179. */
  180. public static function settlementRegular($masterWorker_id = 0)
  181. {
  182. Db::startTrans();
  183. try {
  184. $wh = ['type' => 2];
  185. $masterWorker_id && $wh['id'] = $masterWorker_id;
  186. //$masterWorker_id
  187. // audit_state = 1
  188. $masterWorkers = MasterWorker::where($wh)->select()->toArray();
  189. foreach ($masterWorkers as $masterWorker) {
  190. $last_settlement_time = self::getLastSettlementTime($masterWorker['id']);
  191. $settlement_time = strtotime(date("Y-m-d",time())) + 86399;
  192. $data = [
  193. 'master_worker_id' => $masterWorker['id'],
  194. 'last_settlement_time' => date('Y-m-d',$last_settlement_time),
  195. 'settlement_time' => date('Y-m-d',$settlement_time),
  196. 'step_days' => self::$conf_step_days,
  197. 'status' => 0,
  198. 'admin_id' => 0,
  199. 'remark' => ''
  200. ];
  201. $wh = ['master_worker_id' => $masterWorker['id'],'settlement_time' => date('Y-m-d',$settlement_time),
  202. 'step_days' => self::$conf_step_days, 'status' => 0];
  203. $info = EngineerSettlementPermanently::where($wh)->findOrEmpty();
  204. if($info->isEmpty()){
  205. $settlementPermanently = EngineerSettlementPermanently::create($data);
  206. }else{
  207. EngineerSettlementPermanently::where($wh)->where('id',$info->id)->update($data);
  208. $settlementPermanently['id'] = $info->id;
  209. }
  210. /*$settlementPermanently = EngineerSettlementPermanently::create([
  211. 'master_worker_id' => $masterWorker['id'],
  212. 'last_settlement_time' => date('Y-m-d',$last_settlement_time),
  213. 'settlement_time' => date('Y-m-d',$settlement_time),
  214. 'step_days' => self::$conf_step_days,
  215. 'status' => 0,
  216. 'admin_id' => 0,
  217. 'remark' => ''
  218. ]);*/
  219. //$settlementPermanently->id
  220. $salary_item_data = DictData::where('type_value','salary_item')->column('name','value');
  221. $salaryItemPermanently = new SalaryItemPermanently();
  222. foreach ($salary_item_data as $salary_item => $item_name) {
  223. $fu_name = 'salary_item_'.$salary_item;
  224. if(!method_exists(SalaryItemPermanently::class,$fu_name)){
  225. continue;
  226. }
  227. $salaryItemPermanently->$fu_name($settlementPermanently['id'],$masterWorker['id'],[
  228. 'start_time'=>$last_settlement_time,
  229. 'end_time'=>$settlement_time,
  230. 'step_days'=>self::$conf_step_days,'item_name'=>$item_name
  231. ]);
  232. }
  233. }
  234. Db::commit();
  235. return true;
  236. } catch (\Exception $e) {
  237. Db::rollback();
  238. self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage());
  239. return false;
  240. }
  241. }
  242. /**
  243. * @notes 定时任务 - 每周
  244. * @author likeadmin
  245. * @date 2025/06/09 10:33
  246. */
  247. public static function settlementRegularWeek($masterWorker_id = 0)
  248. {
  249. try {
  250. // 兼职工程师-每周 period_type = 2
  251. self::partTimeMaster($masterWorker_id,2);
  252. // 保单工程师-每周 period_type = 2
  253. self::longTermMaster($masterWorker_id,2);
  254. return true;
  255. } catch (\Exception $e) {
  256. self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage());
  257. return false;
  258. }
  259. }
  260. /**
  261. * @notes 定时任务 - 每月
  262. * @author likeadmin
  263. * @date 2025/06/09 10:33
  264. */
  265. public static function settlementRegularManth($masterWorker_id = 0)
  266. {
  267. try {
  268. // 保单工程师 period_type = 3
  269. self::longTermMaster($masterWorker_id,3);
  270. // 全职工程师
  271. self::fullTimeMaster($masterWorker_id,3);
  272. return true;
  273. } catch (\Exception $e) {
  274. self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage());
  275. return false;
  276. }
  277. }
  278. public static function partTimeMaster($masterWorker_id = 0,$period_type = 0)
  279. {
  280. Db::startTrans();
  281. try {
  282. $master_type = 1;
  283. $wh = ['type' => $master_type];
  284. $masterWorker_id && $wh['id'] = $masterWorker_id;
  285. // 获取上周的周一开始与周末结束时间
  286. $period_type == 2 && list($startTime,$endTime) = self::lastWeekTime();
  287. $period_type == 3 && list($startTime,$endTime) = self::lastManthTime();
  288. $conf_step_days = 0;
  289. $period_type == 2 && $conf_step_days = 7;
  290. $period_type == 3 && $conf_step_days = 30;
  291. //$masterWorker_id
  292. // audit_state = 1
  293. $masterWorkers = MasterWorker::where($wh)->select()->toArray();
  294. foreach ($masterWorkers as $masterWorker) {
  295. $last_settlement_time = $startTime;
  296. $settlement_time = $endTime;
  297. $data = [
  298. "period_type"=>$period_type,"master_type"=>$master_type,
  299. 'master_worker_id' => $masterWorker['id'],
  300. 'last_settlement_time' => date('Y-m-d',$last_settlement_time),
  301. 'settlement_time' => date('Y-m-d',$settlement_time),
  302. 'step_days' => $conf_step_days,
  303. 'status' => 0,
  304. 'admin_id' => 0,
  305. 'remark' => ''
  306. ];
  307. $wh = ["period_type"=>$period_type,"master_type"=>$master_type,'master_worker_id' => $masterWorker['id'],'settlement_time' => date('Y-m-d',$settlement_time), 'status' => 0];
  308. $info = EngineerSettlementPermanently::where($wh)->findOrEmpty();
  309. if($info->isEmpty()){
  310. $settlementPermanently = EngineerSettlementPermanently::create($data);
  311. }else{
  312. EngineerSettlementPermanently::where($wh)->where('id',$info->id)->update($data);
  313. $settlementPermanently['id'] = $info->id;
  314. }
  315. $salary_item_data = DictData::where('type_value','salary_item')->column('name','value');
  316. $salaryItemPermanently = new SalaryItemPermanently();
  317. foreach ($salary_item_data as $salary_item => $item_name) {
  318. $fu_name = 'salary_item_'.$salary_item;
  319. if(!method_exists(SalaryItemPermanently::class,$fu_name)){
  320. continue;
  321. }
  322. $salaryItemPermanently->$fu_name($settlementPermanently['id'],$masterWorker['id'],[
  323. "period_type"=>$period_type,"master_type"=>$master_type,
  324. 'start_time'=>$last_settlement_time,
  325. 'end_time'=>$settlement_time,
  326. 'step_days'=>$conf_step_days,'item_name'=>$item_name
  327. ]);
  328. }
  329. }
  330. Db::commit();
  331. return true;
  332. } catch (\Exception $e) {
  333. Db::rollback();
  334. self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage());
  335. return false;
  336. }
  337. }
  338. public static function longTermMaster($masterWorker_id = 0,$period_type = 0)
  339. {
  340. Db::startTrans();
  341. try {
  342. $master_type = 1;
  343. $wh = ['type' => $master_type];
  344. $masterWorker_id && $wh['id'] = $masterWorker_id;
  345. // 获取上周的周一开始与周末结束时间
  346. $period_type == 2 && list($startTime,$endTime) = self::lastWeekTime();
  347. $period_type == 3 && list($startTime,$endTime) = self::lastManthTime();
  348. $conf_step_days = 0;
  349. $period_type == 2 && $conf_step_days = 7;
  350. $period_type == 3 && $conf_step_days = 30;
  351. //$masterWorker_id
  352. // audit_state = 1
  353. $masterWorkers = MasterWorker::where($wh)->select()->toArray();
  354. foreach ($masterWorkers as $masterWorker) {
  355. $last_settlement_time = $startTime;
  356. $settlement_time = $endTime;
  357. $data = [
  358. "period_type"=>$period_type,"master_type"=>$master_type,
  359. 'master_worker_id' => $masterWorker['id'],
  360. 'last_settlement_time' => date('Y-m-d',$last_settlement_time),
  361. 'settlement_time' => date('Y-m-d',$settlement_time),
  362. 'step_days' => $conf_step_days,
  363. 'status' => 0,
  364. 'admin_id' => 0,
  365. 'remark' => ''
  366. ];
  367. $wh = ["period_type"=>$period_type,"master_type"=>$master_type,'master_worker_id' => $masterWorker['id'],'settlement_time' => date('Y-m-d',$settlement_time), 'status' => 0];
  368. $info = EngineerSettlementPermanently::where($wh)->findOrEmpty();
  369. if($info->isEmpty()){
  370. $settlementPermanently = EngineerSettlementPermanently::create($data);
  371. }else{
  372. EngineerSettlementPermanently::where($wh)->where('id',$info->id)->update($data);
  373. $settlementPermanently['id'] = $info->id;
  374. }
  375. $salary_item_data = DictData::where('type_value','salary_item')->column('name','value');
  376. $salaryItemPermanently = new SalaryItemPermanently();
  377. foreach ($salary_item_data as $salary_item => $item_name) {
  378. $fu_name = 'salary_item_'.$salary_item;
  379. if(!method_exists(SalaryItemPermanently::class,$fu_name)){
  380. continue;
  381. }
  382. $salaryItemPermanently->$fu_name($settlementPermanently['id'],$masterWorker['id'],[
  383. "period_type"=>$period_type,"master_type"=>$master_type,
  384. 'start_time'=>$last_settlement_time,
  385. 'end_time'=>$settlement_time,
  386. 'step_days'=>$conf_step_days,'item_name'=>$item_name
  387. ]);
  388. }
  389. }
  390. Db::commit();
  391. return true;
  392. } catch (\Exception $e) {
  393. Db::rollback();
  394. self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage());
  395. return false;
  396. }
  397. }
  398. public static function fullTimeMaster($masterWorker_id = 0,$period_type = 0)
  399. {
  400. Db::startTrans();
  401. try {
  402. $master_type = 1;
  403. $wh = ['type' => $master_type];
  404. $masterWorker_id && $wh['id'] = $masterWorker_id;
  405. // 获取上周的周一开始与周末结束时间
  406. $period_type == 2 && list($startTime,$endTime) = self::lastWeekTime();
  407. $period_type == 3 && list($startTime,$endTime) = self::lastManthTime();
  408. $conf_step_days = 0;
  409. $period_type == 2 && $conf_step_days = 7;
  410. $period_type == 3 && $conf_step_days = 30;
  411. //$masterWorker_id
  412. // audit_state = 1
  413. $masterWorkers = MasterWorker::where($wh)->select()->toArray();
  414. foreach ($masterWorkers as $masterWorker) {
  415. $last_settlement_time = $startTime;
  416. $settlement_time = $endTime;
  417. $data = [
  418. "period_type"=>$period_type,"master_type"=>$master_type,
  419. 'master_worker_id' => $masterWorker['id'],
  420. 'last_settlement_time' => date('Y-m-d',$last_settlement_time),
  421. 'settlement_time' => date('Y-m-d',$settlement_time),
  422. 'step_days' => $conf_step_days,
  423. 'status' => 0,
  424. 'admin_id' => 0,
  425. 'remark' => ''
  426. ];
  427. $wh = ["period_type"=>$period_type,"master_type"=>$master_type,'master_worker_id' => $masterWorker['id'],'settlement_time' => date('Y-m-d',$settlement_time), 'status' => 0];
  428. $info = EngineerSettlementPermanently::where($wh)->findOrEmpty();
  429. if($info->isEmpty()){
  430. $settlementPermanently = EngineerSettlementPermanently::create($data);
  431. }else{
  432. EngineerSettlementPermanently::where($wh)->where('id',$info->id)->update($data);
  433. $settlementPermanently['id'] = $info->id;
  434. }
  435. $salary_item_data = DictData::where('type_value','salary_item')->column('name','value');
  436. $salaryItemPermanently = new SalaryItemPermanently();
  437. foreach ($salary_item_data as $salary_item => $item_name) {
  438. $fu_name = 'salary_item_'.$salary_item;
  439. if(!method_exists(SalaryItemPermanently::class,$fu_name)){
  440. continue;
  441. }
  442. $salaryItemPermanently->$fu_name($settlementPermanently['id'],$masterWorker['id'],[
  443. "period_type"=>$period_type,"master_type"=>$master_type,
  444. 'start_time'=>$last_settlement_time,
  445. 'end_time'=>$settlement_time,
  446. 'step_days'=>$conf_step_days,'item_name'=>$item_name
  447. ]);
  448. }
  449. }
  450. Db::commit();
  451. return true;
  452. } catch (\Exception $e) {
  453. Db::rollback();
  454. self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage());
  455. return false;
  456. }
  457. }
  458. public static function lastWeekTime()
  459. {
  460. $today = new DateTime('today');
  461. $last_week_monday = clone $today;
  462. $last_week_monday->modify('this week -7 days')->setTime(0, 0, 0);
  463. $last_week_sunday = clone $last_week_monday;
  464. $last_week_sunday->modify('+6 days');
  465. $last_week_start = $last_week_monday->getTimestamp(); // 上周一零点时间戳
  466. $last_week_end = $last_week_sunday->getTimestamp()+86399; // 上周日零点时间戳
  467. return [
  468. 'startTime' => $last_week_start,
  469. 'endTime' => $last_week_end
  470. ];
  471. }
  472. public static function lastManthTime()
  473. {
  474. $today = new DateTime('today');
  475. // 获取上个月的开始与结束时间
  476. $last_manth_monday = clone $today;
  477. $last_manth_monday->modify('first day of last month')->setTime(0, 0, 0);
  478. $last_manth_sunday = clone $last_manth_monday;
  479. $last_manth_sunday->modify('last day of last month');
  480. $last_manth_start = $last_manth_monday->getTimestamp();
  481. $last_manth_end = $last_manth_sunday->getTimestamp()+86399;
  482. return [
  483. 'startTime' => $last_manth_start,
  484. 'endTime' => $last_manth_end
  485. ];
  486. }
  487. }