|
@@ -235,76 +235,87 @@ class RuleSetService extends Service
|
|
|
return [true, $list];
|
|
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'];
|
|
$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']);
|
|
$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. 人员列表校验 ---
|
|
// --- 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');
|
|
$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['man_list'][$key]['top_depart_id'] = $data['top_depart_id'];
|
|
|
|
|
|
|
|
- // 累加比例 (以 data_id 为 key)
|
|
|
|
|
$manId = $value['data_id'];
|
|
$manId = $value['data_id'];
|
|
|
$manRates[$manId] = ($manRates[$manId] ?? 0) + $value['rate'];
|
|
$manRates[$manId] = ($manRates[$manId] ?? 0) + $value['rate'];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 校验每个人员的比例之和是否为 100
|
|
|
|
|
|
|
+ // 校验人员比例 (错误提示加入人名)
|
|
|
foreach ($manRates as $mId => $total) {
|
|
foreach ($manRates as $mId => $total) {
|
|
|
if (abs($total - 100) > 0.0001) {
|
|
if (abs($total - 100) > 0.0001) {
|
|
|
- return [false, "ID为[{$mId}]的人员分摊比例合计为{$total}%,必须等于100%"];
|
|
|
|
|
|
|
+ $displayName = $manMap[$mId] ?? "ID:{$mId}";
|
|
|
|
|
+ return [false, "人员{$displayName}的分摊比例合计为{$total}%,必须等于100%"];
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// --- 2. 设备列表校验 ---
|
|
// --- 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');
|
|
$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'];
|
|
$data['device_list'][$key]['top_depart_id'] = $data['top_depart_id'];
|
|
|
|
|
|
|
|
- // 累加比例
|
|
|
|
|
$devId = $value['data_id'];
|
|
$devId = $value['data_id'];
|
|
|
$deviceRates[$devId] = ($deviceRates[$devId] ?? 0) + $value['rate'];
|
|
$deviceRates[$devId] = ($deviceRates[$devId] ?? 0) + $value['rate'];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 校验每个设备的比例之和是否为 100
|
|
|
|
|
|
|
+ // 校验设备比例 (错误提示加入设备名称)
|
|
|
foreach ($deviceRates as $dId => $total) {
|
|
foreach ($deviceRates as $dId => $total) {
|
|
|
if (abs($total - 100) > 0.0001) {
|
|
if (abs($total - 100) > 0.0001) {
|
|
|
- return [false, "ID为[{$dId}]的设备分摊比例合计为{$total}%,必须等于100%"];
|
|
|
|
|
|
|
+ $displayName = $devMap[$dId] ?? "ID:{$dId}";
|
|
|
|
|
+ return [false, "设备{$displayName}的分摊比例合计为{$total}%,必须等于100%"];
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// --- 3. 重复单据校验 ---
|
|
// --- 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('top_depart_id', $data['top_depart_id'])
|
|
|
- ->where('del_time',0)
|
|
|
|
|
|
|
+ ->where('del_time', 0)
|
|
|
->exists();
|
|
->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('top_depart_id', $data['top_depart_id'])
|
|
|
- ->where('id','<>',$data['id'])
|
|
|
|
|
- ->where('del_time',0)
|
|
|
|
|
|
|
+ ->where('id', '<>', $data['id'])
|
|
|
|
|
+ ->where('del_time', 0)
|
|
|
->exists();
|
|
->exists();
|
|
|
}
|
|
}
|
|
|
- if($bool) return [false, date("Y-m", $data['month']) . '的规则配置单已存在'];
|
|
|
|
|
|
|
+ if ($bool) return [false, date("Y-m", $data['month']) . '的规则配置单已存在'];
|
|
|
|
|
|
|
|
return [true, ''];
|
|
return [true, ''];
|
|
|
}
|
|
}
|