cqp пре 5 дана
родитељ
комит
4e86ed25a9
3 измењених фајлова са 120 додато и 0 уклоњено
  1. 26 0
      app/Http/Controllers/Api/EmployeeController.php
  2. 91 0
      app/Service/EmployeeService.php
  3. 3 0
      routes/api.php

+ 26 - 0
app/Http/Controllers/Api/EmployeeController.php

@@ -257,4 +257,30 @@ class EmployeeController extends BaseController
             return $this->json_return(201,$data);
         }
     }
+
+    public function companyWorkArrangeSet(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->companyWorkArrangeSet($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function companyWorkArrangeDetail(Request $request)
+    {
+        $service = new EmployeeService();
+        $user = $request->userData;
+        list($status,$data) = $service->companyWorkArrangeDetail($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
 }

+ 91 - 0
app/Service/EmployeeService.php

@@ -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'])

+ 3 - 0
routes/api.php

@@ -67,6 +67,9 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     //公司设置
     $route->any('companySet', 'Api\EmployeeController@companySet');
     $route->any('companyDetail', 'Api\EmployeeController@companyDetail');
+    //公司工作时段设置
+    $route->any('companyWorkArrangeSet', 'Api\EmployeeController@companyWorkArrangeSet');
+    $route->any('companyWorkArrangeDetail', 'Api\EmployeeController@companyWorkArrangeDetail');
 
     //部门
     $route->any('departAdd', 'Api\EmployeeController@departAdd')->name('depart.add');