$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']??'' ]); 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->status = $params['status']??0; $settlementPermanently->admin_id = $params['admin_id']??0; $settlementPermanently->amount = $amount; $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; } } /** * @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; $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; } } public static function getLastSettlementTime($master_worker_id) { //查询该工程师上个结算日期 $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(self::$conf_days); } $current_time = strtotime(date("Y-m-d",time())); $last_st_time = $current_time - (self::$conf_step_days * 86400); if(strtotime($last_settlement_time) < $last_st_time){ return $last_st_time; }else{ return strtotime($last_settlement_time); } } }