multi-store/app/admin/controller/LocalController.php
2025-02-20 17:58:36 +08:00

456 lines
18 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\admin\controller;
use app\admin\logic\beforehand_order_cart_info\BeforehandOrderCartInfoLogic;
use app\common\model\beforehand_order\BeforehandOrder;
use app\common\model\beforehand_order_cart_info\BeforehandOrderCartInfo;
use app\common\model\CeshiCopy;
use app\common\model\purchase_product_offer\PurchaseProductOffer;
use app\common\model\store_category\StoreCategory;
use app\common\model\store_product\StoreProduct;
use app\common\model\store_product_group_price\StoreProductGroupPrice;
use app\common\model\StoreProductPriceList;
use PhpOffice\PhpSpreadsheet\IOFactory;
use support\exception\BusinessException;
use support\Redis;
use think\facade\Db;
class LocalController extends BaseAdminController
{
public $notNeedLogin = ['activityPrice', 'searchProduct', 'setPrice', 'index', 'updateProductPriceList', 'importOrder'];
public function activityPrice()
{
$product = Db::table('la_ceshi_copy_copy')->select()->toArray();
$userShip = 43;
$insert = [];
foreach ($product as $k => $v) {
$rate = bcdiv($v['price'], $v['price_two'], 2);
$rate = $rate * 100;
$insert[] = [
'product_id' => $v['product_id'],
'group_id' => $userShip,
'price_type' => 3,
'base_rate' => $rate,
'price' => $v['price'],
];
}
StoreProductGroupPrice::insertAll($insert);
return $this->data($insert);
}
public function searchProduct()
{
$product = Db::table('la_ceshi')->select()->toArray();
$product = reset_index($product, 'name');
$product2 = Db::table('la_ceshi_copy_copy')->select()->toArray();
$update = [];
foreach ($product2 as $v) {
if (isset($product[$v['name']])) {
$update[] = [
'id' => $v['id'],
'product_id' => $product[$v['name']]['product_id'],
];
}
}
$result = (new CeshiCopy())->saveAll($update);
return $this->data($update);
}
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()
{
$topCate = StoreCategory::where('pid', 0)->field('id,name,pid')->order('name')->select()->toArray();
$topCate = reset_index($topCate, 'name');
$sql = [];
$time = time();
foreach ($topCate as $item) {
if (isset($topCate[$item['name'] . '类'])) {
$target = $topCate[$item['name'] . '类'];
$sql[] = "##原分类id{$item['id']},原分类名:{$item['name']}目标分类id{$target['id']},目标分类名:{$target['name']}";
$sql[] = "update la_store_product set top_cate_id={$target['id']} where top_cate_id={$item['id']};";
$sql[] = "update la_store_product set two_cate_id={$target['id']} where two_cate_id={$item['id']};";
$sql[] = "update la_store_category set delete_time=$time where id={$item['id']};";
}
$secondCate = StoreCategory::where('pid', $item['id'])->field('id,name,pid')->order('name')->select()->toArray();
$secondCate = reset_index($secondCate, 'name');
foreach ($secondCate as $item2) {
if (isset($secondCate[$item2['name'] . '类'])) {
$target = $secondCate[$item2['name'] . '类'];
$sql[] = "##原分类id{$item2['id']},原分类名:{$item2['name']}目标分类id{$target['id']},目标分类名:{$target['name']}";
$sql[] = "update la_store_product set two_cate_id={$target['id']} where two_cate_id={$item2['id']};";
$sql[] = "update la_store_product set cate_id={$target['id']} where cate_id={$item2['id']};";
$sql[] = "update la_store_category set delete_time=$time where id={$item2['id']};";
}
$thirdCate = StoreCategory::where('pid', $item2['id'])->field('id,name,pid')->order('name')->select()->toArray();
$thirdCate = reset_index($thirdCate, 'name');
foreach ($thirdCate as $item3) {
if (isset($thirdCate[$item3['name'] . '类'])) {
$target = $thirdCate[$item3['name'] . '类'];
$sql[] = "##原分类id{$item3['id']},原分类名:{$item3['name']}目标分类id{$target['id']},目标分类名:{$target['name']}";
$sql[] = "update la_store_product set cate_id={$target['id']} where cate_id={$item3['id']};";
$sql[] = "update la_store_category set delete_time=$time where id={$item3['id']};";
}
}
}
}
file_put_contents(public_path() . '/update.sql', implode(PHP_EOL, $sql));
return $this->success('数据已更新完成', $sql);
}
public function updateProductPriceList()
{
$file = $this->request->file('file');
$reader = IOFactory::createReader('Xlsx');
$spreadsheet = $reader->load($file->getRealPath());
$data = $spreadsheet->getActiveSheet()->toArray();
$updateCount = 0;
$insert = [];
$time = time();
foreach ($data as $k => $row) {
if ($k < 1 || empty($row[0])) {
continue;
}
$product = StoreProduct::where('id', $row[0])->value('id');
if (empty($product)) {
continue;
}
for ($i = 1; $i < 5; $i++) {
if (empty($row[1 + $i])) {
continue;
}
$insert[] = [
'product_id' => $row[0],
'price_type' => $i,
'rate' => intval(rtrim($row[1 + $i], '%')) + 100,
'create_time' => $time,
];
}
}
StoreProductPriceList::insertAll($insert);
return $this->success('更新成功:' . $updateCount . '条');
}
public function index()
{
$file = $this->request->file('file');
$reader = IOFactory::createReader('Xlsx');
$spreadsheet = $reader->load($file->getRealPath());
$data = $spreadsheet->getActiveSheet()->toArray();
$updateCount = 0;
$finishCount = Redis::get('updateFinishCount');
$finishCount = empty($finishCount) ? 0 : $finishCount;
if ($finishCount >= count($data)) {
return $this->success('数据已更新完成');
}
$max = $finishCount + 100;
foreach ($data as $k => $row) {
if ($k < (1 + $finishCount) || empty($row[0])) {
continue;
}
if ($k > $max) {
break;
}
$product = StoreProduct::where('id', $row[0])->field('id,store_name,top_cate_id,two_cate_id,cate_id')->findOrEmpty()->toArray();
if (empty($product)) {
continue;
}
$result = $this->updateProduct($product, $row);
if ($result) {
$updateCount++;
}
}
Redis::set('updateFinishCount', 100 + $finishCount);
return $this->success('更新成功:' . $updateCount . '条');
}
public function updateProduct($product, $row)
{
$topCateName = $row[1];
$secondCateName = $row[2];
$cateName = $row[3];
$topCate = StoreCategory::where('name', $topCateName)->value('id');
$updateData = [];
if (!empty($topCate) && $topCate != $product['top_cate_id']) {
$updateData['top_cate_id'] = $topCate;
}
$secondCateId = StoreCategory::where('pid', $topCate)->where('name', $secondCateName)->value('id');
if (empty($secondCateId)) {
$secondCate = new StoreCategory();
$secondCate->name = $secondCateName;
$secondCate->pid = $topCate;
$secondCate->save();
$secondCateId = $secondCate->id;
}
if ($secondCateId != $product['two_cate_id']) {
$updateData['two_cate_id'] = $secondCateId;
}
$cateId = StoreCategory::where('pid', $secondCateId)->where('name', $cateName)->value('id');
if (empty($cateId)) {
$cate = new StoreCategory();
$cate->name = $cateName;
$cate->pid = $secondCateId;
$cate->save();
$cateId = $cate->id;
}
if ($cateId != $product['cate_id']) {
$updateData['cate_id'] = $cateId;
}
if (!empty($updateData)) {
StoreProduct::where('id', $row[0])->update($updateData);
echo '更新成功ID' . $row[0] . PHP_EOL;
return true;
}
return false;
}
public function importOrder()
{
$file = $this->request->file('file');
$reader = IOFactory::createReader('Xlsx');
$spreadsheet = $reader->load($file->getRealPath());
$sheets = $spreadsheet->getAllSheets();
foreach ($sheets as $sheetIndex => $sheet) {
$params['is_buyer'] = -1;
$params['buyer_id'] = 20;
$params['admin_id'] = 1;
$params['chef'] = '厨师';
$params['chef_phone'] = '13513513513';
$params['distribution_personnel'] = '余友"';
$params['days'] = 0;
$params['mark'] = '内部备注';
$params['merchandiser'] = 0;
$params['purpose'] = '备注';
$params['store_id'] = 4;
$params['splitting_officer'] = '分单员';
$params['regional_manager'] = '张波';
$params['system_store_name'] = '门店员';
$params['transporter'] = '运输员';
$params['pay_price'] = 0;
$params['total_price'] = 0;
$params['arrival_time'] = date('Y-m-d H:i:s');
$rows = $sheet->toArray();
foreach ($rows as $k => $row) {
if ($k < 1 || empty($row[2])) {
continue;
}
$product = StoreProduct::where('id', $row[0])->withTrashed()->field('id,package,store_info,marques,unit,price,purchase,after_sales')->findOrEmpty()->toArray();
if (empty($product)) {
continue;
}
$totalPrice = bcmul($product['price'], $row[2], 2);
$params['total_price'] = bcadd($params['total_price'], $totalPrice, 2);
$params['pay_price'] = $params['total_price'];
$params['product_arr'][] = [
'product_id' => $product['id'],
'nums' => $row[2],
'package' => $product['package'],
'store_info' => $product['store_info'],
'marques' => $product['marques'],
'unit' => $product['unit'],
'price' => $product['price'],
'purchase' => $product['purchase'],
'after_sales' => $product['after_sales'],
'total_price' => $totalPrice,
'purchase_total' => $row[3],
];
}
$beforeOrderId = $this->batchCreate($params);
$purchaseOffer = PurchaseProductOffer::where('order_id', $beforeOrderId)->field('id,product_id,buyer_nums')->select()->toArray();
foreach ($purchaseOffer as $v) {
$inStorageParams = [
'admin_id' => 0,
'bhoid' => $beforeOrderId,
'buyer_nums' => $v['buyer_nums'],
'id' => $v['id'],
'product_id' => $v['product_id'],
'warehouse_id' => 1,
'warehouse_num' => $v['buyer_nums'],
];
BeforehandOrderCartInfoLogic::putInStorage($inStorageParams);
}
}
return $this->success('导入成功');
}
public function batchCreate($params)
{
if (empty($params['buyer_id'])) {
throw new BusinessException('请选择采购员');
}
Db::startTrans();
try {
$procurementOrder = new BeforehandOrder();
$procurementOrder->order_id = getNewOrderId('CG');
$procurementOrder->buyer_id = $params['buyer_id'];
$procurementOrder->admin_id = $params['admin_id'];
$procurementOrder->order_type = 9;
$procurementOrder->total_price = $params['total_price'];
$procurementOrder->pay_price = $params['pay_price'];
$procurementOrder->save();
$purchaseOffer = [];
$cartInfo = [];
foreach ($params['product_arr'] as $product) {
if ($product['product_id'] <= 0) {
continue;
}
$cartInfo[] = [
'bhoid' => $procurementOrder['id'],
'product_id' => $product['product_id'],
'unit' => $product['unit'],
'cart_num' => $product['nums'],
'accept_num' => $product['nums'],
'mark' => $product['mark'] ?? '',
'is_buyer' => 1,
'procurement_order_id' => $procurementOrder['id'],
'total_price' => bcmul($product['price'], $product['nums'], 2),
'pay_price' => bcmul($product['price'], $product['nums'], 2),
'purchase' => $product['purchase'],
'uid' => $params['uid'] ?? 0,
'price' => $product['price'],
'package' => $product['package'],
'create_time' => time(),
'update_time' => time(),
];
$purchaseOffer[] = [
'order_id' => $procurementOrder['id'],
'product_id' => $product['product_id'],
'unit' => $product['unit'],
'is_buyer' => 1,
'need_num' => $product['nums'],
'mark' => $product['mark'] ?? '',
'buyer_id' => $params['buyer_id'],
'buyer_confirm' => 1,
'buyer_nums' => $product['nums'],
'total_price' => $product['purchase_total'],
'status' => 0,
'source_order_info' => [
[
'source_order_id' => $procurementOrder['id'],
'product_id' => $product['product_id'],
'need_num' => $product['nums'],
'mark' => $product['mark'] ?? '',
]
]
];
}
PurchaseProductOffer::insertAll($purchaseOffer);
BeforehandOrderCartInfo::insertAll($cartInfo);
Db::commit();
return $procurementOrder->id;
} catch (\Exception $e) {
Db::rollback();
throw new BusinessException($e->getMessage());
}
}
}