moonsflyer 3 月之前
父節點
當前提交
8b07ad01e0

+ 15 - 5
app/adminapi/controller/goods/GoodsController.php

@@ -218,11 +218,21 @@ class GoodsController extends BaseAdminController
      */
     public function importSpecPrice()
     {
-        $params = (new \app\adminapi\validate\goods\GoodsSpecPriceValidate())->post()->goCheck('import');
-        $result = (new GoodsLogic)->importSpecPrice($params);
-        if ($result === true) {
-            return $this->success('导入成功', [], 1, 1);
+        $lists = \PhpOffice\PhpSpreadsheet\IOFactory::load($_FILES['file']['tmp_name'])->getActiveSheet()->toArray(null, true, true, true);
+        
+        $validate = $this->validate(['lists' => $lists], \app\adminapi\validate\goods\GoodsSpecPriceImport::class);
+        
+        if ($validate !== true) {
+            return $this->fail($validate);
         }
-        return $this->fail($result);
+        
+        $result = (new GoodsLogic)->importSpecPriceLists($lists, $_FILES['file']['name']);
+        
+        if (!is_array($result)) {
+            return $this->fail($result);
+        }
+        
+        return $this->success('导入成功', $result);
     }
+    
 }

+ 111 - 4
app/adminapi/logic/goods/GoodsLogic.php

@@ -895,13 +895,119 @@ class GoodsLogic
     }
 
     /**
-     * @notes 解析Excel文件
-     * @param string $file
-     * @return array
+     * @notes 商品规格价格导入列表处理
+     * @param array $lists
+     * @param string $filename
+     * @return array|string
      * @author 
      * @date 2024/01/01 00:00
      */
-    private function parseExcelFile($file)
+    public function importSpecPriceLists(array $lists, $filename)
+    {
+        try {
+            Db::startTrans();
+            
+            // 移除表头
+            array_shift($lists);
+            $lists = array_values($lists);
+            $nums = count($lists);
+            
+            $successCount = 0;
+            $failCount = 0;
+            $errorMessages = [];
+            
+            foreach ($lists as $index => $info) {
+                try {
+                    $goodsId = trim($info['A']);
+                    $itemId = trim($info['D']);
+                    
+                    // 检查商品是否存在
+                    $goods = \app\common\model\Goods::find($goodsId);
+                    if (!$goods) {
+                        $errorMessages[] = "第" . ($index + 2) . "行:商品ID {$goodsId} 不存在";
+                        $failCount++;
+                        continue;
+                    }
+                    
+                    // 检查规格是否存在且属于该商品
+                    $goodsItem = \app\common\model\GoodsItem::where('id', $itemId)
+                        ->where('goods_id', $goodsId)
+                        ->find();
+                    
+                    if (!$goodsItem) {
+                        $errorMessages[] = "第" . ($index + 2) . "行:规格ID {$itemId} 不存在或不属于商品ID {$goodsId}";
+                        $failCount++;
+                        continue;
+                    }
+                    
+                    // 准备更新数据
+                    $updateData = [];
+                    
+                    // 销售价格(F列)
+                    if (!empty(trim($info['F']))) {
+                        $updateData['sell_price'] = trim($info['F']);
+                    }
+                    
+                    // 划线价格(G列)
+                    if (!empty(trim($info['G']))) {
+                        $updateData['lineation_price'] = trim($info['G']);
+                    }
+                    
+                    // 成本价格(H列)
+                    if (!empty(trim($info['H']))) {
+                        $updateData['cost_price'] = trim($info['H']);
+                    }
+                    
+                    // 库存数量(I列)
+                    if (!empty(trim($info['I']))) {
+                        $updateData['stock'] = trim($info['I']);
+                    }
+                    
+                    // 重量(J列)
+                    if (!empty(trim($info['J']))) {
+                        $updateData['weight'] = trim($info['J']);
+                    }
+                    
+                    // 体积(K列)
+                    if (!empty(trim($info['K']))) {
+                        $updateData['volume'] = trim($info['K']);
+                    }
+                    
+                    // 如果有数据需要更新
+                    if (!empty($updateData)) {
+                        \app\common\model\GoodsItem::where('id', $itemId)->update($updateData);
+                        $successCount++;
+                    } else {
+                        $errorMessages[] = "第" . ($index + 2) . "行:没有需要更新的价格信息";
+                        $failCount++;
+                    }
+                    
+                } catch (\Exception $e) {
+                    $errorMessages[] = "第" . ($index + 2) . "行:" . $e->getMessage();
+                    $failCount++;
+                }
+            }
+            
+            Db::commit();
+            
+            $result = [
+                'total' => $nums,
+                'success' => $successCount,
+                'fail' => $failCount,
+                'filename' => $filename
+            ];
+            
+            if (!empty($errorMessages)) {
+                $result['errors'] = array_slice($errorMessages, 0, 10); // 只返回前10个错误
+            }
+            
+            return $result;
+            
+        } catch (\Throwable $e) {
+            Db::rollback();
+            return $e->getMessage();
+        }
+    }
     {
         try {
             // 使用PhpSpreadsheet处理Excel文件
@@ -972,4 +1078,5 @@ class GoodsLogic
             throw new \Exception('Excel文件解析失败:' . $e->getMessage());
         }
     }
