|
|
@@ -13,6 +13,7 @@ use App\Model\EmployeeWorkRange;
|
|
|
use App\Model\Role;
|
|
|
use App\Model\RoleMenu;
|
|
|
use App\Model\RoleMenuButton;
|
|
|
+use App\Model\WorkRangeDetails;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
use Illuminate\Support\Facades\Hash;
|
|
|
use Mockery\Exception;
|
|
|
@@ -64,6 +65,96 @@ class EmployeeService extends Service
|
|
|
return [true, $company->toArray()];
|
|
|
}
|
|
|
|
|
|
+ public function companyWorkArrangeSet($data, $user)
|
|
|
+ {
|
|
|
+ if (empty($data['work_range'])) return [false, '公司工作时段不能为空'];
|
|
|
+
|
|
|
+ // 用于暂存转换后的分钟区间,格式:[['start' => X, 'end' => Y], ...]
|
|
|
+ $timeSegments = [];
|
|
|
+
|
|
|
+ foreach ($data['work_range'] as $key => $value){
|
|
|
+ // 1. 基础合法性校验
|
|
|
+ $res = $this->checkNumber($value['start_time_hour'], 0, 'non-negative');
|
|
|
+ if(!$res['valid']) return [false, "开始点:" . $res['error']];
|
|
|
+ if($value['start_time_hour'] > 23) return [false, "开始点不合法(应为0-23)"];
|
|
|
+
|
|
|
+ $res = $this->checkNumber($value['start_time_min'], 0, 'non-negative');
|
|
|
+ if(!$res['valid']) return [false, "开始分:" . $res['error']];
|
|
|
+ if($value['start_time_min'] > 59) return [false, "开始分不合法(应为0-59)"]; // 修正为59
|
|
|
+
|
|
|
+ $res = $this->checkNumber($value['end_time_hour'], 0, 'non-negative');
|
|
|
+ if(!$res['valid']) return [false, "结束点:" . $res['error']];
|
|
|
+ if($value['end_time_hour'] > 24) return [false, "结束点不合法(应为0-24)"];
|
|
|
+
|
|
|
+ $res = $this->checkNumber($value['end_time_min'], 0, 'non-negative');
|
|
|
+ if(!$res['valid']) return [false, "结束分:" . $res['error']];
|
|
|
+ // 如果是24点,分钟必须是0,其余情况应小于60
|
|
|
+ if($value['end_time_hour'] == 24 && $value['end_time_min'] > 0) {
|
|
|
+ return [false, "结束时间不能超过24:00"];
|
|
|
+ }
|
|
|
+ if($value['end_time_min'] > 59 && $value['end_time_hour'] != 24) {
|
|
|
+ return [false, "结束分不合法(应为0-59)"];
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 计算绝对分钟数
|
|
|
+ $startTotalMin = $value['start_time_hour'] * 60 + $value['start_time_min'];
|
|
|
+ $endTotalMin = $value['end_time_hour'] * 60 + $value['end_time_min'];
|
|
|
+
|
|
|
+ // 3. 校验单一时段的逻辑正确性
|
|
|
+ if ($endTotalMin <= $startTotalMin) {
|
|
|
+ return [false, "第 " . ($key + 1) . " 个时段的结束时间必须大于开始时间"];
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 【核心新增】:时段冲突/重叠校验
|
|
|
+ // 拿当前时段和之前已经校验过的所有时段逐一比对
|
|
|
+ foreach ($timeSegments as $index => $existingSegment) {
|
|
|
+ // 交叉重叠判别式:S1 < E2 && S2 < E1
|
|
|
+ if ($startTotalMin < $existingSegment['end'] && $existingSegment['start'] < $endTotalMin) {
|
|
|
+ $currentPeriod = "{$value['start_time_hour']}:" . str_pad($value['start_time_min'], 2, '0', STR_PAD_LEFT) . "~{$value['end_time_hour']}:" . str_pad($value['end_time_min'], 2, '0', STR_PAD_LEFT);
|
|
|
+ return [false, "时段冲突!当前时段 [{$currentPeriod}] 与其他设置的时段存在重叠"];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 校验通过,记录该区间用于后续比对
|
|
|
+ $timeSegments[] = [
|
|
|
+ 'start' => $startTotalMin,
|
|
|
+ 'end' => $endTotalMin
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 6. 补全写入数据库的隐藏字段
|
|
|
+ $data['work_range'][$key]['total_work_min'] = $endTotalMin - $startTotalMin;
|
|
|
+ $data['work_range'][$key]['top_depart_id'] = $user['top_depart_id'];
|
|
|
+ }
|
|
|
+
|
|
|
+ // 7. 写入数据库(包含事务包裹)
|
|
|
+ try {
|
|
|
+ $time = time();
|
|
|
+ DB::beginTransaction();
|
|
|
+
|
|
|
+ WorkRangeDetails::where('del_time', 0)
|
|
|
+ ->where('top_depart_id', $user['top_depart_id'])
|
|
|
+ ->update(['del_time' => $time]);
|
|
|
+
|
|
|
+ WorkRangeDetails::insert($data['work_range']);
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ DB::rollBack();
|
|
|
+ return [false, '保存失败:' . $e->getMessage()];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [true, ''];
|
|
|
+ }
|
|
|
+
|
|
|
+ public function companyWorkArrangeDetail($data, $user)
|
|
|
+ {
|
|
|
+ $company = WorkRangeDetails::where('del_time',0)
|
|
|
+ ->where('top_depart_id', $user['top_depart_id'])
|
|
|
+ ->get()->toArray();
|
|
|
+
|
|
|
+ return [true, $company];
|
|
|
+ }
|
|
|
+
|
|
|
public static function getCompanyDetail($user){
|
|
|
$company = Company::where('del_time',0)
|
|
|
->where('top_depart_id', $user['top_depart_id'])
|