Merge branch 'main' into feature/main20240421

feature/main20240421
lqmac 10 months ago
commit 4a5e8401b3
  1. 4
      app/admin/controller/Controller.php
  2. 80
      app/admin/controller/Goods.php
  3. 8
      app/api/controller/Category.php
  4. 2
      app/api/controller/Dealer.php
  5. 1
      app/api/controller/Goods.php
  6. 15
      app/api/controller/Store.php
  7. 2
      app/api/controller/dealer/Withdraw.php
  8. 25
      app/api/model/Order.php
  9. 3
      app/api/model/Setting.php
  10. 2
      app/api/model/dealer/Withdraw.php
  11. 28
      app/command/SyncGoodsToEs.php
  12. 18
      app/common.php
  13. 751
      app/common/library/elasticsearch/Client.php
  14. 48
      app/common/model/Goods.php
  15. 2
      app/common/model/sharp/Goods.php
  16. 163
      app/common/service/GoodsEs.php
  17. 49
      app/job/controller/goods/GoodsAddPrice.php
  18. 8
      app/job/service/goods/Collector.php
  19. 99
      app/job/service/goods/GoodsAddPrice.php
  20. 14
      app/store/controller/Goods.php
  21. 34
      app/store/model/goods/Import.php
  22. 3
      composer.json
  23. 301
      composer.lock
  24. 1
      config/console.php
  25. 2
      config/log.php
  26. 2
      config/queue.php
  27. 6
      vendor/services.php

