|
|
@@ -9,6 +9,7 @@ use App\Model\Employee;
|
|
|
use App\Model\Fee;
|
|
|
use App\Model\Item;
|
|
|
use App\Model\ItemDetails;
|
|
|
+use App\Model\MonthlyPsOrder;
|
|
|
use App\Model\MonthlyPwOrder;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|
|
@@ -24,6 +25,7 @@ class ImportService extends Service
|
|
|
'fee', // 费用
|
|
|
'monthPwOrder', // 人员月度研发工时单
|
|
|
'monthDwOrder', // 设备月度研发工时单
|
|
|
+ 'monthPsOrder', // 人员月度工资单
|
|
|
];
|
|
|
|
|
|
public function getTableTitleXls($data,$user){
|
|
|
@@ -110,6 +112,17 @@ class ImportService extends Service
|
|
|
return [true, [$config_array, $filename]];
|
|
|
}
|
|
|
|
|
|
+ private function monthPsOrder($data,$user){
|
|
|
+ $config = $this->getTableConfig($data['type']);
|
|
|
+ if(empty($config)) return [false, ['导入配置表头文件不存在','']];
|
|
|
+
|
|
|
+ $config_array = $config['array'] ?? [];
|
|
|
+ //生成下载文件
|
|
|
+ $filename = $config['name'] . "导入模板_" . time() . '.' . 'xlsx';
|
|
|
+
|
|
|
+ return [true, [$config_array, $filename]];
|
|
|
+ }
|
|
|
+
|
|
|
//导入入口
|
|
|
public function importAll($data,$user){
|
|
|
// //不超时
|
|
|
@@ -246,6 +259,8 @@ class ImportService extends Service
|
|
|
$map_type = array_flip(Device::$type);
|
|
|
$map_type_2 = array_flip(Device::Use);
|
|
|
foreach ($array as $rowIndex => $value) {
|
|
|
+ $displayLine = $rowIndex + 1;
|
|
|
+
|
|
|
$valCode = $value[$codeIdx] ?? '';
|
|
|
|
|
|
// 记录更新 ID
|
|
|
@@ -254,12 +269,12 @@ class ImportService extends Service
|
|
|
}
|
|
|
|
|
|
if(empty($map_type[$value[$typeIdx]])){
|
|
|
- $errors[] = "第{$rowIndex}行固定资产类型错误";
|
|
|
+ $errors[] = "第{$displayLine}行固定资产类型错误";
|
|
|
}else{
|
|
|
$array[$rowIndex][$typeIdx] = $map_type[$value[$typeIdx]];
|
|
|
}
|
|
|
if(empty($map_type_2[$value[$type2Idx]])){
|
|
|
- $errors[] = "第{$rowIndex}行是否启用错误";
|
|
|
+ $errors[] = "第{$displayLine}行是否启用错误";
|
|
|
}else{
|
|
|
$array[$rowIndex][$type2Idx] = $map_type_2[$value[$type2Idx]];
|
|
|
}
|
|
|
@@ -268,7 +283,7 @@ class ImportService extends Service
|
|
|
if($dateIdx !== false && !empty($value[$dateIdx])){
|
|
|
list($status, $msg) = $this->convertExcelCellToDate($value[$dateIdx]);
|
|
|
if(!$status) {
|
|
|
- $errors[] = "第{$rowIndex}行日期格式错误";
|
|
|
+ $errors[] = "第{$displayLine}行日期格式错误";
|
|
|
} else {
|
|
|
$array[$rowIndex][$dateIdx] = $msg;
|
|
|
}
|
|
|
@@ -443,6 +458,8 @@ class ImportService extends Service
|
|
|
$state_type_map = array_flip(Item::State_Type);
|
|
|
|
|
|
foreach ($array as $rowIndex => $rowValue) {
|
|
|
+ $displayLine = $rowIndex + 1;
|
|
|
+
|
|
|
$valCode = $rowValue[$codeIdx] ?? '';
|
|
|
|
|
|
// 1. 判定更新还是新增
|
|
|
@@ -453,7 +470,7 @@ class ImportService extends Service
|
|
|
// 2. 状态校验
|
|
|
$state_text = $rowValue[$stateIdx] ?? '';
|
|
|
if (!isset($state_type_map[$state_text])) {
|
|
|
- $errors[] = "第{$rowIndex}行:状态[{$state_text}]无效";
|
|
|
+ $errors[] = "第{$displayLine}行:状态[{$state_text}]无效";
|
|
|
} else {
|
|
|
$array[$rowIndex][$stateIdx] = $state_type_map[$state_text];
|
|
|
}
|
|
|
@@ -462,7 +479,7 @@ class ImportService extends Service
|
|
|
foreach ([$dateIdx, $date2Idx] as $dIdx) {
|
|
|
if ($dIdx !== false && !empty($rowValue[$dIdx])) {
|
|
|
list($s, $m) = $this->convertExcelCellToDate($rowValue[$dIdx]);
|
|
|
- if (!$s) $errors[] = "第{$rowIndex}行:日期格式非法";
|
|
|
+ if (!$s) $errors[] = "第{$displayLine}行:日期格式非法";
|
|
|
else $array[$rowIndex][$dIdx] = $m;
|
|
|
}
|
|
|
}
|
|
|
@@ -472,7 +489,7 @@ class ImportService extends Service
|
|
|
foreach (explode(',', $rowValue[$manIdx]) as $mNum) {
|
|
|
$mNum = trim($mNum);
|
|
|
if (!isset($man_map[$mNum])) {
|
|
|
- $errors[] = "第{$rowIndex}行:人员编码[{$mNum}]不存在";
|
|
|
+ $errors[] = "第{$displayLine}行:人员工号[{$mNum}]不存在";
|
|
|
} else {
|
|
|
$detail_storage[$rowIndex][] = [
|
|
|
'type' => ItemDetails::type_one,
|
|
|
@@ -487,7 +504,7 @@ class ImportService extends Service
|
|
|
foreach (explode(',', $rowValue[$deviceIdx]) as $dCode) {
|
|
|
$dCode = trim($dCode);
|
|
|
if (!isset($device_map[$dCode])) {
|
|
|
- $errors[] = "第{$rowIndex}行:资产编码[{$dCode}]不存在";
|
|
|
+ $errors[] = "第{$displayLine}行:设备的资产编码[{$dCode}]不存在";
|
|
|
} else {
|
|
|
$detail_storage[$rowIndex][] = [
|
|
|
'type' => ItemDetails::type_two,
|
|
|
@@ -651,6 +668,8 @@ class ImportService extends Service
|
|
|
|
|
|
// 3. 逐行校验
|
|
|
foreach ($array as $rowIndex => $value) {
|
|
|
+ $displayLine = $rowIndex + 1;
|
|
|
+
|
|
|
$valCode = trim($value[$codeIdx] ?? '');
|
|
|
$valParentCode = trim($value[$parentIdx] ?? '');
|
|
|
|
|
|
@@ -665,13 +684,13 @@ class ImportService extends Service
|
|
|
// --- A. 存在性校验 ---
|
|
|
// 这里会检查 006 是否在数据库,或者是否在本次 Excel 的其他行中
|
|
|
if (!isset($dbFeeMap[$valParentCode]) && !isset($excelCodesMap[$valParentCode])) {
|
|
|
- $errors[] = "第{$rowIndex}行:上级编码[{$valParentCode}]在系统和文件中均不存在";
|
|
|
+ $errors[] = "第{$displayLine}行:上级编码[{$valParentCode}]在系统和文件中均不存在";
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
// --- B. 自引用校验 ---
|
|
|
if ($valCode === $valParentCode) {
|
|
|
- $errors[] = "第{$rowIndex}行:上级编码不能是自身";
|
|
|
+ $errors[] = "第{$displayLine}行:上级编码不能是自身";
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
@@ -680,9 +699,9 @@ class ImportService extends Service
|
|
|
$res = $this->findLoopInAncestors($valParentCode, $valCode, $currentExcelMap, $dbFeeMap, $visited);
|
|
|
if ($res !== false) {
|
|
|
if ($res['type'] === 'LOOP_SELF') {
|
|
|
- $errors[] = "第{$rowIndex}行:编码[{$valCode}]与上级[{$valParentCode}]存在循环引用";
|
|
|
+ $errors[] = "第{$displayLine}行:编码[{$valCode}]与上级[{$valParentCode}]存在循环引用";
|
|
|
} else {
|
|
|
- $errors[] = "第{$rowIndex}行:上级[{$valParentCode}]的溯源链条已成环";
|
|
|
+ $errors[] = "第{$displayLine}行:上级[{$valParentCode}]的溯源链条已成环";
|
|
|
}
|
|
|
continue;
|
|
|
}
|
|
|
@@ -878,6 +897,11 @@ class ImportService extends Service
|
|
|
$startIdx = array_search('start_time', $keys);
|
|
|
$endIdx = array_search('end_time', $keys);
|
|
|
|
|
|
+ $numIdx = array_search('total_days', $keys);
|
|
|
+ $num2Idx = array_search('rd_total_days', $keys);
|
|
|
+ $num3Idx = array_search('total_hours', $keys);
|
|
|
+ $num4Idx = array_search('rd_total_hours', $keys);
|
|
|
+
|
|
|
// 1. 预加载基础数据
|
|
|
$allEmpNumbers = array_filter(array_unique(array_column($array, $empIdx)));
|
|
|
$dbEmps = Employee::where('del_time', 0)
|
|
|
@@ -911,6 +935,11 @@ class ImportService extends Service
|
|
|
$valStartRaw = $row[$startIdx] ?? '';
|
|
|
$valEndRaw = $row[$endIdx] ?? '';
|
|
|
|
|
|
+ $valNumRaw = $row[$numIdx] ?? 0;
|
|
|
+ $valNum2Raw = $row[$num2Idx] ?? 0;
|
|
|
+ $valNum3Raw = $row[$num3Idx] ?? 0;
|
|
|
+ $valNum4Raw = $row[$num4Idx] ?? 0;
|
|
|
+
|
|
|
// --- A. 日期转换校验 ---
|
|
|
// 转换月份
|
|
|
list($mStatus, $valMonthTs) = $this->convertExcelCellToDate($valMonthRaw);
|
|
|
@@ -978,6 +1007,16 @@ class ImportService extends Service
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // --- F. 数字校验
|
|
|
+ $res = $this->checkNumber($valNumRaw,0,'non-negative');
|
|
|
+ if(! $res['valid']) $errors[] = "第{$displayLine}行出勤总天数:" . $res['error'];
|
|
|
+ $res = $this->checkNumber($valNum2Raw,0,'non-negative');
|
|
|
+ if(! $res['valid']) $errors[] = "第{$displayLine}行研发出勤总天数:" . $res['error'];
|
|
|
+ $res = $this->checkNumber($valNum3Raw,2,'non-negative');
|
|
|
+ if(! $res['valid']) $errors[] = "第{$displayLine}行出勤总工时:" . $res['error'];
|
|
|
+ $res = $this->checkNumber($valNum4Raw,2,'non-negative');
|
|
|
+ if(! $res['valid']) $errors[] = "第{$displayLine}行研发总工时:" . $res['error'];
|
|
|
+
|
|
|
// 将转换后的时间戳写回原数组,方便后续写入数据库时直接使用
|
|
|
$array[$rowIndex][$monthIdx] = $valMonthTs;
|
|
|
$array[$rowIndex][$startIdx] = $startTime;
|
|
|
@@ -1110,6 +1149,11 @@ class ImportService extends Service
|
|
|
$startIdx = array_search('start_time', $keys);
|
|
|
$endIdx = array_search('end_time', $keys);
|
|
|
|
|
|
+ $numIdx = array_search('total_days', $keys);
|
|
|
+ $num2Idx = array_search('rd_total_days', $keys);
|
|
|
+ $num3Idx = array_search('total_hours', $keys);
|
|
|
+ $num4Idx = array_search('rd_total_hours', $keys);
|
|
|
+
|
|
|
// 1. 预加载基础数据
|
|
|
$allEmpNumbers = array_filter(array_unique(array_column($array, $devIdx)));
|
|
|
$dbDevs = Device::where('del_time', 0)
|
|
|
@@ -1143,6 +1187,11 @@ class ImportService extends Service
|
|
|
$valStartRaw = $row[$startIdx] ?? '';
|
|
|
$valEndRaw = $row[$endIdx] ?? '';
|
|
|
|
|
|
+ $valNumRaw = $row[$numIdx] ?? 0;
|
|
|
+ $valNum2Raw = $row[$num2Idx] ?? 0;
|
|
|
+ $valNum3Raw = $row[$num3Idx] ?? 0;
|
|
|
+ $valNum4Raw = $row[$num4Idx] ?? 0;
|
|
|
+
|
|
|
// --- A. 日期转换校验 ---
|
|
|
// 转换月份
|
|
|
list($mStatus, $valMonthTs) = $this->convertExcelCellToDate($valMonthRaw);
|
|
|
@@ -1210,6 +1259,16 @@ class ImportService extends Service
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // --- F. 数字校验
|
|
|
+ $res = $this->checkNumber($valNumRaw,0,'non-negative');
|
|
|
+ if(! $res['valid']) $errors[] = "第{$displayLine}行出勤总天数:" . $res['error'];
|
|
|
+ $res = $this->checkNumber($valNum2Raw,0,'non-negative');
|
|
|
+ if(! $res['valid']) $errors[] = "第{$displayLine}行研发出勤总天数:" . $res['error'];
|
|
|
+ $res = $this->checkNumber($valNum3Raw,2,'non-negative');
|
|
|
+ if(! $res['valid']) $errors[] = "第{$displayLine}行出勤总工时:" . $res['error'];
|
|
|
+ $res = $this->checkNumber($valNum4Raw,2,'non-negative');
|
|
|
+ if(! $res['valid']) $errors[] = "第{$displayLine}行研发总工时:" . $res['error'];
|
|
|
+
|
|
|
// 将转换后的时间戳写回原数组,方便后续写入数据库时直接使用
|
|
|
$array[$rowIndex][$monthIdx] = $valMonthTs;
|
|
|
$array[$rowIndex][$startIdx] = $startTime;
|
|
|
@@ -1220,6 +1279,225 @@ class ImportService extends Service
|
|
|
return [$error_string, $update_map, $dbDevs];
|
|
|
}
|
|
|
|
|
|
+ // 人员月度工资单
|
|
|
+ public function monthPsOrderImport($array, $user, $other_param)
|
|
|
+ {
|
|
|
+ $upload = $array[0];
|
|
|
+ list($status, $msg) = $this->compareTableAndReturn($upload, $other_param);
|
|
|
+ if (!$status) return [false, $msg];
|
|
|
+ $table_config = $msg;
|
|
|
+
|
|
|
+ unset($array[0]);
|
|
|
+ if (empty($array)) return [false, '导入数据不能为空'];
|
|
|
+
|
|
|
+ list($array, $error) = $this->checkCommon($array, $table_config);
|
|
|
+ if (!empty($error)) return [0, $error];
|
|
|
+
|
|
|
+ // 2. 详细校验 (这里会返回 update_map 和 dbEmps 映射)
|
|
|
+ list($error, $update_map, $dbEmps) = $this->monthPsOrderCheck($array, $user, $table_config);
|
|
|
+ if (!empty($error)) return [0, $error];
|
|
|
+
|
|
|
+ $keys = array_column($table_config, 'key');
|
|
|
+ $codeIdx = array_search('code', $keys);
|
|
|
+ $monthIdx = array_search('month', $keys);
|
|
|
+ $empIdx = array_search('employee_id', $keys);
|
|
|
+
|
|
|
+ // --- 步骤 1: 数据聚合分组 ---
|
|
|
+ // 将 Excel 数据按“单据”维度归类
|
|
|
+ $groups = [];
|
|
|
+ foreach ($array as $rowIndex => $row) {
|
|
|
+ $cCode = trim($row[$codeIdx] ?? '');
|
|
|
+ $cMonthTs = $row[$monthIdx]; // 校验阶段已转为时间戳
|
|
|
+
|
|
|
+ // 聚合 Key:有编码用编码,没编码用月份标记
|
|
|
+ $aggKey = $cCode ?: "MONTH_" . $cMonthTs;
|
|
|
+
|
|
|
+ if (!isset($groups[$aggKey])) {
|
|
|
+ $groups[$aggKey] = [
|
|
|
+ 'main_id' => $update_map[$rowIndex] ?? 0, // 如果存在则是编辑
|
|
|
+ 'code' => $cCode,
|
|
|
+ 'month' => $cMonthTs,
|
|
|
+ 'details' => []
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ // 准备详情行数据
|
|
|
+ $detailTmp = [];
|
|
|
+ foreach ($table_config as $k => $conf) {
|
|
|
+ if (!$conf['is_main']) {
|
|
|
+ $fieldKey = $conf['key'];
|
|
|
+ $fieldVal = $row[$k];
|
|
|
+ // 如果是人员,转换为 ID
|
|
|
+ if ($fieldKey == 'employee_id') {
|
|
|
+ $fieldVal = $dbEmps[$fieldVal] ?? 0;
|
|
|
+ }
|
|
|
+ $detailTmp[$fieldKey] = $fieldVal;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $groups[$aggKey]['details'][] = $detailTmp;
|
|
|
+ }
|
|
|
+
|
|
|
+ // --- 步骤 2: 开启事务写入 ---
|
|
|
+ DB::beginTransaction();
|
|
|
+ try {
|
|
|
+ $time = time();
|
|
|
+ foreach ($groups as $aggKey => $group) {
|
|
|
+ $mainId = $group['main_id'];
|
|
|
+
|
|
|
+ if ($mainId > 0) {
|
|
|
+ // 删除旧详情
|
|
|
+ DB::table('monthly_ps_order_details')->where('del_time',0)
|
|
|
+ ->where('main_id', $mainId)
|
|
|
+ ->update(['del_time' => $time]);
|
|
|
+ } else {
|
|
|
+ // B. 新增逻辑
|
|
|
+ $newCode = $this->generateBillNo([
|
|
|
+ 'top_depart_id' => $user['top_depart_id'],
|
|
|
+ 'type' => MonthlyPsOrder::Order_type,
|
|
|
+ 'period' => date("Ym", $group['month'])
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $mainId = DB::table('monthly_ps_order')->insertGetId([
|
|
|
+ 'code' => $newCode,
|
|
|
+ 'month' => $group['month'],
|
|
|
+ 'top_depart_id' => $user['top_depart_id'],
|
|
|
+ 'crt_id' => $user['id'],
|
|
|
+ 'crt_time' => $time,
|
|
|
+ 'upd_time' => $time,
|
|
|
+ 'del_time' => 0
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // C. 批量插入详情
|
|
|
+ $insertDetails = [];
|
|
|
+ foreach ($group['details'] as $detail) {
|
|
|
+ $detail['main_id'] = $mainId;
|
|
|
+ $detail['top_depart_id']= $user['top_depart_id'];
|
|
|
+ $detail['crt_time'] = $time;
|
|
|
+ $detail['del_time'] = 0;
|
|
|
+ $insertDetails[] = $detail;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!empty($insertDetails)) {
|
|
|
+ DB::table('monthly_ps_order_details')->insert($insertDetails);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ DB::commit();
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ DB::rollBack();
|
|
|
+ return [false, "失败:" . $e->getMessage() . " (行号:" . $e->getLine() . ")"];
|
|
|
+ }
|
|
|
+
|
|
|
+ return [true, ''];
|
|
|
+ }
|
|
|
+
|
|
|
+ private function monthPsOrderCheck(&$array, $user, $table_config)
|
|
|
+ {
|
|
|
+ $keys = array_column($table_config, 'key');
|
|
|
+ $codeIdx = array_search('code', $keys);
|
|
|
+ $monthIdx = array_search('month', $keys);
|
|
|
+ $empIdx = array_search('employee_id', $keys);
|
|
|
+
|
|
|
+ $numIdx = array_search('salary', $keys);
|
|
|
+ $num2Idx = array_search('social_insurance', $keys);
|
|
|
+ $num3Idx = array_search('public_housing_fund', $keys);
|
|
|
+
|
|
|
+ // 1. 预加载基础数据
|
|
|
+ $allEmpNumbers = array_filter(array_unique(array_column($array, $empIdx)));
|
|
|
+ $dbEmps = Employee::where('del_time', 0)
|
|
|
+ ->whereIn('number', $allEmpNumbers)
|
|
|
+ ->where('top_depart_id', $user['top_depart_id'])
|
|
|
+ ->pluck('id', 'number')->toArray();
|
|
|
+
|
|
|
+ $allCodes = array_filter(array_unique(array_column($array, $codeIdx)));
|
|
|
+ $dbOrders = DB::table('monthly_ps_order')
|
|
|
+ ->whereIn('code', $allCodes)
|
|
|
+ ->where('top_depart_id', $user['top_depart_id'])
|
|
|
+ ->get()->keyBy('code');
|
|
|
+
|
|
|
+ $existingMonths = DB::table('monthly_ps_order')
|
|
|
+ ->where('top_depart_id', $user['top_depart_id'])
|
|
|
+ ->pluck('month')
|
|
|
+ ->toArray();
|
|
|
+ $existingMonthsMap = array_fill_keys($existingMonths, true);
|
|
|
+
|
|
|
+ $excelAggregator = [];
|
|
|
+ $errors = [];
|
|
|
+ $update_map = [];
|
|
|
+
|
|
|
+ foreach ($array as $rowIndex => $row) {
|
|
|
+ // 用户看到的行号(假设数据从第2行开始)
|
|
|
+ $displayLine = $rowIndex + 1;
|
|
|
+
|
|
|
+ $valCode = trim($row[$codeIdx] ?? '');
|
|
|
+ $valMonthRaw = trim($row[$monthIdx] ?? '');
|
|
|
+ $valEmp = trim($row[$empIdx] ?? '');
|
|
|
+
|
|
|
+ $valNumRaw = $row[$numIdx] ?? 0;
|
|
|
+ $valNum2Raw = $row[$num2Idx] ?? 0;
|
|
|
+ $valNum3Raw = $row[$num3Idx] ?? 0;
|
|
|
+
|
|
|
+ // --- A. 日期转换校验 ---
|
|
|
+ // 转换月份
|
|
|
+ list($mStatus, $valMonthTs) = $this->convertExcelCellToDate($valMonthRaw);
|
|
|
+ if (!$mStatus) {
|
|
|
+ $errors[] = "第{$displayLine}行:月份格式错误({$valMonthRaw})";
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 强制格式化为当月1号的时间戳,确保聚合逻辑一致
|
|
|
+ $valMonthTs = strtotime(date('Y-m-01', $valMonthTs));
|
|
|
+
|
|
|
+ $aggKey = $valCode ?: "NEW_ORDER_" . $valMonthTs;
|
|
|
+
|
|
|
+ // --- B. 校验单据与月份的一致性 ---
|
|
|
+ if ($valCode && isset($dbOrders[$valCode])) {
|
|
|
+ $dbOrder = $dbOrders[$valCode];
|
|
|
+ if ($dbOrder->month != $valMonthTs) {
|
|
|
+ $errors[] = "第{$displayLine}行:单据编码[{$valCode}]对应月份为[" . date('Y-m', $dbOrder->month) . "],与导入月份不符";
|
|
|
+ }
|
|
|
+ $update_map[$rowIndex] = $dbOrder->id;
|
|
|
+ }
|
|
|
+
|
|
|
+ // --- C. 校验人员存在性与单据内唯一性 ---
|
|
|
+ if (!isset($dbEmps[$valEmp])) {
|
|
|
+ $errors[] = "第{$displayLine}行:人员工号[{$valEmp}]不存在";
|
|
|
+ } else {
|
|
|
+ if (isset($excelAggregator[$aggKey]['emps'][$valEmp])) {
|
|
|
+ $errors[] = "第{$displayLine}行:人员[{$valEmp}]在同一单据中重复";
|
|
|
+ }
|
|
|
+ $excelAggregator[$aggKey]['emps'][$valEmp] = true;
|
|
|
+
|
|
|
+ if (isset($excelAggregator[$aggKey]['month_ts']) && $excelAggregator[$aggKey]['month_ts'] !== $valMonthTs) {
|
|
|
+ $errors[] = "第{$displayLine}行:同组数据的月份不统一";
|
|
|
+ }
|
|
|
+ $excelAggregator[$aggKey]['month_ts'] = $valMonthTs;
|
|
|
+ }
|
|
|
+
|
|
|
+ // --- E. 月份唯一单据校验 (新增) ---
|
|
|
+ if (!$valCode) {
|
|
|
+ if (isset($existingMonthsMap[$valMonthTs])) {
|
|
|
+ $errors[] = "第{$displayLine}行:月份[ " . date('Y-m', $valMonthTs) . " ]已存在单据,请填编码编辑";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // --- F. 数字校验
|
|
|
+ $res = $this->checkNumber($valNumRaw,0,'non-negative');
|
|
|
+ if(! $res['valid']) $errors[] = "第{$displayLine}行工资总额:" . $res['error'];
|
|
|
+ $res = $this->checkNumber($valNum2Raw,0,'non-negative');
|
|
|
+ if(! $res['valid']) $errors[] = "第{$displayLine}行社保:" . $res['error'];
|
|
|
+ $res = $this->checkNumber($valNum3Raw,2,'non-negative');
|
|
|
+ if(! $res['valid']) $errors[] = "第{$displayLine}行公积金:" . $res['error'];
|
|
|
+
|
|
|
+ // 将转换后的时间戳写回原数组,方便后续写入数据库时直接使用
|
|
|
+ $array[$rowIndex][$monthIdx] = $valMonthTs;
|
|
|
+ }
|
|
|
+
|
|
|
+ $error_string = !empty($errors) ? implode('|', $errors) : "";
|
|
|
+ return [$error_string, $update_map, $dbEmps];
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
//公共校验 -----------------------------------------
|
|
|
private function checkCommon($array, $table_config) {
|
|
|
$error = [];
|