diff --git a/app/admin/controller/LocalController.php b/app/admin/controller/LocalController.php index 485cd662f..173bd8536 100644 --- a/app/admin/controller/LocalController.php +++ b/app/admin/controller/LocalController.php @@ -4,13 +4,121 @@ namespace app\admin\controller; use app\common\model\store_category\StoreCategory; use app\common\model\store_product\StoreProduct; +use app\common\model\store_product_group_price\StoreProductGroupPrice; use PhpOffice\PhpSpreadsheet\IOFactory; use support\Redis; class LocalController extends BaseAdminController { - public $notNeedLogin = []; + public $notNeedLogin = ['setPrice']; + + public function setPrice() + { + $file = $this->request->file('file'); + $reader = IOFactory::createReader('Xlsx'); + $spreadsheet = $reader->load($file->getRealPath()); + $data = $spreadsheet->getActiveSheet()->toArray(); + $insert = []; + $update = []; + $productIds = []; + foreach ($data as $k => $row) { + if ($k < 2) { + continue; + } + if (empty($row[0])) { + continue; + } + $productId = intval($row[0]); + if (empty($productId)) { + continue; + } + $productIds[] = $productId; + } + $products = StoreProduct::whereIn('id', $productIds)->field('id,store_name,purchase')->select()->toArray(); + $products = reset_index($products, 'id'); + foreach ($data as $k => $row) { + if ($k < 2) { + continue; + } + if (empty($row[0])) { + continue; + } + $productId = intval($row[0]); + if (empty($productId)) { + continue; + } + $product = $products[$productId] ?? []; + if (empty($product)) { + continue; + } + $groupIds = [ + 5 => 23, + 7 => 24, + 9 => 25, + 11 => 26, + 13 => 27, + 15 => 28, + 17 => 29, + 19 => 30, + 21 => 31, + 23 => 32, + 25 => 33, + 27 => 34, + 29 => 35, + 31 => 36, + 33 => 37, + 35 => 1, + 37 => 18, + 39 => 22, + ]; + for ($i = 5; $i < 35; $i = $i + 2) { + $rate = intval(rtrim($row[$i] ?? 0, '%')); + if (empty($rate)) { + continue; + } + $price = $row[$i + 1] ?? 0; + if (empty($price)) { + $price = $product['purchase'] * (1 + $rate / 100); + } + $item = [ + 'product_id' => $productId, + 'group_id' => $groupIds[$i], + 'price_type' => 3, + 'base_rate' => 100 + $rate, + 'price' => $price + ]; + $insert[] = $item; + } + $productGroupPrices = StoreProductGroupPrice::where('product_id', $productId)->whereIn('group_id', [1, 18, 22])->select()->toArray(); + $groupIds = array_flip($groupIds); + foreach ($productGroupPrices as $productGroupPrice) { + $cellId = $groupIds[$productGroupPrice['group_id']] ?? 0; + $rate = intval(rtrim($row[$cellId] ?? 0, '%')); + if (empty($rate)) { + continue; + } + $price = $row[$cellId + 1] ?? 0; + if (empty($price)) { + $price = $product['purchase'] * (1 + $rate / 100); + } + if ($price != $productGroupPrice['price']) { + $update[] = [ + 'id' => $productGroupPrice['id'], + 'base_rate' => $rate, + 'price' => $price, + ]; + } + } + } + if (count($insert) > 0) { + StoreProductGroupPrice::insertAll($insert); + } + if (count($update) > 0) { + (new StoreProductGroupPrice())->saveAll($update); + } + return $this->success('插入成功:' . count($insert) . '条,更新成功:' . count($update) . '条'); + } public function fixCategory() { diff --git a/app/admin/lists/store_category/StoreCategoryLists.php b/app/admin/lists/store_category/StoreCategoryLists.php index e9e672069..459f3e5e0 100644 --- a/app/admin/lists/store_category/StoreCategoryLists.php +++ b/app/admin/lists/store_category/StoreCategoryLists.php @@ -57,6 +57,9 @@ class StoreCategoryLists extends BaseAdminDataLists implements ListsSearchInterf unset($priceRate[100003], $priceRate[100004]); $temp = []; foreach ($userGroups as $userGroup) { + if (!isset($priceRate[$userGroup['id']])) { + continue; + } if ($userGroup['id'] == 21 && !empty($priceRate[100001]) && empty($userGroup['rate'])) { $userGroup['rate'] = $priceRate[100001]['rate']; unset($priceRate[100001]); diff --git a/app/admin/lists/supplier/SupplierLists.php b/app/admin/lists/supplier/SupplierLists.php index c0757cda9..9d829980a 100644 --- a/app/admin/lists/supplier/SupplierLists.php +++ b/app/admin/lists/supplier/SupplierLists.php @@ -45,7 +45,7 @@ class SupplierLists extends BaseAdminDataLists implements ListsSearchInterface { return Supplier::where($this->searchWhere) ->field(['id', 'category_id', 'mer_name', 'phone', 'settle_cycle', 'address', 'mark']) - ->limit($this->limitOffset, $this->limitLength) + ->limit($this->limitOffset, 100) ->order(['id' => 'desc']) ->select()->each(function ($item) { $item->total_completed_amount=WarehouseProduct::where('supplier_id',$item['id'])->where('financial_pm',1)->where('is_pay',1)->sum('total_price'); diff --git a/app/admin/logic/purchase_product_offer/PurchaseProductOfferLogic.php b/app/admin/logic/purchase_product_offer/PurchaseProductOfferLogic.php index 7caa7a63f..fd04f6b2a 100644 --- a/app/admin/logic/purchase_product_offer/PurchaseProductOfferLogic.php +++ b/app/admin/logic/purchase_product_offer/PurchaseProductOfferLogic.php @@ -378,7 +378,13 @@ class PurchaseProductOfferLogic extends BaseLogic break; } } + if (empty($storeProductGroupPrice)) { + return; + } foreach ($productCatePriceRate as $k => $v) { + if (empty($v['rate'])) { + continue; + } if ($v['id'] == 4 &&$purchase>0) { //商户 $data['cost_lv'] = bcdiv($v['rate'], 100, 2); @@ -431,14 +437,30 @@ class PurchaseProductOfferLogic extends BaseLogic public static function getProductCatePriceRate($product) { $productCatePriceRate = StoreCategory::where('id', $product['cate_id'])->value('price_rate'); - if (!empty($productCatePriceRate)) { + if (!empty($productCatePriceRate) && self::hasPurchase($productCatePriceRate)) { return $productCatePriceRate; } $productCatePriceRate = StoreCategory::where('id', $product['two_cate_id'])->value('price_rate'); - if (!empty($productCatePriceRate)) { + if (!empty($productCatePriceRate) && self::hasPurchase($productCatePriceRate)) { return $productCatePriceRate; } - return StoreCategory::where('id', $product['top_cate_id'])->value('price_rate'); + $productCatePriceRate = StoreCategory::where('id', $product['top_cate_id'])->value('price_rate'); + if (!empty($productCatePriceRate) && self::hasPurchase($productCatePriceRate)) { + return $productCatePriceRate; + } + return []; + } + + public static function hasPurchase(array $productCatePriceRate): bool + { + $res = true; + foreach ($productCatePriceRate as $item) { + if ($item['id'] == 21 && empty($item['rate'])) { + $res = false; + break; + } + } + return $res; } } diff --git a/app/common/model/dict/DictData.php b/app/common/model/dict/DictData.php index 22a72836b..b4f24bcbb 100644 --- a/app/common/model/dict/DictData.php +++ b/app/common/model/dict/DictData.php @@ -44,4 +44,14 @@ class DictData extends BaseModel return $data['status'] ? '正常' : '停用'; } + public static function getDictValue($type, $key) + { + $dictType = DictType::where('type', $type)->where('status', 1)->find(); + if ($dictType) { + $dictData = DictData::where('type_id', $dictType['id'])->where('name', $key)->where('status', 1)->value('value'); + return empty($dictData) ? '' : $dictData; + } + return ''; + } + } \ No newline at end of file diff --git a/process/Task.php b/process/Task.php index 198660c65..aa10565b3 100644 --- a/process/Task.php +++ b/process/Task.php @@ -4,11 +4,14 @@ namespace process; use app\common\enum\OrderEnum; use app\common\logic\PayNotifyLogic; +use app\common\model\dict\DictData; use app\common\model\store_branch_product\StoreBranchProduct; use app\common\model\store_order\StoreOrder; use app\common\model\store_order_cart_info\StoreOrderCartInfo; use app\common\model\store_product\StoreProduct; +use app\common\model\store_product_price\StoreProductPrice; use app\common\model\user_recharge\UserRecharge; +use support\Cache; use think\facade\Db; use Webman\RedisQueue\Redis; use Workerman\Crontab\Crontab; @@ -62,5 +65,41 @@ class Task } } }); + + $this->updateProductPrice(); } + + /** + * 将商品价格更改列表的价格同步至商品 + * @return void + */ + public function updateProductPrice() + { + new Crontab('0 */10 * * * *', function () { + $value = DictData::getDictValue('update_product_price_task', 'status'); + if ($value == 1) { + $lastProductId = Cache::get('update_product_price_last_product_id', 0); + $productIds = StoreProduct::where('purchase', 0)->where('id', '>', $lastProductId)->limit(200)->column('id'); + $lastProductId = end($productIds); + if (count($productIds) < 200) { + $lastProductId = 0; + } + Cache::set('update_product_price_last_product_id', $lastProductId); + $productPrices = StoreProductPrice::whereIn('product_id', $productIds)->where('status', 1)->distinct('product_id')->order('id desc')->select()->toArray(); + $update = []; + foreach ($productPrices as $productPrice) { + $update[] = [ + 'id' => $productPrice['product_id'], + 'purchase' => $productPrice['purchase'] ?? 0, + 'cost' => $productPrice['cost'] ?? 0, + 'price' => $productPrice['purchase'] ?? 0, + ]; + } + if (count($update) > 0) { + (new StoreProduct())->saveAll($update); + } + } + }); + } + }