@ -79,8 +79,8 @@ class Controller extends BaseController
if (strpos($this->admin['user']['channel'], 'jd') !== false) {
$list = Channel::where('status', 1)->whereIn('code',[$this->admin['user']['channel'],'zy'])->select();
//苏宁账号可以看到苏宁和自营的
} elseif($this->admin['user']['channel'] == 'sn'){
$list = Channel::where('status', 1)->whereIn('code',['sn','zy'])->select();
} elseif(strpos($this->admin['user']['channel'], 'sn') !== false){
$list = Channel::where('status', 1)->whereIn('code',[$this->admin['user']['channel'],'zy'])->select();
//新阙通信账号可以看到新阙通信和自营的
} elseif($this->admin['user']['channel'] == 'xqtx'){
$list = Channel::where('status', 1)->whereIn('code',['xqtx','zy'])->select();

@ -19,6 +19,7 @@ use app\store\model\Goods as GoodsModel;
use app\store\model\GoodsCategoryRel;
use app\store\model\GoodsSku;
use app\store\model\goods\Import as ImportModel;
use app\job\controller\goods\GoodsAddPrice as GoodsAddPriceJob;
/**
* 商品管理控制器
@ -132,7 +133,7 @@ class Goods extends Controller
// 商品详情
$model = GoodsModel::detail($goodsId);
// echo "<pre>";
// print_r($this->postForm());
// print_r($model);
// exit();
// 更新记录
if ($model->edit($this->postForm(), $model)) {
@ -144,7 +145,18 @@ class Goods extends Controller
return $this->renderSuccess('更新成功');
}
$goods_sku = GoodsModel::where('goods_id', $goodsId)->where('store_id', 0)->find();
// var_dump($goods_sku->cost_price_min);
// var_dump($goods_sku->markup_rate);
//成本价加价之后的处理
list($cost_price, $profit, $profit_rate) = getGoodsCostAndProfitAndProfitRate($goods_sku->goods_price_min, $goods_sku->cost_price_min, $goods_sku->markup_rate);
$goods_sku->cost_price_min = $cost_price;
$goods_sku->profit = $profit;
$goods_sku->profit_rate = $profit_rate;
// var_dump($cost_price);
// var_dump($profit);
// var_dump($profit_rate);
// exit();
$goods_data = [
'goods_name' => $goods_sku->name,
'content' => $goods_sku->content,
@ -159,8 +171,16 @@ class Goods extends Controller
'goods_source' => $goods_sku->goods_source,
'is_check' => $goods_sku->is_check,
'delivery_time' => $goods_sku->delivery_time,
// 'is_pool' => $goods_sku->is_pool,
// 'is_sale' => $goods_sku->is_sale,
'update_time' => time(),
];
if ($goods_sku->is_pool == 0 || $goods_sku->is_sale == 0) {
$goods_data['status'] = 20;
}
if ($goods_sku->is_pool == 1 && $goods_sku->is_sale == 1) {
$goods_data['status'] = 10;
}
GoodsModel::where('origin_goods_id', $goodsId)->update($goods_data);
$goods_sku_data = [
'goods_price' => $goods_sku->goods_price_min,
@ -335,36 +355,38 @@ class Goods extends Controller
* @param int $rate [description]
*/
public function addPrice(array $categoryIds, int $rate){
ini_set('memory_limit', '1024M');
set_time_limit(0);
$goods = GoodsCategoryRel::whereIn('category_id',$categoryIds)->where('store_id', 0)->select()->toArray();
if (!$goods) {
return $this->renderSuccess('没有需要加价的商品');
}
$goods = GoodsModel::whereIn('goods_id', array_column($goods, "goods_id"))->where('store_id', 0)->select()->toArray();
if (!$goods) {
// ini_set('memory_limit', '1024M');
// set_time_limit(0);
$platform = $this->getUserPlatform();
$channels = $platform ? array_column($platform->toArray(), "code") : [];
$goodsList = GoodsModel::alias('g')
->join('goods_category_rel c', 'g.goods_id = c.goods_id')
->where('c.store_id',0)
->where('g.is_delete',0)
->whereIn('c.category_id',$categoryIds)
->whereIn('g.channel', $channels)
->field(['g.goods_id','g.cost_price_min'])
->group('g.goods_id')
->order("g.goods_id asc")
// ->limit(100)
->select()
->toArray();
if (!$goodsList) {
return $this->renderSuccess('没有需要加价的商品');
}
foreach ($goods as $key => $value) {
$net_price = round($value['goods_price_min'] / (1 - ($rate / 100)), 0);
$profit = (float)$net_price - (float)$value['cost_price_min'];
$profit_rate = (float)$net_price > 0 ? bcmul((string)($profit / (float)$net_price) , (string)100, 2) : 0.00;
$goodsData = [
'goods_price_min' => $net_price,
'goods_price_max' => $net_price,
'line_price_min' => $net_price,
'line_price_max' => $net_price,
'profit_rate' => $profit_rate,
'profit' => $profit,
'update_time' => time()
];
GoodsModel::where('goods_id', $value['goods_id'])->where('store_id', 0)->update($goodsData);
$goodsSkuData = [
'goods_price' => $net_price,
'update_time' => time()
];
GoodsSku::where('goods_id', $value['goods_id'])->where('store_id', 0)->update();
// 分批每次导入20条
$limit = 50;
// 根据商品总数量计算需要的队列任务数量
$jobCount = \count($goodsList) / $limit;
// 逐次发布队列任务
for ($i = 0; $i < $jobCount; $i++) {
$data = array_slice($goodsList, $i * $limit, $limit);
GoodsAddPriceJob::dispatch([
'list' => $data,
'rate' => $rate,
]);
}
return $this->renderSuccess('加价成功');
}

@ -15,6 +15,7 @@ namespace app\api\controller;
use app\common\model\GoodsCategoryRel;
use think\response\Json;
use app\api\model\Category as CategoryModel;
use think\facade\Cache;
/**
* 商品分类控制器
@ -32,13 +33,20 @@ class Category extends Controller
*/
public function list(): Json
{
$cache_key = "Category_list".$this->storeId;
if(Cache::has($cache_key)) {
$list = Cache::get($cache_key);
return $this->renderSuccess(compact('list'));
}
$model = new CategoryModel;
$list = $model->getListPublic($this->request->param());
Cache::set($cache_key, $list, 86400);
return $this->renderSuccess(compact('list'));
}
public function childrenList(): Json
{
$model = new CategoryModel;
$list = $model->getChildrenList($this->request->param());
return $this->renderSuccess(compact('list'));

@ -28,7 +28,7 @@ class Dealer extends Controller
{
// 当前用户信息
/* @var UserModel $user */
private UserModel $user;
public $user;
// 当前分销商信息
private ?DealerUserModel $dealer;

@ -148,6 +148,7 @@ class Goods extends Controller
];
break;
default:
if ($goods->stock_total >= ($value['num'] ?? 1)) {
$res = "有货";
}

@ -115,10 +115,17 @@ class Store extends Controller
{
$storeid = request()->header()['storeid'];
$info = StoreInfoModel::where('store_id', $storeid)->find()->toArray();
$file = UploadFile::where('file_id', '=', $info['group_share_img_id'])->find();
$info['group_share_img'] = $file->preview_url;
$file = UploadFile::where('file_id', '=', $info['logo_image_id'])->find();
$info['logo_image'] = $file->preview_url;
$info['group_share_img'] = "";
if ($info['group_share_img_id']) {
$file = UploadFile::where('file_id', '=', $info['group_share_img_id'])->find();
$info['group_share_img'] = $file->preview_url;
}
$info['logo_image'] = "";
if ($info['logo_image_id']) {
$file = UploadFile::where('file_id', '=', $info['logo_image_id'])->find();
$info['logo_image'] = $file->preview_url;
}
return $this->renderSuccess($info);
}

@ -57,7 +57,7 @@ class Withdraw extends Controller
// 提交提现申请
$model = new WithdrawModel;
$data = $this->request->post();
if ($model->submit($dealer, $data)) {
if ($model->submit($dealer, $data['form'])) {
return $this->renderSuccess([], '提现申请已提交成功,请等待审核');
}
return $this->renderError($model->getError() ?: '提交失败');

@ -141,6 +141,11 @@ class Order extends OrderModel
$info = $info['storeInfo']->toArray();
foreach ($list['data'] as &$v) {
$v['storeInfo'] = $info;
$total_num = 0;
foreach ($v['goods'] as $value) {
$total_num += $value['total_num'] ?? 0;
}
$v['total_num'] = $total_num;
$v['delivery'] = DeliveryModel::where('order_id', $v['order_id'])->find();
}
}
@ -179,6 +184,17 @@ class Order extends OrderModel
$this->error = $orderSource->getError();
return false;
}
//订单已取消提示
if ($this['order_status'] == OrderStatusEnum::CANCELLED) {
$this->error = '订单已取消成功,无需重复操作';
return false;
}
if ($this['order_status'] == OrderStatusEnum::APPLY_CANCEL) {
$this->error = '订单已申请取消,需等待后台审核';
return false;
}
// 订单是否已支付
$isPay = $this['pay_status'] == PayStatusEnum::SUCCESS;
// 提示信息
@ -480,6 +496,15 @@ class Order extends OrderModel
if (!empty($info['storeInfo'])) {
$order->storeInfo = $info['storeInfo']->toArray();
}
$total_num = 0;
if (isset($order->goods) && $order->goods) {
foreach ($order->goods as $value) {
$total_num += $value->total_num ?? 0;
}
}
$order->total_num = $total_num;
return $order;
}

@ -55,7 +55,8 @@ class Setting extends SettingModel
*/
public static function getFinanceCommission()
{
return static::getItem(SettingEnum::TRADE)['finance_process'];
$return = empty(static::getItem(SettingEnum::TRADE)['finance_process'])?'':static::getItem(SettingEnum::TRADE)['finance_process'];
return $return;
}
/**

@ -76,7 +76,7 @@ class Withdraw extends WithdrawModel
//手续费
if (empty($data['is_invoice'])) {
$commission = \app\api\model\Setting::getFinanceCommission();
if (empty($commission)) {
if (!empty($commission)) {
$data['commission_price'] = bcmath($data['money'], $commission / 100, 2);
}
}

@ -0,0 +1,28 @@
<?php
namespace app\command;
use app\common\service\GoodsEs;
use think\console\Command;
use think\console\Output;
use think\console\Input;
class SyncGoodsToEs extends Command
{
protected function configure()
{
// 指令配置
$this->setName('syncGoodsToEs')
->setDescription('同步商品数据到ES');
}
protected function execute(Input $input, Output $output)
{
$goodsService = new GoodsEs();
$goods = $goodsService->list([]);
var_dump($goods);
}
}

@ -594,3 +594,21 @@ function httpRequest($url, $method="GET", $postfields = null, $headers = array()
return json_decode($response, true);
//return array($http_code, $response,$requestinfo);
}
/**
* 获取加价之后的成本价
* [getGoodsCostPrice description]
* @param [type] $cost_price [description]
* @param [type] $rate [description]
* @return [type] [description]
*/
function getGoodsCostAndProfitAndProfitRate($net_price, $cost_price, $rate){
if ($rate > 0) {
$cost_price = round($cost_price / (1 - ($rate / 100)), 0);
}
$profit = (float)$net_price - (float)$cost_price;
$profit_rate = (float)$net_price > 0 ? bcmul(bcdiv((string)$profit, (string)$net_price, 4), (string)100, 2) : 0.00;
return [$cost_price, $profit, $profit_rate];
}

@ -0,0 +1,751 @@
<?php
namespace app\common\library\elasticsearch;
use Elastic\Elasticsearch\ClientBuilder;
use think\Exception;
class Client
{
public $client;
const ES_HOST_NAME = '114.55.95.135:9200';
private static $instance;
/**
* @var 索引名称
*/
protected $index;
public $alias;
protected $retries = 2;
/**
* 查询参数
* @var array $queryParams
*/
protected $queryParams = [];
private $debug;
public function __construct()
{
var_dump(self::ES_HOST_NAME);
$this->client = ClientBuilder::create()->setHosts([self::ES_HOST_NAME])->build();
}
private function __clone() {
}
public static function getInstance(){
if (is_null(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
/**
* 查询条件
* @param $params
* @return $this
*/
public function select($params = '')
{
$this->queryParams['select'] = str_replace(' ', '', trim($params, " ,\t\r\n"));
return $this;
}
/**
* 分页
* @param $number
* @return $this
*/
public function from($number = 0)
{
$this->queryParams['from'] = $number ? ($number-1)*10 : 0;
return $this;
}
/**
* 页码
* @param $number
* @return $this
*/
public function size($number = 10)
{
$this->queryParams['size'] = $number;
return $this;
}
public function equal($params = [])
{
$this->queryParams['equal'][] = $params;
return $this;
}
public function in($params = [])
{
$this->queryParams['in'][] = $params;
return $this;
}
public function like($params = [])
{
$this->queryParams['like'][] = $params;
return $this;
}
public function orlike($params = [])
{
$this->queryParams['orlike'][] = $params;
return $this;
}
public function order($params = [])
{
$this->queryParams['order'][] = $params;
return $this;
}
/**
* 根据条件删除文档
* @param array $params
* @return array
*/
public function deleteDoc($params = [])
{
return $this->client->deleteByQuery($params);
}
public function existsIndex(String $index_name) {
$params = [
'index' => $index_name
];
return $this->client->indices()->exists($params);
}
/**
* 创建索引
*/
public function createIndex(String $index_name, array $mapping = []): array
{
if ($this->existsIndex($index_name)) {
throw new Exception('索引已存在'. $index_name);
}
//只能创建一次
$params = [
'index' => $index_name,
'body' => [
'settings' => [
'number_of_shards' => 5,
'number_of_replicas' => 1
],
'mappings' => $mapping
]
];
return $this->client->indices()->create($params);
}
/**
* 删除索引
*/
public function deleteIndex(String $index_name = ''): array{
$params = ['index' => $index_name];
return $this->client->indices()->delete($params);
}
/**
* 根据id删除文档
* @param int $id
* @return array
*/
public function deleteDocById($id = 0)
{
$params = [
'index' => $this->index,
'id' => $id
];
$response = $this->client->delete($params);
return $response;
}
/**
* 组装查询条件
* @param array $params
* @return $this
*/
private function parseQueryParams()
{
$queryParams = [
'index' => $this->index,
'body' => [
'query' => [
'bool' => [
'must' => [],
'filter' => []
]
]
],
'from' => $this->queryParams['from'] ?? 0,
'size' => $this->queryParams['size'] ?? 10
];
$filter = $must = [];
if (!empty($this->queryParams['select'])) {
$queryParams['_source'] = explode(',', $this->queryParams['select']);
}
if (!empty($this->queryParams['equal'])) {
foreach ($this->queryParams['equal'] as $key => $row) {
foreach ($row as $filed => $value) {
$filter[] = [
'term' => [$filed => $value]
];
}
}
}
if (!empty($this->queryParams['in'])) {
foreach ($this->queryParams['in'] as $key => $row) {
foreach ($row as $filed => $value) {
$filter[] = [
'terms' => [$filed => array_values(array_unique(array_filter($value)))]
];
}
}
}
if (!empty($this->queryParams['like'])) {
foreach ($this->queryParams['like'] as $key => $row) {
foreach ($row as $filed => $value) {
/*$must[] = [
'wildcard' => [$filed => '*'. $value. '*']
];*/
$must[] = [
// 'match' => [$filed => $value]
'match_phrase' => [$filed => $value]
];
}
}
$queryParams['body']['query']['bool']['must'] = $must;
}
if (!empty($this->queryParams['orlike'])) {
foreach ($this->queryParams['orlike'] as $key => $row) {
foreach ($row as $filed => $value) {
$orlike[] = [
'match_phrase' => [$filed => $value]
];
}
}
$queryParams['body']['query']['bool']['must']['bool']['should'] = $orlike;
}
if (!empty($this->queryParams['order'])) {
$queryParams['body']['sort'] = [
key($this->queryParams['order']) => [
'order' => current($this->queryParams['order'])
]
];
}
$queryParams['body']['query']['bool']['filter'] = $filter;
$this->queryParams = $queryParams;
return $this;
}
/**
* @param bool $isTotal isTotal=true时, 返回总数
* @return array|string
*/
public function query($isTotal = false)
{
try {
$this->parseQueryParams();
if ($this->debug) {
return \GuzzleHttp\json_encode($this->queryParams);
}
if ($isTotal === true) {
unset(
$this->queryParams['from'],
$this->queryParams['size'],
$this->queryParams['_source']
);
$count = $this->client->count($this->queryParams);
return (int)$count['count'];
}
if (!empty($this->queryParams)) {
$result = $this->client->search($this->queryParams);
if (!empty($result['hits']['hits'])) {
$return = [];
foreach ($result['hits']['hits'] as $row) {
$return[] = $row['_source'];
}
return $return;
} else {
return [];
}
}
} catch (\Exception $e) {
$msg = $e->getMessage();
$msg = '服务器开小差了~';
throw new Exception($msg);
}
}
/**
* 添加文档
* @param $id
* @param $doc ['id'=>100, 'title'=>'phone']
* @param string $index_name
* @param string $type_name
*/
public function addDoc($id, $doc, string $index_name = 'gyx_ik', string $type_name = '_doc'): array
{
$params = [
'index' => $index_name,
'type' => $type_name,
'id' => $id,
'body' => $doc
];
return $this->client->index($params);
}
public function getIndex()
{
return $this->index;
}
/**
* 返回ES实例
*/
public static function setEs($index = '')
{
$class = get_called_class();
if (!self::$instance || !self::$instance instanceof $class) {
self::$instance = new static();
}
if ($index) {
self::$instance->index = $index;
}
return self::$instance;
}
protected function settings()
{
return [
'number_of_shards' => 1,
'number_of_replicas' => 0
];
}
/**
* 判断文档存在
* @param int $id
* @param string $index_name
* @param string $type_name
* @return bool
*/
public function existsDoc(int $id = 1, string $index_name = 'gyx_ik', string $type_name = '_doc'): bool
{
$params = [
'index' => $index_name,
'type' => $type_name,
'id' => $id
];
return $this->client->exists($params);
}
/**
* 获取文档
* @param int $id
* @param string $index_name
* @param string $type_name
* @return array
*/
public function getDoc(int $id = 1, string $index_name = 'gyx_ik', string $type_name = '_doc'): array
{
$params = [
'index' => $index_name,
'type' => $type_name,
'id' => $id
];
return $this->client->get($params);
}
/**
* 更新文档
* @param int $id
* @param string $index_name
* @param string $type_name
* @param array $body
* @return array
*/
public function updateDoc(int $id = 1, array $body = [], string $index_name = 'gyx_ik', string $type_name = '_doc'): array
{
// 可以灵活添加新字段,最好不要乱添加
$params = [
'index' => $index_name,
'type' => $type_name,
'id' => $id,
'body' => $body
];
return $this->client->update($params);
}
/**
* 搜索文档:分页,排序,权重,过滤
* @param string $index_name
* @param string $type_name
* @param array $body
* @return array
*/
public function searchDoc(array $body = [], string $index_name = "goods_list", string $type_name = "_doc"): array
{
$params = [
'index' => $index_name,
'type' => $type_name,
'body' => $body
];
return $this->client->search($params);
}
/**
* @return bool
* @throws Exception
*/
public function createIndexNew($mapping)
{
try {
$params = [
'index' => $this->index
];
$check = $this->indices()->exists($params);
if ($check) {
throw new Exception('index: ' . $this->index . ' already exists');
}
$params = [
'index' => $this->index,
'body' => [
'settings' => $this->settings(),
'mappings' => [
'_source' => [
'enabled' => true,
],
'properties' => $mapping
]
]
];
$result = $this->indices()->create($params);
return $result['acknowledged'] === true;
} catch (\Exception $e) {
throw new Exception($e->getMessage());
}
}
/**
* 删除索引
*
* @return bool
* @throws Missing404Exception
*/
public function deleteIndexNew()
{
try {
$params = [
'index' => $this->index
];
$check = $this->indices()->exists($params);
if (!$check) {
return true;
}
$result = $this->indices()->delete([
'index' => $this->index
]);
return $result['acknowledged'] === true;
} catch (Missing404Exception $e) {
throw new Missing404Exception('no such index ' . $this->index);
}
}
/**
* 批量写入
* type 1.增加/修改 2.删除
* $data = [
* ['id' => 1, 'name' => 'llf', 'age' => 30],
* ['id' => 1, 'name' => 'llf', 'age' => 30],
* ['id' => 1, 'name' => 'llf', 'age' => 30],
* ['id' => 1, 'name' => 'llf', 'age' => 30],
* ];
* @param array $data
*/
public function doBulkDocument($type = 1,$data = [])
{
try {
$params = ['body' => []];
if($type == 1){
foreach ($data as $key => $row) {
$params['body'][] = [
'index' => [
'_index' => $this->index,
'_id' => $row['info_id'].'-'.$row['info_type']
]
];
$params['body'][] = $row;
if (($key+1)%10000 == 0) {
$this->client->bulk($params);
$params = ['body' => []];
}
}
}else{
foreach ($data as $key => $row) {
$params['body'][] = [
'delete' => [
'_index' => $this->index,
'_id' => $row['info_id'].'-'.$row['info_type']
]
];
}
}
if (!empty($params['body'])) {
$this->client->bulk($params);
return true;
}
} catch (\Exception $e) {
throw new Exception($e->getMessage());
}
}
/**
* @return array @todo
*/
public function updateIndex()
{
$putParams = [
'index' => $this->index,
//'type' => '_doc',
'body' => [
'properties' => $this->mappings()
]
];
return $this->indices()->putMapping($putParams);
}
/**
* 方便调试, 直接返回拼接的query
* @return $this
*/
public function setDebug()
{
$this->debug = true;
return $this;
}
private function indices()
{
return $this->client->indices();
}
public function analyze($text = '')
{
$params = [
'index' => $this->index,
'body' => [
'analyzer' => 'ik_smart',
'text' => $text
]
];
return $this->indices()->analyze($params);
}
public function update($id = 0, $updateParams = [])
{
$params = [
'index' => $this->index,
'id' => $id,
'body' => [
'doc' => $updateParams
]
];
return $this->client->update($params);
}
}

@ -208,7 +208,7 @@ class Goods extends BaseModel
// 执行查询
$list = $query
->alias($this->name)
->field(['goods.goods_id', 'goods.goods_name', 'cmmdty_model', 'remark', 'cost_price_min', 'stock_total', 'is_check', 'goods_price_min','goods_no','goods_source','delivery_time','delivery_id','status','link','link_other'])
->field(['goods.goods_id', 'goods.goods_name', 'cmmdty_model', 'remark', 'cost_price_min', 'stock_total', 'is_check', 'goods_price_min','goods_no','goods_source','delivery_time','delivery_id','status','link','link_other','channel'])
->where('is_delete', '=', 0)
->order($sort)
->paginate($listRows);
@ -254,7 +254,13 @@ class Goods extends BaseModel
->paginate($listRows);
// 整理列表数据并返回
return $this->setGoodsListData($list);
foreach ($list as &$goods) {
$goods['dic'] = 'admin';
$goods = $this->setGoodsData($goods, null);
}
return $list;
//return $this->setGoodsListData($list);
}
/**
@ -272,17 +278,26 @@ class Goods extends BaseModel
// 设置显示的销量 goods_sales
$query->field(['(sales_initial + sales_actual) as goods_sales', '(line_price_max - goods_price_min) as discount']);
// 排序条件
$sort = $this->setQuerySort($param);
$sort1 = $this->setQuerySort($param);
// var_dump($sort);
// exit();
$order = request()->get()['order'] ?? '';
$sort = request()->get()['sort'] ?? '';
//商家端商品列表排序
if ($order && $sort) {
$sort = [
$sort => $order,
];
} else {
$sort = [
$this->getPk() => 'desc',
];
//小程序前台商品排序
if ($sort1) {
$sort = $sort1;
} else {
$sort = [
$this->getPk() => 'desc',
];
}
}
// if (!empty($order)) {
// if ($order == 1) {
@ -347,6 +362,7 @@ class Goods extends BaseModel
->field($field)
->where('is_delete', '=', 0)
->where($str)
->group("goods.goods_id")
->order($sort)
->paginate($listRows);
} else {
@ -355,6 +371,7 @@ class Goods extends BaseModel
->alias($this->name)
->field($field)
->where('is_delete', '=', 0)
->group("goods.goods_id")
->order($sort)
->paginate($listRows);
}
@ -448,12 +465,15 @@ class Goods extends BaseModel
$params['status'] > 0 && $filter[] = ['status', '=', (int)$params['status']];
$a = 1;
// 商品分类
if ($params['categoryId'] > 0) {
if ($params['categoryId'] > 0 || (isset($params['fliter_condition']) && $params['fliter_condition'])) {
// 关联商品与分类关系记录表
$GoodsCategoryRelName = (new GoodsCategoryRelModel())->getName();
$query->join($GoodsCategoryRelName, "{$GoodsCategoryRelName}.goods_id = {$this->name}.goods_id");
// 设置分类ID条件
$query->where('goods_category_rel.category_id', 'in', explode(",", (string)$params['categoryId']));
if ($params['categoryId'] > 0) {
// 设置分类ID条件
$query->where('goods_category_rel.category_id', 'in', explode(",", (string)$params['categoryId']));
}
}
if (isset($param['goodsIds']) && $param['goodsIds'] !== '') {
@ -589,13 +609,21 @@ class Goods extends BaseModel
protected function setGoodsData($goodsInfo, callable $callback = null)
{
$channel = Channel::withoutGlobalScope()->where('code', $goodsInfo['channel'])->find();
$goodsInfo['channel_name'] = $channel['alias'] ?? "";
if (isset($goodsInfo['dic']) && $goodsInfo['dic'] == 'admin') {
$goodsInfo['channel_name'] = (isset($channel['name'])&& $channel['name']) ? $channel['alias']."-".$channel['name'] : "";
} else {
$goodsInfo['channel_name'] = $channel['alias'] ?? "";
}
$goodsInfo['goods_images'] = helper::getArrayColumn($goodsInfo['images'], 'file');
// 商品主图
$goodsInfo['goods_image'] = $goodsInfo['goods_images'] ? current($goodsInfo['goods_images'])['preview_url'] : "";
// 商品销量(实际显示=初始虚拟销量+实际销量)
$goodsInfo['goods_sales'] = $goodsInfo['sales_initial'] + $goodsInfo['sales_actual'];
if (in_array($goodsInfo['channel'], ['sn','sn1']) && $goodsInfo['link_other']) {
$goodsInfo['link'] = $goodsInfo['link_other'];
}
// //商品价格判断
// if (UserService::isLogin()) {
// if (UserService::isStore()) {//店主

@ -112,7 +112,7 @@ class Goods extends BaseModel
$item['goods_image'] = !empty($item['goods']['goods_image']) ? $item['goods']['goods_image'] : '';
// 秒杀商品原价 (获取主商品价格)
//$item['original_price'] = !empty($item['goods']['original_price']) ? $item['goods']['original_price']: $item['goods']['goods_price_min'];
$item['original_price'] = !empty($item['goods']['original_price']) ?? $item['goods']['goods_price_min'];
$item['original_price'] = isset($item['goods']['original_price']) ? $item['goods']['original_price'] : $item['goods']['goods_price_min'];
// 回调函数
is_callable($callback) && call_user_func($callback, $item);
}

@ -0,0 +1,163 @@
<?php
namespace app\common\service;
use app\common\library\elasticsearch\Client;
class GoodsEs
{
private Client $esService;
private $index_name = 'goods_list';
public function __construct()
{
$this->esService = Client::setEs('goods_List');
}
/**
* 查询商品列表
* @param $params
* @return
*/
public function list($params)
{
$page = 1;
$limit = 10;
$body = [
'query' => [
'match_all' => []
],
'from' => ($page - 1) * $limit,
'size' => $limit,
'sort' => [
'id' => [
'order' => 'desc'
]
]
];
return $this->esService
->equal(['title' => 1])
->from(0)
->size(10)
->order(['id' => 'desc'])
->query($body);
}
/**
* 更新商品
*/
public function update($goods_id)
{
$goods_id = 1;
$doc = [
'id' => $goods_id,
'video_title' => '少爷的甜蜜良药',
'director' => '吴宇森',
'intro' => '吴宇森导演的《少爷的甜蜜良药》是吴宇森导演的经典作品,讲述了一个boyfriend和girlfriend的故事,boyfriend因为工作原因,被拒了girlfriend的offer,然后boyfriend和girlfriend一起去一个地方,然后boyfriend和girlfriend',
'cover' => 'https://oss-duanju-file.luochen.com/cover/202404/62249c6a-5f57-45cf-90ac-be6de5890ce0.jpg?x-oss-process=image/resize,m_fixed,h_400,w_360',
'episode_count' => '12',
'wechat_vid' => 'wx_vid_1',
'duration' => '01:02:03',
'service_types' => '2,3',
];
$res = $this->esService->updateDoc($goods_id, $doc);
var_dump($res);
}
/**
* 查询商品详情
*/
public function detail($goods_id)
{
$goods_id = 1;
$res = $this->esService->getDoc($goods_id);
var_dump($res);
}
/**
* 创建商品
* @return
*/
public function create($goods_id)
{
$goods_id = 1;
$doc = [
'id' => $goods_id,
'video_title' => '少爷的甜蜜良药',
'director' => '吴宇森',
'intro' => '吴宇森导演的《少爷的甜蜜良药》是吴宇森导演的经典作品,讲述了一个boyfriend和girlfriend的故事,boyfriend因为工作原因,被拒了girlfriend的offer,然后boyfriend和girlfriend一起去一个地方,然后boyfriend和girlfriend',
'cover' => 'https://oss-duanju-file.luochen.com/cover/202404/62249c6a-5f57-45cf-90ac-be6de5890ce0.jpg?x-oss-process=image/resize,m_fixed,h_400,w_360',
'episode_count' => '12',
'wechat_vid' => 'wx_vid_1',
'duration' => '01:02:03',
'service_types' => '2,3',
];
$res = $this->esService->addDoc($goods_id, $doc);
var_dump($res);
}
/**
* 删除商品
*/
public function delete($goods_id)
{
$res = $this->esService->deleteDoc($goods_id);
var_dump($res);
}
/**
* 创建商品Index
* @return void
* @throws Exception
*/
function createGoodsIndex()
{
$mapping = [
'properties' => [
'goods_id' => [
'type' => 'integer'
],
'goods_type' => [
'type' => 'keyword'
],
'director' => [
'type' => 'text',
"analyzer" => "ik_smart"
],
'intro' => [
'type' => 'text',
"analyzer" => "ik_smart"
],
'cover' => [
'type' => 'keyword'
],
'episode_count' => [
'type' => 'keyword'
],
'wechat_vid' => [
'type' => 'keyword'
],
'duration' => [
'type' => 'keyword'
],
'service_types' => [
'type' => 'keyword'
],
]
];
$res = $this->esService->createIndex($this->index_name, $mapping);
var_dump($res);
}
}

@ -0,0 +1,49 @@
<?php
// +----------------------------------------------------------------------
// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2023 https://www.yiovo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
// +----------------------------------------------------------------------
// | Author: 萤火科技 <admin@yiovo.com>
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace app\job\controller\goods;
use app\job\service\goods\GoodsAddPrice as GoodsAddPriceService;
use cores\BaseJob;
use cores\traits\QueueTrait;
use cores\exception\BaseException;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
/**
* 队列任务:商品批量导入
* Class Import
* @package app\job\controller
*/
class GoodsAddPrice extends BaseJob
{
use QueueTrait;
/**
* 消费队列任务:商品导入
* @param array $data 参数 [index队列顺序;totalCount商品总数量;list商品列表;storeId商城ID]
* @return bool 返回结果
* @throws BaseException
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function handle(array $data): bool
{
$time = date('H:i:s');
echo "\n ---- GoodsAddPrice ---- {$time} ---- \n";
$service = new GoodsAddPriceService;
return $service->batch($data['list'], $data['rate']);
}
}

@ -260,7 +260,8 @@ class Collector extends BaseService
$original['cost_price'] = $form['cost_price_min'];
$data['link_other'] = $url;
$data['goods_no'] = $original['goods_sku_no'];
$data['content'] = $original['content'];
//重新计算利润和利润率
@ -285,6 +286,7 @@ class Collector extends BaseService
];
//新阙通信的数据
if ($goods->channel == "xqtx") {
$data['goods_no'] = $original['goods_sku_no'];
//goods
$data['stock_total'] = $form['stock_total'];
$data['goods_name'] = $original['goods_name'];
@ -294,11 +296,15 @@ class Collector extends BaseService
$profit_rate = (float)$original['goods_price'] > 0 ? ($original['goods_price'] - $original['cost_price']) / $original['goods_price'] : 0.00;
$profit_rate = $profit_rate > 0.0001 ? bcmul((string)$profit_rate, "100", 2) : 0.00;
$data['profit_rate'] = $profit_rate;
$data['link'] = $data['link_other'];
unset($data['link_other']);
//sku
$goodsSku['stock_num'] = $form['stock_total'];
//unset($goodsSku['goods_price']);
} else {
//京东价拖
$data['goods_no_other'] = $original['goods_sku_no'];
}
// var_dump($data);
// var_dump($goodsSku);

@ -0,0 +1,99 @@
<?php
// +----------------------------------------------------------------------
// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2023 https://www.yiovo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
// +----------------------------------------------------------------------
// | Author: 萤火科技 <admin@yiovo.com>
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace app\job\service\goods;
use app\common\library\helper;
use app\common\service\BaseService;
use app\common\model\Goods as GoodsModel;
use app\common\model\GoodsSku;
use app\store\model\GoodsCategoryRel;
use cores\exception\BaseException;
use think\facade\Log;
use app\common\model\Channel;
use app\common\model\Region;
/**
* 服务类:商品批量导入
* Class Import
* @package app\job\service\goods
*/
class GoodsAddPrice extends BaseService
{
/**
* 批量导入商品
* @param array $list
* @param int $recordId
* @param int $storeId
* @return bool
* @throws BaseException
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function batch(array $goods, int $rate): bool
{
// ini_set('memory_limit', '1024M');
// set_time_limit(0);
// $goods = GoodsModel::alias('g')
// ->join('goods_category_rel c', 'g.goods_id = c.goods_id')
// ->where('c.store_id',0)
// ->where('g.is_delete',0)
// ->whereIn('c.category_id', $categoryIds)
// ->whereIn('g.channel',$channels)
// ->order("g.goods_id asc")
// ->select()
// ->toArray();
if (!$goods) {
return true;
}
//更新总后台当前商品的价格
GoodsModel::whereIn('goods_id', array_column($goods, "goods_id"))->update(['markup_rate' => $rate, 'update_time' => time()]);
foreach ($goods as $key => $value) {
//更新origin_goods_id为当前商品id的价格
$goods_list = GoodsModel::where('origin_goods_id', $value['goods_id'])
->where('is_delete', 0)
->field(['goods_id','cost_price_min','goods_price_min','markup_rate'])
->select()
->toArray();
if (!$goods_list) {
continue;
}
$item = $goods_list[0];
// if ($item['markup_rate'] > 0) {
// $item['cost_price_min'] = round($item['cost_price_min'] * (1 - ($rate / 100)), 0);
// }
$item['cost_price_min'] = $value['cost_price_min'];//设置原始数据的成本价
$cost_price = round($item['cost_price_min'] / (1 - ($rate / 100)), 0);
$profit = (float)$item['goods_price_min'] - (float)$cost_price;
$profit_rate = (float)$item['goods_price_min'] > 0 ? bcmul((string)($profit / (float)$item['goods_price_min']) , (string)100, 2) : 0.00;
$goodsData = [
'cost_price_min' => $cost_price,
'profit_rate' => $profit_rate,
'profit' => $profit,
'markup_rate' => $rate,
'update_time' => time()
];
GoodsModel::whereIn('goods_id', array_column($goods_list, "goods_id"))->update($goodsData);
$goodsSkuData = [
'cost_price' => $cost_price,
'update_time' => time()
];
GoodsSku::whereIn('goods_id', array_column($goods_list, "goods_id"))->update($goodsSkuData);
}
return true;
}
}

@ -207,12 +207,24 @@ class Goods extends Controller
$params['store_id'] = $this->storeId;
$perSize = 10000;
$params['page'] = 1;
$params['channels'] = ['zy'];
//$params['channels'] = ['zy'];
// echo "<pre>";
// print_r($params);
//exit();
$data = $model->getAdminListExport($params, $perSize)->toArray();
// echo "<pre>";
// print_r($data['data']);
// exit();
if ($data['data']) {
foreach ($data['data'] as &$value) {
if (!in_array($value['channel'], ['zy'])) {
$value['goods_price_min'] = self::$show_content;
$value['goods_price_max'] = self::$show_content;
$value['line_price_max'] = self::$show_content;
$value['line_price_min'] = self::$show_content;
$value['cost_price_min'] = self::$show_content;
$value['goods_no'] = self::$show_content;
}
$cates = GoodsCategoryRel::where('goods_id', $value['goods_id'])->select()->toArray();
$value['category_id'] = $cates ? implode(",", array_column($cates, "category_id")) : "";
}

@ -231,28 +231,48 @@ class Import extends ImportModel
self::$storeId = $form['store_id'] ?? 0;
foreach ($execlData as $key => $value) {
$upData = [
'goods_name'=> $value['B'],
'cmmdty_model'=> $value['C'],
'goods_source'=> $value['D'],
'goods_no'=> $value['E'],
//'goods_no'=> $value['E'],
'delivery_time'=> $value['G'],
'is_check'=> $value['H'],
'delivery_id'=> $value['I'],
'status'=> $value['J'],
'cost_price_min'=> $value['K'],
'goods_price_min'=> $value['L'],
'goods_price_max'=> $value['L'],
'line_price_min'=> $value['L'],
'line_price_max'=> $value['L'],
// 'cost_price_min'=> $value['K'],
// 'goods_price_min'=> $value['L'],
// 'goods_price_max'=> $value['L'],
// 'line_price_min'=> $value['L'],
// 'line_price_max'=> $value['L'],
'stock_total'=> $value['M'],
'remark'=> $value['N'],
];
$goods = GoodsModel::where('goods_id', $value['A'])->find();
if (!$goods) {
continue;
}
//自营数据才能更新价格
if (in_array($goods['channel'], ['zy'])) {
$upData['goods_no'] = $value['E'];
$upData['cost_price_min'] = $value['K'];
$upData['goods_price_min' ]= $value['L'];
$upData['goods_price_max'] = $value['L'];
$upData['line_price_min'] = $value['L'];
$upData['line_price_max'] = $value['L'];
$profit = (float)$upData['goods_price_min'] - (float)$upData['cost_price_min'];
$profit_rate = (float)$upData['goods_price_min'] > 0 ? bcmul(bcdiv((string)$profit, (string)$upData['goods_price_min'], 2), (string)100, 2) : 0.00;
$upData['profit'] = $profit;
$upData['profit_rate'] = $profit_rate;
GoodsSkuModel::where('goods_id', $value['A'])->update(['cost_price' => $value['K'], 'goods_price' => $value['L']]);
}
// echo "<pre>";
// print_r(explode(",", $value['F']));
// exit();
GoodsModel::where('goods_id', $value['A'])->update($upData);
GoodsSkuModel::where('goods_id', $value['A'])->update(['cost_price' => $value['K'], 'goods_price' => $value['L']]);
GoodsCategoryRelModel::updates((int)$value['A'], explode(",", $value['F']));
}
return true;

@ -53,7 +53,8 @@
"overtrue/easy-sms": "^2.0",
"overtrue/wechat": "~4.0",
"alipaysdk/easysdk": "^2.2",
"wechatpay/wechatpay": "^1.4"
"wechatpay/wechatpay": "^1.4",
"elasticsearch/elasticsearch": "v8.6.0"
},
"require-dev": {
"symfony/var-dumper": "^4.2"

301
composer.lock generated

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "6a7996d88fd82c5b30b1a2ce37fdcce9",
"content-hash": "b5ed7820a7c4b5d436edd224b891a3ba",
"packages": [
{
"name": "adbario/php-dot-notation",
@ -432,6 +432,117 @@
},
"time": "2021-07-05T04:03:22+00:00"
},
{
"name": "elastic/transport",
"version": "v8.8.0",
"source": {
"type": "git",
"url": "https://github.com/elastic/elastic-transport-php.git",
"reference": "cdf9f63a16ec6bfb4c881ab89aa0e2a61fb7c20b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/elastic/elastic-transport-php/zipball/cdf9f63a16ec6bfb4c881ab89aa0e2a61fb7c20b",
"reference": "cdf9f63a16ec6bfb4c881ab89aa0e2a61fb7c20b",
"shasum": ""
},
"require": {
"composer-runtime-api": "^2.0",
"php": "^7.4 || ^8.0",
"php-http/discovery": "^1.14",
"php-http/httplug": "^2.3",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0 || ^2.0",
"psr/log": "^1 || ^2 || ^3"
},
"require-dev": {
"nyholm/psr7": "^1.5",
"php-http/mock-client": "^1.5",
"phpstan/phpstan": "^1.4",
"phpunit/phpunit": "^9.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Elastic\\Transport\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "HTTP transport PHP library for Elastic products",
"keywords": [
"PSR_17",
"elastic",
"http",
"psr-18",
"psr-7",
"transport"
],
"support": {
"issues": "https://github.com/elastic/elastic-transport-php/issues",
"source": "https://github.com/elastic/elastic-transport-php/tree/v8.8.0"
},
"time": "2023-11-08T10:51:51+00:00"
},
{
"name": "elasticsearch/elasticsearch",
"version": "v8.6.0",
"source": {
"type": "git",
"url": "https://github.com/elastic/elasticsearch-php.git",
"reference": "03b145a3fd1dc984d7c2c79638c9257b1a17f8b7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/03b145a3fd1dc984d7c2c79638c9257b1a17f8b7",
"reference": "03b145a3fd1dc984d7c2c79638c9257b1a17f8b7",
"shasum": ""
},
"require": {
"elastic/transport": "^8.5",
"guzzlehttp/guzzle": "^7.0",
"php": "^7.4 || ^8.0",
"psr/http-client": "^1.0",
"psr/http-message": "^1.0",
"psr/log": "^1|^2|^3"
},
"require-dev": {
"ext-yaml": "*",
"ext-zip": "*",
"mockery/mockery": "^1.5",
"nyholm/psr7": "^1.5",
"php-http/mock-client": "^1.5",
"phpstan/phpstan": "^1.4",
"phpunit/phpunit": "^9.5",
"symfony/finder": "~4.0",
"symfony/http-client": "^5.0|^6.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Elastic\\Elasticsearch\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHP Client for Elasticsearch",
"keywords": [
"client",
"elastic",
"elasticsearch",
"search"
],
"support": {
"issues": "https://github.com/elastic/elasticsearch-php/issues",
"source": "https://github.com/elastic/elasticsearch-php/tree/v8.6.0"
},
"time": "2022-10-18T13:38:48+00:00"
},
{
"name": "ezyang/htmlpurifier",
"version": "v4.14.0",
@ -1983,6 +2094,194 @@
"abandoned": "w7corp/easywechat",
"time": "2021-12-27T13:56:47+00:00"
},
{
"name": "php-http/discovery",
"version": "1.19.4",
"source": {
"type": "git",
"url": "https://github.com/php-http/discovery.git",
"reference": "0700efda8d7526335132360167315fdab3aeb599"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599",
"reference": "0700efda8d7526335132360167315fdab3aeb599",
"shasum": ""
},
"require": {
"composer-plugin-api": "^1.0|^2.0",
"php": "^7.1 || ^8.0"
},
"conflict": {
"nyholm/psr7": "<1.0",
"zendframework/zend-diactoros": "*"
},
"provide": {
"php-http/async-client-implementation": "*",
"php-http/client-implementation": "*",
"psr/http-client-implementation": "*",
"psr/http-factory-implementation": "*",
"psr/http-message-implementation": "*"
},
"require-dev": {
"composer/composer": "^1.0.2|^2.0",
"graham-campbell/phpspec-skip-example-extension": "^5.0",
"php-http/httplug": "^1.0 || ^2.0",
"php-http/message-factory": "^1.0",
"phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
"sebastian/comparator": "^3.0.5 || ^4.0.8",
"symfony/phpunit-bridge": "^6.4.4 || ^7.0.1"
},
"type": "composer-plugin",
"extra": {
"class": "Http\\Discovery\\Composer\\Plugin",
"plugin-optional": true
},
"autoload": {
"psr-4": {
"Http\\Discovery\\": "src/"
},
"exclude-from-classmap": [
"src/Composer/Plugin.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com"
}
],
"description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
"homepage": "http://php-http.org",
"keywords": [
"adapter",
"client",
"discovery",
"factory",
"http",
"message",
"psr17",
"psr7"
],
"support": {
"issues": "https://github.com/php-http/discovery/issues",
"source": "https://github.com/php-http/discovery/tree/1.19.4"
},
"time": "2024-03-29T13:00:05+00:00"
},
{
"name": "php-http/httplug",
"version": "2.4.0",
"source": {
"type": "git",
"url": "https://github.com/php-http/httplug.git",
"reference": "625ad742c360c8ac580fcc647a1541d29e257f67"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67",
"reference": "625ad742c360c8ac580fcc647a1541d29e257f67",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0",
"php-http/promise": "^1.1",
"psr/http-client": "^1.0",
"psr/http-message": "^1.0 || ^2.0"
},
"require-dev": {
"friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0",
"phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Http\\Client\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Eric GELOEN",
"email": "geloen.eric@gmail.com"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://sagikazarmark.hu"
}
],
"description": "HTTPlug, the HTTP client abstraction for PHP",
"homepage": "http://httplug.io",
"keywords": [
"client",
"http"
],
"support": {
"issues": "https://github.com/php-http/httplug/issues",
"source": "https://github.com/php-http/httplug/tree/2.4.0"
},
"time": "2023-04-14T15:10:03+00:00"
},
{
"name": "php-http/promise",
"version": "1.3.1",
"source": {
"type": "git",
"url": "https://github.com/php-http/promise.git",
"reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
"reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3",
"phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4"
},
"type": "library",
"autoload": {
"psr-4": {
"Http\\Promise\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Joel Wurtz",
"email": "joel.wurtz@gmail.com"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com"
}
],
"description": "Promise used for asynchronous HTTP requests",
"homepage": "http://httplug.io",
"keywords": [
"promise"
],
"support": {
"issues": "https://github.com/php-http/promise/issues",
"source": "https://github.com/php-http/promise/tree/1.3.1"
},
"time": "2024-03-15T13:55:21+00:00"
},
{
"name": "phpoffice/phpspreadsheet",
"version": "1.22.0",

@ -12,5 +12,6 @@ return [
'CalDealerTime' => 'app\command\CalDealerTime',
'UpdateCollectGoodsPrice' => 'app\command\UpdateCollectGoodsPrice',
'SyncStoreBasicData' => 'app\command\SyncStoreBasicData',
'syncGoodsToEs' => 'app\command\SyncGoodsToEs',
],
];

@ -7,7 +7,7 @@ return [
// 默认日志记录通道
'default' => env('log.channel', 'file'),
// 日志记录级别
'level' => [],
'level' => ['error', 'sql', 'info'],
// 日志类型记录的通道 ['error'=>'email',...]
'type_channel' => [],
// 关闭全局日志写入

@ -27,7 +27,7 @@ return [
'host' => env('redis.hostname', '127.0.0.1'),
'port' => env('redis.hostport', '6379'),
'password' => env('redis.password', ''),
'select' => env('redis.select', '0'),
'select' => 1,//env('redis.select', '0'),
'timeout' => 0,
'persistent' => false,
'retry_after' => 60, // 队列任务无响应时(例如die exit)重试的间隔时间, 默认60秒

@ -1,6 +1,6 @@
<?php
// This file is automatically generated at:2023-02-22 11:45:22
declare (strict_types = 1);
<?php
// This file is automatically generated at:2024-05-27 09:06:36
declare (strict_types = 1);
return array (
0 => 'think\\app\\Service',
1 => 'think\\queue\\Service',

Loading…
Cancel
Save