cqp 3 месяцев назад
Родитель
Сommit
f626b6510b
1 измененных файлов с 42 добавлено и 31 удалено
  1. 42 31
      app/Service/RuleSetService.php

+ 42 - 31
app/Service/RuleSetService.php

@@ -235,76 +235,87 @@ class RuleSetService extends Service
         return [true, $list];
     }
 
-    public function ruleSetRule(&$data, $user, $is_add = true){
+    public function ruleSetRule(&$data, $user, $is_add = true)
+    {
         $data['top_depart_id'] = $user['top_depart_id'];
-        if(empty($data['month'])) return [false, '月份不能为空'];
+        if (empty($data['month'])) return [false, '月份不能为空'];
         $data['month'] = $this->changeDateToDate($data['month']);
 
+        // --- 0. 批量预加载档案用于错误提示 (核心优化点) ---
+        $manIds = array_unique(array_column($data['man_list'] ?? [], 'data_id'));
+        $devIds = array_unique(array_column($data['device_list'] ?? [], 'data_id'));
+
+        $manMap = Employee::whereIn('id', $manIds)->get(['id', 'number', 'title'])
+            ->mapWithKeys(fn($item) => [$item->id => "[{$item->number}]{$item->title}"]);
+
+        $devMap = Device::whereIn('id', $devIds)->get(['id', 'code', 'title'])
+            ->mapWithKeys(fn($item) => [$item->id => "[{$item->code}]{$item->title}"]);
+
         // --- 1. 人员列表校验 ---
-        if(empty($data['man_list'])) return [false, '人员不能为空'];
-        $manRates = []; // 用于累加每个人员的比例
-        foreach ($data['man_list'] as $key => $value){
-            if(empty($value['type'])) return [false, '类型不能为空'];
-            if(empty($value['data_id'])) return [false, '人员不能为空'];
-            if(empty($value['item_id'])) return [false, '项目不能为空'];
+        if (empty($data['man_list'])) return [false, '人员不能为空'];
+        $manRates = [];
+        foreach ($data['man_list'] as $key => $value) {
+            if (empty($value['type'])) return [false, '类型不能为空'];
+            if (empty($value['data_id'])) return [false, '人员不能为空'];
+            if (empty($value['item_id'])) return [false, '项目不能为空'];
 
             $res = $this->checkNumber($value['rate'], 2, 'non-negative');
-            if(! $res['valid']) return [false, '人员工时分摊比例:' . $res['error']];
+            if (!$res['valid']) return [false, '人员工时分摊比例:' . $res['error']];
 
             $data['man_list'][$key]['top_depart_id'] = $data['top_depart_id'];
 
-            // 累加比例 (以 data_id 为 key)
             $manId = $value['data_id'];
             $manRates[$manId] = ($manRates[$manId] ?? 0) + $value['rate'];
         }
 
-        // 校验每个人员的比例之和是否为 100
+        // 校验人员比例 (错误提示加入人名)
         foreach ($manRates as $mId => $total) {
             if (abs($total - 100) > 0.0001) {
-                return [false, "ID为[{$mId}]的人员分摊比例合计为{$total}%,必须等于100%"];
+                $displayName = $manMap[$mId] ?? "ID:{$mId}";
+                return [false, "人员{$displayName}的分摊比例合计为{$total}%,必须等于100%"];
             }
         }
 
         // --- 2. 设备列表校验 ---
-        if(empty($data['device_list'])) return [false, '设备不能为空'];
-        $deviceRates = []; // 用于累加每个设备的比例
-        foreach ($data['device_list'] as $key => $value){
-            if(empty($value['type'])) return [false, '类型不能为空'];
-            if(empty($value['data_id'])) return [false, '设备ID不能为空'];
-            if(empty($value['item_id'])) return [false, '项目不能为空'];
+        if (empty($data['device_list'])) return [false, '设备不能为空'];
+        $deviceRates = [];
+        foreach ($data['device_list'] as $key => $value) {
+            if (empty($value['type'])) return [false, '类型不能为空'];
+            if (empty($value['data_id'])) return [false, '设备ID不能为空'];
+            if (empty($value['item_id'])) return [false, '项目不能为空'];
 
             $res = $this->checkNumber($value['rate'], 2, 'non-negative');
-            if(! $res['valid']) return [false, '设备工时分摊比例:' . $res['error']];
+            if (!$res['valid']) return [false, '设备工时分摊比例:' . $res['error']];
 
             $data['device_list'][$key]['top_depart_id'] = $data['top_depart_id'];
 
-            // 累加比例
             $devId = $value['data_id'];
             $deviceRates[$devId] = ($deviceRates[$devId] ?? 0) + $value['rate'];
         }
 
-        // 校验每个设备的比例之和是否为 100
+        // 校验设备比例 (错误提示加入设备名称)
         foreach ($deviceRates as $dId => $total) {
             if (abs($total - 100) > 0.0001) {
-                return [false, "ID为[{$dId}]的设备分摊比例合计为{$total}%,必须等于100%"];
+                $displayName = $devMap[$dId] ?? "ID:{$dId}";
+                return [false, "设备{$displayName}的分摊比例合计为{$total}%,必须等于100%"];
             }
         }
 
         // --- 3. 重复单据校验 ---
-        if($is_add){
-            $bool = RuleSet::where('month',$data['month'])
+        if ($is_add) {
+            $bool = RuleSet::where('month', $data['month'])
                 ->where('top_depart_id', $data['top_depart_id'])
-                ->where('del_time',0)
+                ->where('del_time', 0)
                 ->exists();
-        }else{
-            if(empty($data['id'])) return [false,'ID不能为空'];
-            $bool = RuleSet::where('month',$data['month'])
+        } else {
+            if (empty($data['id'])) return [false, 'ID不能为空'];
+            $bool = RuleSet::where('month', $data['month'])
                 ->where('top_depart_id', $data['top_depart_id'])
-                ->where('id','<>',$data['id'])
-                ->where('del_time',0)
+                ->where('id', '<>', $data['id'])
+                ->where('del_time', 0)
                 ->exists();
         }
-        if($bool) return [false, date("Y-m", $data['month']) . '的规则配置单已存在'];
+        if ($bool) return [false, date("Y-m", $data['month']) . '的规则配置单已存在'];
 
         return [true, ''];
     }