1. 【新增】售后单售后原因类型支持搜索

2. 【新增】手工创建订单折扣可输入正数

3. 【优化】盘点申请单确认

4. 【修复】采购退货单模拟出库失败问题

5. 【新增】订单金额客户实付与结算金额

6. 【优化】仓库发货统计报表物料名称显示

7. 【优化】自有仓储虚拟发货逻辑

8. 【修复】基础物料分类管理问题
This commit is contained in:
chenping
2026-04-01 11:59:17 +08:00
parent 9341122827
commit 61783b7d01
754 changed files with 46179 additions and 5700 deletions

View File

@@ -71,7 +71,10 @@ class financebase_data_task
$ioType->setFilePrefix(md5(KV_PREFIX . uniqid() . time()));
$ioType->setPageSize($page_size);
$ioType->setCellDateCnt($columnData['column'], $columnData['time_diff']);
$ioType->getData($file_name, 0, -1, 0, true);
// 支持指定工作表名称针对多工作表Excel文件如天猫优品
$sheet = isset($oProcess->sheet_name) ? $oProcess->sheet_name : 0;
$ioType->getData($file_name, $sheet, -1, 0, true);
if ($ioType->file_data) {
$storageLib = kernel::single('taskmgr_interface_storage');
@@ -277,8 +280,23 @@ class financebase_data_task
$fund_title = $workbook['fund'][0]; // 资金表标题(第一行)
// 3. 分别处理结算表和资金表,使用各自对应的标题
$settlement_result = $this->splitSettlementData($workbook['settlement'], $shop_id, $task_info, $page_size, $settlement_title);
$fund_result = $this->splitFundData($workbook['fund'], $shop_id, $task_info, $page_size, $fund_title);
$settlement_result = $this->splitSettlementData($workbook['settlement'], $shop_id, $task_info, $page_size, $settlement_title, $settlement_has_data);
$fund_result = $this->splitFundData($workbook['fund'], $shop_id, $task_info, $page_size, $fund_title, $fund_has_data);
// 检查两个工作表是否都为空
if (!$settlement_has_data && !$fund_has_data) {
// 更新导入记录状态为失败
if (isset($task_info['queue_data']['import_id'])) {
$db = kernel::database();
$import_id = intval($task_info['queue_data']['import_id']);
$sql = "UPDATE sdb_financebase_bill_import_jdwallet
SET status = 'failed',
error_msg = '结算表和资金表都为空,无法导入'
WHERE id = {$import_id}";
$db->exec($sql);
}
return array(false, '结算表和资金表都为空,无法导入');
}
if (!$settlement_result || !$fund_result) {
// 更新导入记录状态为失败
@@ -408,7 +426,19 @@ class financebase_data_task
$data[] = $title; // 第一行是标题
while (($row = $excel->nextRow()) !== null) {
$data[] = $row;
// 过滤空行:检查所有字段是否都为空
$is_empty = true;
foreach ($row as $value) {
if (!empty(trim($value))) {
$is_empty = false;
break;
}
}
// 只有非空行才添加到数据中
if (!$is_empty) {
$data[] = $row;
}
}
return $data;
@@ -425,19 +455,38 @@ class financebase_data_task
* @param array $task_info 任务信息
* @param int $page_size 分片大小
* @param array $title 标题信息
* @param bool &$has_data 返回是否有有效数据
* @return bool
*/
private function splitSettlementData($sheet_data, $shop_id, $task_info, $page_size, $title)
private function splitSettlementData($sheet_data, $shop_id, $task_info, $page_size, $title, &$has_data)
{
$has_data = false;
// 处理结算表数据
if (empty($sheet_data) || count($sheet_data) < 2) {
return false;
return true; // 允许结算表为空,但标记为无数据
}
// 第一行是标题,从第二行开始是数据
$data_rows = array_slice($sheet_data, 1);
$headers = $sheet_data[0];
// 检查是否有有效的数据行(非空行)
foreach ($data_rows as $row) {
// 检查行中是否有非空值
foreach ($row as $value) {
if (!empty(trim($value))) {
$has_data = true;
break 2; // 跳出两层循环
}
}
}
// 如果没有有效数据直接返回true结算表可能为空
if (!$has_data) {
return true;
}
$chunk_count = 0;
$file_prefix = md5(KV_PREFIX . 'settlement_' . time());
@@ -476,19 +525,39 @@ class financebase_data_task
* @param array $task_info 任务信息
* @param int $page_size 分片大小
* @param array $title 标题信息
* @param bool &$has_data 返回是否有有效数据
* @return bool
*/
private function splitFundData($sheet_data, $shop_id, $task_info, $page_size, $title)
private function splitFundData($sheet_data, $shop_id, $task_info, $page_size, $title, &$has_data)
{
$has_data = false;
// 处理资金表数据
if (empty($sheet_data) || count($sheet_data) < 2) {
return false;
// 如果只有标题行或完全为空也返回true资金表可能不导入数据
return true;
}
// 第一行是标题,从第二行开始是数据
$data_rows = array_slice($sheet_data, 1);
$headers = $sheet_data[0];
// 检查是否有有效的数据行(非空行)
foreach ($data_rows as $row) {
// 检查行中是否有非空值
foreach ($row as $value) {
if (!empty(trim($value))) {
$has_data = true;
break 2; // 跳出两层循环
}
}
}
// 如果没有有效数据直接返回true资金表可能不导入数据
if (!$has_data) {
return true;
}
$chunk_count = 0;
$file_prefix = md5(KV_PREFIX . 'fund_' . time());