cqp пре 2 месеци
родитељ
комит
e24dcf2f76

+ 32 - 0
app/Service/ArchiveService.php

@@ -91,4 +91,36 @@ class ArchiveService extends Service
 
         return [true, ''];
     }
+
+    public static function isArchive($months, $user)
+    {
+        // 1. 统一转为数组处理
+        $monthArray = is_array($months) ? $months : [$months];
+
+        // 2. 将所有传入的时间转换成“当月第一天”的时间戳并去重
+        $normalizedMonths = array_unique(array_map(function($time) {
+            // 如果传的是 2026-03 这种字符串,先转时间戳
+            $timestamp = is_numeric($time) ? $time : strtotime($time);
+            return strtotime(date('Y-m-01', $timestamp));
+        }, $monthArray));
+
+        // 3. 批量查询数据库中存在的已归档月份
+        $archivedMonths = Archive::where('del_time', 0)
+            ->where('top_depart_id', $user['top_depart_id'])
+            ->whereIn('month', $normalizedMonths)
+            ->pluck('month')
+            ->toArray();
+
+        // 4. 如果查询结果不为空,说明命中了归档
+        if (!empty($archivedMonths)) {
+            // 把命中的月份转回人类可读格式展示给用户
+            $errorMonths = array_map(function($ts) {
+                return date('Y-m', $ts);
+            }, $archivedMonths);
+
+            return [false, "操作失败:月份 [" . implode(',', $errorMonths) . "] 已归档锁定。"];
+        }
+
+        return [true, ''];
+    }
 }

+ 15 - 1
app/Service/AuxiliaryAccountService.php

@@ -264,6 +264,11 @@ class AuxiliaryAccountService extends Service
         $data['top_depart_id'] = $user['top_depart_id'];
         if (empty($data['month'])) return [false, '月份不能为空'];
         $data['month'] = $this->changeDateToDate($data['month']);
+
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($data['month'], $user);
+        if(! $status) return [false, $msg];
+
         $monthStart = $data['month'];
         $monthEnd = strtotime('+1 month', $monthStart) - 1;
         if(empty($data['details'])) return [false, '研发支出辅助账单明细不能为空'];
@@ -372,13 +377,22 @@ class AuxiliaryAccountService extends Service
         return [true, ''];
     }
 
