$params['master_worker_id'], 'last_settlement_time' => $params['last_settlement_time'], 'settlement_time' => $params['settlement_time'], 'step_days' => $params['step_days'], 'status' => $params['status'], 'admin_id' => $params['admin_id'], 'remark' => $params['remark'] ]); Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } } /** * @notes 编辑 * @param array $params * @return bool * @author likeadmin * @date 2025/06/09 10:33 */ public static function edit(array $params): bool { //Db::startTrans(); try { /*EngineerSettlementPermanently::where('id', $params['id'])->update([ 'amount' => $params['amount']??0, 'payment_time' => $params['payment_time']??'', 'deduction_amount' => $params['deduction_amount']??0, 'deduction_describe' => $params['deduction_describe']??'', 'status' => 1, 'admin_id' => $params['admin_id']??0, 'remark' => $params['remark']??'' ]);*/ if(self::settlement($params)){ throw new \Exception(self::getError()); } //Db::commit(); return true; } catch (\Exception $e) { //Db::rollback(); self::setError($e->getMessage()); return false; } } /** * @notes 删除 * @param array $params * @return bool * @author likeadmin * @date 2025/06/09 10:33 */ public static function delete(array $params): bool { return EngineerSettlementPermanently::destroy($params['id']); } /** * @notes 获取详情 * @param $params * @return array * @author likeadmin * @date 2025/06/09 10:33 */ public static function detail($params): array { function getAllSalary($salaryItemPermanently): float { $all_salary = 0.00; foreach ($salaryItemPermanently as $item) { $all_salary += $item['term_amount']; } return $all_salary; } $item = EngineerSettlementPermanently::with(['bankAccount','workerInfo','salaryItemPermanently'])->findOrEmpty($params['id'])->toArray(); $item['all_salary'] = getAllSalary($item['salaryItemPermanently']); return $item; } /** * @notes 执行结算 * @param $params * @author likeadmin * @date 2025/06/09 10:33 */ public static function settlement($params) { Db::startTrans(); try { $settlementPermanently = EngineerSettlementPermanently::where('id', $params['id'])->findOrEmpty(); if($settlementPermanently->isEmpty()){ throw new \Exception('结算记录不存在'); } //$amount = SalaryItemPermanently::where('permanently_settlement_id', $params['id'])->sum('term_amount'); $settlementPermanently->payment_time = $params['payment_time']?:date('Y-m-d', time()); $settlementPermanently->deduction_amount = $params['deduction_amount']??0; $settlementPermanently->deduction_describe = $params['deduction_describe']??''; $settlementPermanently->remark = $params['remark']??''; $settlementPermanently->status = 1; $settlementPermanently->admin_id = $params['admin_id']??0; $settlementPermanently->amount = $params['amount']??0; $settlementPermanently->save(); Db::commit(); // 删除该日期步进天数内的之前的快照 /*$ids = EngineerSettlementPermanently::where('status',0)-> where('settlement_time','between',[$settlementPermanently->last_settlement_time,$settlementPermanently->settlement_time])->column('id')??[]; if(!empty($ids)){ EngineerSettlementPermanently::where('id',$ids)->delete(); SalaryItemPermanently::where('permanently_settlement_id',$ids)->delete(); }*/ return true; } catch (\Exception $e) { Db::rollback(); self::setError($e->getMessage()); return false; } } public static function getLastSettlementTime($master_worker_id,$conf_step_days = 7,$conf_days = null) { //查询该工程师上个结算日期 $last_settlement_time = EngineerSettlementPermanently::where('master_worker_id',$master_worker_id)->where('status',1)->order('settlement_time','desc')->value('settlement_time'); if(empty($last_settlement_time) || $last_settlement_time === '0000-00-00'){ return strtotime($conf_days); } $current_time = strtotime(date("Y-m-d",time())); $last_st_time = $current_time - ($conf_step_days * 86400); if(strtotime($last_settlement_time) < $last_st_time){ return $last_st_time; }else{ return strtotime($last_settlement_time); } } /** * @notes 定时任务 - 每天 * @author likeadmin * @date 2025/06/09 10:33 */ public static function settlementRegular($masterWorker_id = 0) { Db::startTrans(); try { $wh = ['type' => 2]; $masterWorker_id && $wh['id'] = $masterWorker_id; //$masterWorker_id // audit_state = 1 $masterWorkers = MasterWorker::where($wh)->select()->toArray(); foreach ($masterWorkers as $masterWorker) { $last_settlement_time = self::getLastSettlementTime($masterWorker['id']); $settlement_time = strtotime(date("Y-m-d",time())) + 86399; $data = [ 'master_worker_id' => $masterWorker['id'], 'last_settlement_time' => date('Y-m-d',$last_settlement_time), 'settlement_time' => date('Y-m-d',$settlement_time), 'step_days' => self::$conf_step_days, 'status' => 0, 'admin_id' => 0, 'remark' => '' ]; $wh = ['master_worker_id' => $masterWorker['id'],'settlement_time' => date('Y-m-d',$settlement_time), 'step_days' => self::$conf_step_days, 'status' => 0]; $info = EngineerSettlementPermanently::where($wh)->findOrEmpty(); if($info->isEmpty()){ $settlementPermanently = EngineerSettlementPermanently::create($data); }else{ EngineerSettlementPermanently::where($wh)->where('id',$info->id)->update($data); $settlementPermanently['id'] = $info->id; } /*$settlementPermanently = EngineerSettlementPermanently::create([ 'master_worker_id' => $masterWorker['id'], 'last_settlement_time' => date('Y-m-d',$last_settlement_time), 'settlement_time' => date('Y-m-d',$settlement_time), 'step_days' => self::$conf_step_days, 'status' => 0, 'admin_id' => 0, 'remark' => '' ]);*/ //$settlementPermanently->id $salary_item_data = DictData::where('type_value','salary_item')->column('name','value'); $salaryItemPermanently = new SalaryItemPermanently(); foreach ($salary_item_data as $salary_item => $item_name) { $fu_name = 'salary_item_'.$salary_item; if(!method_exists(SalaryItemPermanently::class,$fu_name)){ continue; } $salaryItemPermanently->$fu_name($settlementPermanently['id'],$masterWorker['id'],[ 'start_time'=>$last_settlement_time, 'end_time'=>$settlement_time, 'step_days'=>self::$conf_step_days,'item_name'=>$item_name ]); } } Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } /** * @notes 定时任务 - 每周 * @author likeadmin * @date 2025/06/09 10:33 */ public static function settlementRegularWeek($masterWorker_id = 0) { try { // 限制每周一才能结算上周 if(date("w") != 1) return false; // 兼职工程师-每周 period_type = 2 self::partTimeMaster($masterWorker_id,2); // 保单工程师-每周 period_type = 2 self::longTermMaster($masterWorker_id,2); return true; } catch (\Exception $e) { self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } /** * @notes 定时任务 - 每月 * @author likeadmin * @date 2025/06/09 10:33 */ public static function settlementRegularManth($masterWorker_id = 0) { try { // 限制每月一才能结算上月 if((int)date("d") != 1) return false; // 保单工程师 period_type = 3 self::longTermMaster($masterWorker_id,3); // 全职工程师 self::fullTimeMaster($masterWorker_id,3); return true; } catch (\Exception $e) { self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } public static function partTimeMaster($masterWorker_id = 0,$period_type = 0) { //Db::startTrans(); try { $master_type = 1; $wh = [['type', '=', $master_type]]; $mwids = ServiceWork::where('service_status',3)->where('finished_time','between',[time() - 65*86400,time()])->column('master_worker_id')??[]; if(!empty($mwids)) $wh[] = ['id','in', array_values(array_unique($mwids))]; $masterWorker_id && $wh[] = ['id','=',$masterWorker_id]; // 获取上周的周一开始与周末结束时间 $period_type == 2 && list($startTime,$endTime) = self::lastWeekTime(); $period_type == 3 && list($startTime,$endTime) = self::lastManthTime(); $conf_step_days = 0; $period_type == 2 && $conf_step_days = 7; $period_type == 3 && $conf_step_days = 30; //$masterWorker_id // audit_state = 1 $masterWorkers = MasterWorker::where($wh)->select()->toArray(); foreach ($masterWorkers as $masterWorker) { $last_settlement_time = $startTime; $settlement_time = $endTime; $data = [ "period_type"=>$period_type,"master_type"=>$master_type, 'master_worker_id' => $masterWorker['id'], 'last_settlement_time' => date('Y-m-d',$last_settlement_time), 'settlement_time' => date('Y-m-d',$settlement_time), 'step_days' => $conf_step_days, 'status' => 0, 'admin_id' => 0, 'remark' => '' ]; $wh = ["period_type"=>$period_type,"master_type"=>$master_type,'master_worker_id' => $masterWorker['id'],'settlement_time' => date('Y-m-d',$settlement_time), 'status' => 0]; $info = EngineerSettlementPermanently::where($wh)->findOrEmpty(); if($info->isEmpty()){ $settlementPermanently = EngineerSettlementPermanently::create($data); }else{ EngineerSettlementPermanently::where($wh)->where('id',$info->id)->update($data); $settlementPermanently['id'] = $info->id; } $salary_item_data = DictData::where('type_value','salary_item')->column('name','value'); $salaryItemPermanently = new SalaryItemPermanently(); foreach ($salary_item_data as $salary_item => $item_name) { $fu_name = 'salary_item_'.$salary_item; if(!method_exists(SalaryItemPermanently::class,$fu_name)){ continue; } $salaryItemPermanently->$fu_name($settlementPermanently['id'],$masterWorker['id'],[ "period_type"=>$period_type,"master_type"=>$master_type, 'start_time'=>$last_settlement_time, 'end_time'=>$settlement_time, 'step_days'=>$conf_step_days,'item_name'=>$item_name ]); } } //Db::commit(); return true; } catch (\Exception $e) { //Db::rollback(); self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } public static function longTermMaster($masterWorker_id = 0,$period_type = 0) { //Db::startTrans(); try { $master_type = 2; $wh = [['type', '=', $master_type]]; $mwids = ServiceWork::where('service_status',3)->where('finished_time','between',[time() - 65*86400,time()])->column('master_worker_id')??[]; if(!empty($mwids)) $wh[] = ['id','in', array_values(array_unique($mwids))]; $masterWorker_id && $wh[] = ['id','=',$masterWorker_id]; // 获取上周的周一开始与周末结束时间 $period_type == 2 && list($startTime,$endTime) = self::lastWeekTime(); $period_type == 3 && list($startTime,$endTime) = self::lastManthTime(); $conf_step_days = 0; $period_type == 2 && $conf_step_days = 7; $period_type == 3 && $conf_step_days = 30; //$masterWorker_id // audit_state = 1 $masterWorkers = MasterWorker::where($wh)->select()->toArray(); foreach ($masterWorkers as $masterWorker) { $last_settlement_time = $startTime; $settlement_time = $endTime; $data = [ "period_type"=>$period_type,"master_type"=>$master_type, 'master_worker_id' => $masterWorker['id'], 'last_settlement_time' => date('Y-m-d',$last_settlement_time), 'settlement_time' => date('Y-m-d',$settlement_time), 'step_days' => $conf_step_days, 'status' => 0, 'admin_id' => 0, 'remark' => '' ]; $wh = ["period_type"=>$period_type,"master_type"=>$master_type,'master_worker_id' => $masterWorker['id'],'settlement_time' => date('Y-m-d',$settlement_time), 'status' => 0]; $info = EngineerSettlementPermanently::where($wh)->findOrEmpty(); if($info->isEmpty()){ $settlementPermanently = EngineerSettlementPermanently::create($data); }else{ EngineerSettlementPermanently::where($wh)->where('id',$info->id)->update($data); $settlementPermanently['id'] = $info->id; } $salary_item_data = DictData::where('type_value','salary_item')->column('name','value'); $salaryItemPermanently = new SalaryItemPermanently(); foreach ($salary_item_data as $salary_item => $item_name) { $fu_name = 'salary_item_'.$salary_item; if(!method_exists(SalaryItemPermanently::class,$fu_name)){ continue; } $salaryItemPermanently->$fu_name($settlementPermanently['id'],$masterWorker['id'],[ "period_type"=>$period_type,"master_type"=>$master_type, 'start_time'=>$last_settlement_time, 'end_time'=>$settlement_time, 'step_days'=>$conf_step_days,'item_name'=>$item_name ]); } } //Db::commit(); return true; } catch (\Exception $e) { //Db::rollback(); self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } public static function fullTimeMaster($masterWorker_id = 0,$period_type = 0) { //Db::startTrans(); try { $master_type = 3; $wh = [['type', '=', $master_type]]; $mwids = ServiceWork::where('service_status',3)->where('finished_time','between',[time() - 65*86400,time()])->column('master_worker_id')??[]; if(!empty($mwids)) $wh[] = ['id','in', array_values(array_unique($mwids))]; $masterWorker_id && $wh[] = ['id','=',$masterWorker_id]; // 获取上周的周一开始与周末结束时间 $period_type == 2 && list($startTime,$endTime) = self::lastWeekTime(); $period_type == 3 && list($startTime,$endTime) = self::lastManthTime(); $conf_step_days = 0; $period_type == 2 && $conf_step_days = 7; $period_type == 3 && $conf_step_days = 30; //$masterWorker_id // audit_state = 1 $masterWorkers = MasterWorker::where($wh)->select()->toArray(); foreach ($masterWorkers as $masterWorker) { $last_settlement_time = $startTime; $settlement_time = $endTime; $data = [ "period_type"=>$period_type,"master_type"=>$master_type, 'master_worker_id' => $masterWorker['id'], 'last_settlement_time' => date('Y-m-d',$last_settlement_time), 'settlement_time' => date('Y-m-d',$settlement_time), 'step_days' => $conf_step_days, 'status' => 0, 'admin_id' => 0, 'remark' => '' ]; $wh = ["period_type"=>$period_type,"master_type"=>$master_type,'master_worker_id' => $masterWorker['id'],'settlement_time' => date('Y-m-d',$settlement_time), 'status' => 0]; $info = EngineerSettlementPermanently::where($wh)->findOrEmpty(); if($info->isEmpty()){ $settlementPermanently = EngineerSettlementPermanently::create($data); }else{ EngineerSettlementPermanently::where($wh)->where('id',$info->id)->update($data); $settlementPermanently['id'] = $info->id; } $salary_item_data = DictData::where('type_value','salary_item')->column('name','value'); $salaryItemPermanently = new SalaryItemPermanently(); foreach ($salary_item_data as $salary_item => $item_name) { $fu_name = 'salary_item_'.$salary_item; if(!method_exists(SalaryItemPermanently::class,$fu_name)){ continue; } $salaryItemPermanently->$fu_name($settlementPermanently['id'],$masterWorker['id'],[ "period_type"=>$period_type,"master_type"=>$master_type, 'start_time'=>$last_settlement_time, 'end_time'=>$settlement_time, 'step_days'=>$conf_step_days,'item_name'=>$item_name ]); } } //Db::commit(); return true; } catch (\Exception $e) { //Db::rollback(); self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } public static function lastWeekTime() { $today = new DateTime('today'); $last_week_monday = clone $today; $last_week_monday->modify('this week -7 days')->setTime(0, 0, 0); $last_week_sunday = clone $last_week_monday; $last_week_sunday->modify('+6 days'); $last_week_start = $last_week_monday->getTimestamp(); // 上周一零点时间戳 $last_week_end = $last_week_sunday->getTimestamp()+86399; // 上周日零点时间戳 return [$last_week_start,$last_week_end]; /*return [ 'startTime' => $last_week_start, 'endTime' => $last_week_end ];*/ } public static function lastManthTime() { $today = new DateTime('today'); $firstDayOfThisMonth = clone $today; $firstDayOfThisMonth->modify('first day of this month')->setTime(0, 0, 0); // 本月第一天 $lastDayOfLastMonth = clone $firstDayOfThisMonth; $lastDayOfLastMonth->modify('-1 second'); // 上个月的最后一天 $firstDayOfLastMonth = clone $firstDayOfThisMonth; $firstDayOfLastMonth->modify('-1 month')->setTime(0, 0, 0); // 上个月的第一天 $last_manth_start = $firstDayOfLastMonth->getTimestamp(); $last_manth_end = $lastDayOfLastMonth->getTimestamp(); return [$last_manth_start,$last_manth_end]; /*return [ 'startTime' => $last_manth_start, 'endTime' => $last_manth_end ];*/ } }