+
 }

+ 97 - 0
app/adminapi/validate/goods/GoodsSpecPriceImport.php

@@ -0,0 +1,97 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeshop100%开源免费商用商城系统
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | 开源版本可自由商用,可去除界面版权logo
+// | 商业版本务必购买商业授权,以免引起法律纠纷
+// | 禁止对系统程序代码以任何目的,任何形式的再发布
+// | gitee下载:https://gitee.com/likeshop_gitee
+// | github下载:https://github.com/likeshop-github
+// | 访问官网:https://www.likeshop.cn
+// | 访问社区:https://home.likeshop.cn
+// | 访问手册:http://doc.likeshop.cn
+// | 微信公众号:likeshop技术社区
+// | likeshop团队 版权所有 拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeshopTeam
+// +----------------------------------------------------------------------
+
+namespace app\adminapi\validate\goods;
+
+class GoodsSpecPriceImport extends \think\Validate
+{
+    protected $rule = [
+        'lists' => ['require', 'checkLists'],
+    ];
+
+    protected $message = [
+        'lists.require' => '上传文件不能为空',
+    ];
+
+    function checkLists($lists, $rule, $data)
+    {
+        $nums = count($lists) - 1;
+        if ($nums < 1) {
+            return '导入的文件商品规格价格信息为空';
+        }
+
+        if ($nums > 2000) {
+            return '单次最多导入2000条商品规格价格信息';
+        }
+
+        foreach ($lists as $key => $info) {
+            // 跳过表头
+            if ($key == 1) {
+                continue;
+            }
+
+            // 检查必填字段:商品ID(A列)和规格ID(D列)
+            if (empty(trim($info['A'])) || empty(trim($info['D']))) {
+                return '商品规格价格信息:第' . ($key) . '行存在未填写的商品ID或规格ID';
+            }
+
+            // 验证商品ID是否为数字
+            if (!is_numeric(trim($info['A']))) {
+                return '商品规格价格信息:第' . ($key) . '行商品ID必须为数字';
+            }
+
+            // 验证规格ID是否为数字
+            if (!is_numeric(trim($info['D']))) {
+                return '商品规格价格信息:第' . ($key) . '行规格ID必须为数字';
+            }
+
+            // 验证销售价格(F列)
+            if (!empty(trim($info['F'])) && !is_numeric(trim($info['F']))) {
+                return '商品规格价格信息:第' . ($key) . '行销售价格必须为数字';
+            }
+
+            // 验证划线价格(G列)
+            if (!empty(trim($info['G'])) && !is_numeric(trim($info['G']))) {
+                return '商品规格价格信息:第' . ($key) . '行划线价格必须为数字';
+            }
+
+            // 验证成本价格(H列)
+            if (!empty(trim($info['H'])) && !is_numeric(trim($info['H']))) {
+                return '商品规格价格信息:第' . ($key) . '行成本价格必须为数字';
+            }
+
+            // 验证库存数量(I列)
+            if (!empty(trim($info['I'])) && (!is_numeric(trim($info['I'])) || trim($info['I']) < 0)) {
+                return '商品规格价格信息:第' . ($key) . '行库存数量必须为非负整数';
+            }
+
+            // 验证重量(J列)
+            if (!empty(trim($info['J'])) && (!is_numeric(trim($info['J'])) || trim($info['J']) < 0)) {
+                return '商品规格价格信息:第' . ($key) . '行重量必须为非负数';
+            }
+
+            // 验证体积(K列)
+            if (!empty(trim($info['K'])) && (!is_numeric(trim($info['K'])) || trim($info['K']) < 0)) {
+                return '商品规格价格信息:第' . ($key) . '行体积必须为非负数';
+            }
+        }
+
+        return true;
+    }
+}