-    public function auxiliaryAccountDel($data){
+    public function auxiliaryAccountDel($data, $user){
         if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
 
         try {
             DB::beginTransaction();
             $time = time();
 
+            $month = AuxiliaryAccount::where('del_time',0)
+                ->whereIn('id',$data['id'])
+                ->pluck('month')
+                ->toArray();
+
+            //归档
+            list($status, $msg) = ArchiveService::isArchive($month, $user);
+            if(! $status) return [false, $msg];
+
             AuxiliaryAccount::where('del_time',0)
                 ->whereIn('id',$data['id'])
                 ->update(['del_time' => $time]);

+ 15 - 2
app/Service/DeviceDepreciationService.php

@@ -113,13 +113,22 @@ class DeviceDepreciationService extends Service
         return $detail;
     }
 
-    public function monthlyDdOrderDel($data){
+    public function monthlyDdOrderDel($data, $user){
         if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
 
         try {
             DB::beginTransaction();
             $time = time();
 
+            $month = monthlyDdOrder::where('del_time',0)
+                ->whereIn('id',$data['id'])
+                ->pluck('month')
+                ->toArray();
+
+            //归档
+            list($status, $msg) = ArchiveService::isArchive($month, $user);
+            if(! $status) return [false, $msg];
+
             monthlyDdOrder::where('del_time',0)
                 ->whereIn('id',$data['id'])
                 ->update(['del_time' => $time]);
@@ -187,10 +196,14 @@ class DeviceDepreciationService extends Service
     }
 
     public function monthlyDdOrderRule(&$data, $user, $is_add = true){
+        $data['top_depart_id'] = $user['top_depart_id'];
         if(empty($data['month'])) return [false, '月份不能为空'];
         $data['month'] = $this->changeDateToDate($data['month']);
 
-        $data['top_depart_id'] = $user['top_depart_id'];
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($data['month'], $user);
+        if(! $status) return [false, $msg];
+
         if(empty($data['details'])) return [false, '设备月度工时单明细不能为空'];
         foreach ($data['details'] as $key => $value){
             if(empty($value['device_id'])) return [false, '设备不能为空'];

+ 39 - 43
app/Service/DeviceWorkService.php

@@ -123,13 +123,22 @@ class DeviceWorkService extends Service
         return $detail;
     }
 
-    public function monthlyDwOrderDel($data){
+    public function monthlyDwOrderDel($data, $user){
         if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
 
         try {
             DB::beginTransaction();
             $time = time();
 
+            $month = MonthlyDwOrder::where('del_time',0)
+                ->whereIn('id',$data['id'])
+                ->pluck('month')
+                ->toArray();
+
+            //归档
+            list($status, $msg) = ArchiveService::isArchive($month, $user);
+            if(! $status) return [false, $msg];
+
             MonthlyDwOrder::where('del_time',0)
                 ->whereIn('id',$data['id'])
                 ->update(['del_time' => $time]);
@@ -202,6 +211,10 @@ class DeviceWorkService extends Service
         $data['month'] = $this->changeDateToDate($data['month']);
         $data['top_depart_id'] = $user['top_depart_id'];
 
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($data['month'], $user);
+        if(! $status) return [false, $msg];
+
         if (empty($data['details'])) return [false, '设备月度工时单明细不能为空'];
 
         // --- 1. 批量获取设备档案信息 (用于展示 [编码]名称) ---
@@ -286,45 +299,6 @@ class DeviceWorkService extends Service
         return [true, ''];
     }
 
-    public function monthlyDwOrderRule1(&$data, $user, $is_add = true){
-        if(empty($data['month'])) return [false, '月份不能为空'];
-        $data['month'] = $this->changeDateToDate($data['month']);
-
-        $data['top_depart_id'] = $user['top_depart_id'];
-        if(empty($data['details'])) return [false, '设备月度工时单明细不能为空'];
-        foreach ($data['details'] as $key => $value){
-            if(empty($value['device_id'])) return [false, '设备不能为空'];
-            $res = $this->checkNumber($value['total_days'],0,'non-negative');
-            if(! $res['valid']) return [false,'出勤总天数:' . $res['error']];
-            $res = $this->checkNumber($value['rd_total_days'],0,'non-negative');
-            if(! $res['valid']) return [false,'研发出勤总天数:' . $res['error']];
-            $res = $this->checkNumber($value['total_hours'],2,'non-negative');
-            if(! $res['valid']) return [false,'出勤总工时:' . $res['error']];
-            $res = $this->checkNumber($value['rd_total_hours'],2,'non-negative');
-            if(! $res['valid']) return [false,'研发总工时:' . $res['error']];
-            $data['details'][$key]['top_depart_id'] = $data['top_depart_id'];
-        }
-        list($status, $msg) = $this->checkArrayRepeat($data['details'],'device_id','设备');
-        if(! $status) return [false, $msg];
-
-        if($is_add){
-            $bool = MonthlyDwOrder::where('top_depart_id', $data['top_depart_id'])
-                ->where('month', $data['month'])
-                ->where('del_time',0)
-                ->exists();
-        }else{
-            if(empty($data['id'])) return [false,'ID不能为空'];
-            $bool = MonthlyDwOrder::where('top_depart_id', $data['top_depart_id'])
-                ->where('month', $data['month'])
-                ->where('id','<>',$data['id'])
-                ->where('del_time',0)
-                ->exists();
-        }
-        if($bool) return [false, date("Y-m", $data['month']) . '已存在设备月度研发工时单'];
-
-        return [true, ''];
-    }
-
     public function fillData($data){
         if(empty($data['data'])) return $data;
 
@@ -516,13 +490,22 @@ class DeviceWorkService extends Service
         return $detail;
     }
 
-    public function dailyDwOrderDel($data){
+    public function dailyDwOrderDel($data, $user){
         if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
 
         try {
             DB::beginTransaction();
             $time = time();
 
+            $month = DailyDwOrder::where('del_time',0)
+                ->whereIn('id',$data['id'])
+                ->pluck('order_time')
+                ->toArray();
+
+            //归档
+            list($status, $msg) = ArchiveService::isArchive($month, $user);
+            if(! $status) return [false, $msg];
+
             DailyDwOrder::where('del_time',0)
                 ->whereIn('id',$data['id'])
                 ->update(['del_time' => $time]);
@@ -601,16 +584,20 @@ class DeviceWorkService extends Service
     }
 
     public function dailyDwOrderRule(&$data, $user, $is_add = true){
+        $data['top_depart_id'] = $user['top_depart_id'];
         if(empty($data['order_time'])) return [false, '单据日期不能为空'];
         $data['order_time'] = $this->changeDateToDate($data['order_time']);
         $orderTime = $data['order_time'];
         $itemId = $data['item_id'] ?? 0;
 
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($data['order_time'], $user);
+        if(! $status) return [false, $msg];
+
         if(empty($itemId)) return [false, '项目不能为空'];
         $bool = Item::where('del_time',0)->where('id', $itemId)->exists();
         if(!$bool) return [false, '项目不存在或已被删除'];
 
-        $data['top_depart_id'] = $user['top_depart_id'];
         if(empty($data['details'])) return [false, '设备日工时单明细不能为空'];
 
         // --- 1. 批量预获取人员信息,用于报错提示 ---
@@ -1036,6 +1023,10 @@ class DeviceWorkService extends Service
 
         $monthStart = $this->changeDateToDate($data['month']);
 
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($monthStart, $user);
+        if(! $status) return [false, $msg];
+
         // 调用核心计算逻辑
         $result = $this->calculateDailyDeviceAllocation($monthStart, $topDepartId, $user);
 
@@ -1205,6 +1196,12 @@ class DeviceWorkService extends Service
 
         $topDepartId = $user['top_depart_id'];
         $month = $data['month']; // 格式如: "2026-03"
+        $monthStart = $this->changeDateToDate($month);
+
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($monthStart, $user);
+        if(! $status) return [false, $msg];
+
         $now = time();
 
         // 1. 预加载映射
@@ -1224,7 +1221,6 @@ class DeviceWorkService extends Service
         DB::beginTransaction();
         try {
             // A. 清理旧数据
-            $monthStart = $this->changeDateToDate($month);
             $monthEnd = strtotime('+1 month', $monthStart) - 1;
 
             $oldOrderIds = DB::table('daily_dw_order')

+ 15 - 3
app/Service/ExpenseClaimsService.php

@@ -127,8 +127,11 @@ class ExpenseClaimsService extends Service
         $data['top_depart_id'] = $user['top_depart_id'];
         if (empty($data['month'])) return [false, '月份不能为空'];
         $data['month'] = $this->changeDateToDate($data['month']);
-//        if(!isset($data['month'])) return [false,"月份必传"];
-//        $monthStr = $data['month']; // 假设是 "2026-03"
+
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($data['month'], $user);
+        if(! $status) return [false, $msg];
+
         $monthStart = $data['month'];
         // 获取该月最后一秒:下个月 1 号减去 1 秒
         $monthEnd = strtotime('+1 month', $monthStart) - 1;
@@ -194,13 +197,22 @@ class ExpenseClaimsService extends Service
         return [true, ['file' => ['old' => $old, 'new' => $new]]];
     }
 
-    public function expenseClaimsDel($data){
+    public function expenseClaimsDel($data, $user){
         if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
 
         try {
             DB::beginTransaction();
             $time = time();
 
+            $month = ExpenseClaims::where('del_time',0)
+                ->whereIn('id',$data['id'])
+                ->pluck('month')
+                ->toArray();
+
+            //归档
+            list($status, $msg) = ArchiveService::isArchive($month, $user);
+            if(! $status) return [false, $msg];
+
             ExpenseClaims::where('del_time',0)
                 ->whereIn('id',$data['id'])
                 ->update(['del_time' => $time]);

+ 14 - 1
app/Service/PLeaveOverService.php

@@ -122,13 +122,22 @@ class PLeaveOverService extends Service
         return $detail;
     }
 
-    public function pLeaveOverDel($data){
+    public function pLeaveOverDel($data, $user){
         if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
 
         try {
             DB::beginTransaction();
             $time = time();
 
+            $month = PLeaveOverOrder::where('del_time',0)
+                ->whereIn('id',$data['id'])
+                ->pluck('order_time')
+                ->toArray();
+
+            //归档
+            list($status, $msg) = ArchiveService::isArchive($month, $user);
+            if(! $status) return [false, $msg];
+
             PLeaveOverOrder::where('del_time',0)
                 ->whereIn('id',$data['id'])
                 ->update(['del_time' => $time]);
@@ -210,6 +219,10 @@ class PLeaveOverService extends Service
         $orderTime = $data['order_time'];
         $orderType = $data['type'];
 
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($data['order_time'], $user);
+        if(! $status) return [false, $msg];
+
         if (!$is_add) {
             if (empty($data['id'])) return [false, 'ID不能为空'];
             $orderExists = DB::table('p_leave_over_order')

+ 41 - 46
app/Service/PersonWorkService.php

@@ -122,13 +122,22 @@ class PersonWorkService extends Service
         return $detail;
     }
 
-    public function monthlyPwOrderDel($data){
+    public function monthlyPwOrderDel($data, $user){
         if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
 
         try {
             DB::beginTransaction();
             $time = time();
 
+            $month = MonthlyPwOrder::where('del_time',0)
+                ->whereIn('id',$data['id'])
+                ->pluck('month')
+                ->toArray();
+
+            //归档
+            list($status, $msg) = ArchiveService::isArchive($month, $user);
+            if(! $status) return [false, $msg];
+
             MonthlyPwOrder::where('del_time',0)
                 ->whereIn('id',$data['id'])
                 ->update(['del_time' => $time]);
@@ -201,6 +210,10 @@ class PersonWorkService extends Service
         $data['month'] = $this->changeDateToDate($data['month']);
         $data['top_depart_id'] = $user['top_depart_id'];
 
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($data['month'], $user);
+        if(! $status) return [false, $msg];
+
         if (empty($data['details'])) return [false, '人员月度工时单明细不能为空'];
 
         //获取系统计算的考勤基准数据 ---
@@ -266,46 +279,6 @@ class PersonWorkService extends Service
         return [true, ''];
     }
 
-    public function monthlyPwOrderRule1(&$data, $user, $is_add = true){
-        if(empty($data['month'])) return [false, '月份不能为空'];
-        $data['month'] = $this->changeDateToDate($data['month']);
-
-        $data['top_depart_id'] = $user['top_depart_id'];
-        if(empty($data['details'])) return [false, '人员月度工时单明细不能为空'];
-        foreach ($data['details'] as $key => $value){
-            if(empty($value['employee_id'])) return [false, '人员不能为空'];
-            $res = $this->checkNumber($value['total_days'],0,'non-negative');
-            if(! $res['valid']) return [false,'出勤总天数:' . $res['error']];
-            $res = $this->checkNumber($value['rd_total_days'],0,'non-negative');
-            if(! $res['valid']) return [false,'研发出勤总天数:' . $res['error']];
-            $res = $this->checkNumber($value['total_hours'],2,'non-negative');
-            if(! $res['valid']) return [false,'出勤总工时:' . $res['error']];
-            $res = $this->checkNumber($value['rd_total_hours'],2,'non-negative');
-            if(! $res['valid']) return [false,'研发总工时:' . $res['error']];
-
-            $data['details'][$key]['top_depart_id'] = $data['top_depart_id'];
-        }
-        list($status, $msg) = $this->checkArrayRepeat($data['details'],'employee_id','人员');
-        if(! $status) return [false, $msg];
-
-        if($is_add){
-            $bool = MonthlyPwOrder::where('top_depart_id', $data['top_depart_id'])
-                ->where('month', $data['month'])
-                ->where('del_time',0)
-                ->exists();
-        }else{
-            if(empty($data['id'])) return [false,'ID不能为空'];
-            $bool = MonthlyPwOrder::where('top_depart_id', $data['top_depart_id'])
-                ->where('month', $data['month'])
-                ->where('id','<>',$data['id'])
-                ->where('del_time',0)
-                ->exists();
-        }
-        if($bool) return [false, date("Y-m", $data['month']) . '已存在人员月度研发工时单'];
-
-        return [true, ''];
-    }
-
     public function fillData($data){
         if(empty($data['data'])) return $data;
 
@@ -498,13 +471,22 @@ class PersonWorkService extends Service
         return $detail;
     }
 
-    public function dailyPwOrderDel($data){
+    public function dailyPwOrderDel($data, $user){
         if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
 
         try {
             DB::beginTransaction();
             $time = time();
 
+            $month = DailyPwOrder::where('del_time',0)
+                ->whereIn('id',$data['id'])
+                ->pluck('order_time')
+                ->toArray();
+
+            //归档
+            list($status, $msg) = ArchiveService::isArchive($month, $user);
+            if(! $status) return [false, $msg];
+
             DailyPwOrder::where('del_time',0)
                 ->whereIn('id',$data['id'])
                 ->update(['del_time' => $time]);
@@ -583,16 +565,20 @@ class PersonWorkService extends Service
     }
 
     public function dailyPwOrderRule(&$data, $user, $is_add = true){
+        $data['top_depart_id'] = $user['top_depart_id'];
         if(empty($data['order_time'])) return [false, '单据日期不能为空'];
         $data['order_time'] = $this->changeDateToDate($data['order_time']);
         $orderTime = $data['order_time'];
         $itemId = $data['item_id'] ?? 0;
 
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($data['order_time'], $user);
+        if(! $status) return [false, $msg];
+
         if(empty($itemId)) return [false, '项目不能为空'];
         $bool = Item::where('del_time',0)->where('id', $itemId)->exists();
         if(!$bool) return [false, '项目不存在或已被删除'];
 
-        $data['top_depart_id'] = $user['top_depart_id'];
         if(empty($data['details'])) return [false, '人员日工时单明细不能为空'];
 
         // --- 1. 批量预获取人员信息,用于报错提示 ---
@@ -1048,6 +1034,10 @@ class PersonWorkService extends Service
         // 1. 前置校验 (保留你之前的校验逻辑)
         $monthStart = $this->changeDateToDate($data['month']);
 
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($monthStart, $user);
+        if(! $status) return [false, $msg];
+
         // 1. 检查是否存在月度工时明细
         $hasMonthlyOrder = DB::table('monthly_pw_order_details as d')
             ->join('monthly_pw_order as m', 'm.id', '=', 'd.main_id')
@@ -1265,7 +1255,13 @@ class PersonWorkService extends Service
         if (empty($list)) return [false, '没有可保存的数据'];
 
         $topDepartId = $user['top_depart_id'];
-        $month = $data['month']; // 格式如: "2026-03"
+        $month = $data['month'];
+        $monthStart = $this->changeDateToDate($month);
+
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($monthStart, $user);
+        if(! $status) return [false, $msg];
+
         $now = time();
 
         // 1. 预加载员工名称映射 (使用 title 字段)
@@ -1287,7 +1283,6 @@ class PersonWorkService extends Service
         DB::beginTransaction();
         try {
             // A. 清理该月份旧数据
-            $monthStart = $this->changeDateToDate($month);
             $monthEnd = strtotime('+1 month', $monthStart) - 1;
 
             $oldOrderIds = DB::table('daily_pw_order')
@@ -1381,7 +1376,7 @@ class PersonWorkService extends Service
             }
 
             DB::commit();
-            return [true, '保存成功'];
+            return [true, ''];
         } catch (\Exception $e) {
             DB::rollBack();
             return [false, "保存失败:" . $e->getMessage()];

+ 14 - 1
app/Service/RuleSetService.php

@@ -168,13 +168,22 @@ class RuleSetService extends Service
         return $detail;
     }
 
-    public function ruleSetDel($data){
+    public function ruleSetDel($data, $user){
         if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
 
         try {
             DB::beginTransaction();
             $time = time();
 
+            $month = RuleSet::where('del_time',0)
+                ->whereIn('id',$data['id'])
+                ->pluck('month')
+                ->toArray();
+
+            //归档
+            list($status, $msg) = ArchiveService::isArchive($month, $user);
+            if(! $status) return [false, $msg];
+
             RuleSet::where('del_time',0)
                 ->whereIn('id',$data['id'])
                 ->update(['del_time' => $time]);
@@ -247,6 +256,10 @@ class RuleSetService extends Service
         if (empty($data['month'])) return [false, '月份不能为空'];
         $data['month'] = $this->changeDateToDate($data['month']);
 
+        //归档
+        list($status, $msg) = ArchiveService::isArchive($data['month'], $user);
+        if(! $status) return [false, $msg];
+
         // --- 0. 批量预加载档案用于错误提示 (核心优化点) ---
         $manIds = array_unique(array_column($data['man_list'] ?? [], 'data_id'));
         $devIds = array_unique(array_column($data['device_list'] ?? [], 'data_id'));