admin/addon/shopcomponent/model/Goods.php

423 lines
18 KiB
PHP

<?php
/**
* ThinkShop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都云之牛科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.cdcloudshop.com
* =========================================================
*/
namespace addon\shopcomponent\model;
use app\model\BaseModel;
class Goods extends BaseModel
{
/**
* 商品状态
* @var string[]
*/
private $status = [
0 => '未上架',
5 => '上架中',
11 => '已下架',
13 => '违规下架'
];
/**
* 审核状态
* @var string[]
*/
private $editStatus = [
0 => '审核中',
1 => '编辑中',
2 => '审核中',
3 => '审核失败',
4 => '审核成功',
];
/**
* 获取商品列表
* @param array $condition
* @param bool $field
* @param string $order
* @param int $page
* @param int $list_rows
* @param string $alias
* @param array $join
* @return array
*/
public function getGoodsPageList($condition = [], $field = true, $order = '', $page = 1, $list_rows = PAGE_LIST_ROWS, $alias = 'a', $join = [])
{
$field = 'sg.*,
g.goods_name,g.goods_image,g.price,g.goods_stock,g.recommend_way';
$alias = 'sg';
$join = [
['goods g', 'g.goods_id = sg.out_product_id', 'inner'],
];
$data = model('shopcompoent_goods')->pageList($condition, $field, $order, $page, $list_rows, $alias, $join);
if (!empty($data['list'])) {
foreach ($data['list'] as $k => $item) {
$data['list'][$k]['status_name'] = $this->status[$item['status']] ?? '';
$data['list'][$k]['edit_status_name'] = $this->editStatus[$item['edit_status']] ?? '';
$arr_img = explode(',',$item['goods_image']);
$data['list'][$k]['cover_img'] = $arr_img[0] ?? '';
$data['list'][$k]['create_time'] = $item['create_time']>0 ? time_to_date($item['create_time']) : '--';
$data['list'][$k]['audit_time'] = $item['audit_time']>0 ? time_to_date($item['audit_time']) : '--';
$data['list'][$k]['reject_reason'] = str_replace('https://developers.weixin.qq.com/miniprogram/dev/framework/ministore/minishopopencomponent/API/spu/add_spu.html','',$item['reject_reason']);
}
}
return $this->success($data);
}
/**
* 同步商品库商品
*/
public function syncGoods($start, $limit, $site_id, $status = 5)
{
$weapp = new Weapp($site_id);
$sync_res = $weapp->getSpuPage(['page' => $start, 'page_size' => $limit, 'status' => $status]);
if ($sync_res['code'] < 0) return $sync_res;
if (!empty($sync_res['data']['list'])) {
foreach ($sync_res['data']['list'] as $goods_item) {
$count = model('shopcompoent_goods')->getCount([ ['out_product_id', '=', $goods_item['out_product_id'] ], ['site_id', '=', $site_id] ]);
if ($count) {
model('shopcompoent_goods')->update([
'status' => $goods_item['status'],
'edit_status' => $goods_item['edit_status'],
'audit_time' => empty($goods_item['audit_info']) ? 0 : strtotime($goods_item['audit_info']['audit_time']),
'reject_reason' => $goods_item['edit_status'] == 3 ? $goods_item['audit_info']['reject_reason'] : ''
], [
['out_product_id', '=', $goods_item['out_product_id'] ]
]);
} else {
$category = (new Category())->getCategoryInfo($goods_item['third_cat_id'], $site_id);
model('shopcompoent_goods')->add([
'site_id' => $site_id,
'product_id' => $goods_item['product_id'],
'out_product_id' => $goods_item['out_product_id'],
'third_cat_id' => $goods_item['third_cat_id'],
'brand_id' => $goods_item['brand_id'],
'info_version' => $goods_item['info_version'],
'status' => $goods_item['status'],
'edit_status' => $goods_item['edit_status'],
'create_time' => strtotime($goods_item['create_time']),
'update_time' => strtotime($goods_item['update_time']),
'audit_time' => empty($goods_item['audit_info']) ? 0 : strtotime($goods_item['audit_info']['audit_time']),
'reject_reason' => $goods_item['edit_status'] == 3 ? $goods_item['audit_info']['reject_reason'] : '',
'cat_name' => "{$category['first_cat_name']}>{$category['second_cat_name']}>{$category['third_cat_name']}"
]);
}
}
$total_page = ceil($sync_res['data']['total'] / $limit);
return $this->success(['page' => $start, 'total_page' => $total_page]);
} else {
return $this->success(['page' => $start, 'total_page' => 1]);
}
}
/**
* 添加商品
* @param $param
*/
public function addGoods($param)
{
$goods_list = model('goods')->getList([ ['goods_id', 'in', explode(',', $param['goods_ids'] )], ['site_id', '=', $param['site_id'] ] ], 'goods_id,goods_name,goods_image,sku_id,goods_content');
if (!empty($goods_list)) {
$category = (new Category())->getCategoryInfo($param['third_cat_id'], $param['site_id']);
if (empty($category) || $category['status'] == 0) return $this->error('', '该类目不存在或未审核通过');
$weapp = new Weapp($param['site_id']);
foreach ($goods_list as $goods_item) {
// 需加到库中的商品数据
$goods_data = [
'out_product_id' => $goods_item['goods_id'],
'third_cat_id' => $param['third_cat_id'],
'brand_id' => $param['brand_id'] ?? 2100000000,
'info_version' => '0.0.1',
];
//处理图片
$goods_image_arr = $this->handleImg($goods_item['goods_image']);
$goods_image = [];
foreach ($goods_image_arr as $img_k => $img_y){
$res = $weapp->getImg($img_y);
if($res['code'] == 0){
$goods_image[] = $res['data']['img_info']['temp_img_url'];
}
}
// 同步商品所需数据
$spu_data = [
'title' => $goods_item['goods_name'],
'path' => 'pages/goods/detail?sku_id=' . $goods_item['sku_id'],
'head_img' => $goods_image,
'qualification_pics' => $category['product_qualification_type'] == 0 ? '' : explode(',', $category['qualification_pics']),
'desc_info' => [
'desc' => $goods_item['goods_content']
],
'skus' => []
];
$sku_list = model('goods_sku')->getList([['goods_id', '=', $goods_item['goods_id']]], 'sku_id,sku_no,sku_image,discount_price,market_price,stock,sku_spec_format');
foreach ($sku_list as $sku_item) {
//图片处理
$sku_res = $weapp->getImg($this->handleImg($sku_item['sku_image'])[0]);
$sku_image = "";
if($sku_res['code'] == 0){
$sku_image = $sku_res['data']['img_info']['temp_img_url'];
}
$sku_data = [
'out_product_id' => $goods_item['goods_id'],
'out_sku_id' => $sku_item['sku_id'],
'thumb_img' => $sku_image,
'sale_price' => $sku_item['discount_price'] * 100,
'market_price' => $sku_item['market_price'] * 100,
'stock_num' => $sku_item['stock'],
'sku_code' => $sku_item['sku_no'],
'sku_attrs' => []
];
if (!empty($sku_item['sku_spec_format'])) {
foreach (json_decode($sku_item['sku_spec_format'], true) as $spec_item) {
array_push($sku_data['sku_attrs'], [
'attr_key' => $spec_item['spec_name'],
'attr_value' => $spec_item['spec_value_name']
]);
}
} else {
$sku_data['sku_attrs'] = [
[
'attr_key' => '',
'attr_value' => ''
]
];
}
array_push($spu_data['skus'], $sku_data);
}
// 添加商品到小程序
$add_res = $weapp->addSpu(array_merge($goods_data, $spu_data));
if ($add_res['code'] != 0) return $add_res;
$goods_data['product_id'] = $add_res['data']['product_id'];
$goods_data['create_time'] = !empty($add_res['data']['create_time']) ? strtotime($add_res['data']['create_time']) : time();
$goods_data['site_id'] = $param['site_id'];
$goods_data['cat_name'] = "{$category['first_cat_name']}>{$category['second_cat_name']}>{$category['third_cat_name']}";
model('shopcompoent_goods')->add($goods_data);
}
return $this->success();
} else {
return $this->error('', '未获取到要添加的商品');
}
}
/**
* 更新商品
* @param $param
* @return array
*/
public function updateGoods($param){
$shopcompoent_goods_info = model('shopcompoent_goods')->getInfo([ ['out_product_id', '=', $param['goods_id'] ], ['site_id', '=', $param['site_id'] ] ], '*');
$goods_info = model('goods')->getInfo([ ['goods_id', '=', $param['goods_id'] ], ['site_id', '=', $param['site_id'] ] ], 'goods_id,goods_name,goods_image,sku_id,goods_content');
if (!empty($shopcompoent_goods_info) && !empty($goods_info)) {
$third_cat_id = $param['third_cat_id'] ?? $shopcompoent_goods_info['third_cat_id'];
$category = (new Category())->getCategoryInfo($third_cat_id, $param['site_id']);
if (empty($category) || $category['status'] == 0) return $this->error('', '该类目不存在或未审核通过');
$weapp = new Weapp($param['site_id']);
//处理图片
$goods_image_arr = $this->handleImg($goods_info['goods_image']);
$goods_image = [];
foreach ($goods_image_arr as $img_k => $img_y){
$res = $weapp->getImg($img_y);
if($res['code'] == 0){
$goods_image[] = $res['data']['img_info']['temp_img_url'];
}
}
// 同步商品所需数据
$spu_data = [
'out_product_id' => $goods_info['goods_id'],
'third_cat_id' => $third_cat_id,
'brand_id' => $param['brand_id'] ?? $shopcompoent_goods_info['brand_id'],
'info_version' => '0.0.1',
'title' => $goods_info['goods_name'],
'path' => 'pages/goods/detail?sku_id=' . $goods_info['sku_id'],
'head_img' => $goods_image,
'qualification_pics' => $category['product_qualification_type'] == 0 ? '' : explode(',', $category['qualification_pics']),
'desc_info' => [
'desc' => $goods_info['goods_content']
],
'skus' => []
];
$sku_list = model('goods_sku')->getList([['goods_id', '=', $goods_info['goods_id']]], 'sku_id,sku_no,sku_image,discount_price,market_price,stock,sku_spec_format');
foreach ($sku_list as $sku_item) {
//图片处理
$sku_res = $weapp->getImg($this->handleImg($sku_item['sku_image'])[0]);
$sku_image = "";
if($sku_res['code'] == 0){
$sku_image = $sku_res['data']['img_info']['temp_img_url'];
}
$sku_data = [
'out_product_id' => $goods_info['goods_id'],
'out_sku_id' => $sku_item['sku_id'],
'thumb_img' => $sku_image,
'sale_price' => $sku_item['discount_price'] * 100,
'market_price' => $sku_item['market_price'] * 100,
'stock_num' => $sku_item['stock'],
'sku_code' => $sku_item['sku_no'],
'sku_attrs' => []
];
if (!empty($sku_item['sku_spec_format'])) {
foreach (json_decode($sku_item['sku_spec_format'], true) as $spec_item) {
array_push($sku_data['sku_attrs'], [
'attr_key' => $spec_item['spec_name'],
'attr_value' => $spec_item['spec_value_name']
]);
}
} else {
$sku_data['sku_attrs'] = [
[
'attr_key' => '',
'attr_value' => ''
]
];
}
array_push($spu_data['skus'], $sku_data);
}
// 更新商品
$update_res = $weapp->updateSpu($spu_data);
if ($update_res['code'] != 0) return $update_res;
$goods_data = [
'edit_status' => 0,
'update_time' => time(),
'third_cat_id' => $third_cat_id,
'cat_name' => "{$category['first_cat_name']}>{$category['second_cat_name']}>{$category['third_cat_name']}"
];
model('shopcompoent_goods')->update($goods_data, [ ['out_product_id', '=', $param['goods_id'] ], ['site_id', '=', $param['site_id'] ] ]);
return $this->success();
} else {
return $this->error('', '未获取到要更新的商品');
}
}
/**
* 处理图片
* @param $images
* @return false|string[]
*/
private function handleImg($images){
$img_arr = explode(',', $images);
foreach ($img_arr as $k => $v) {
$img_arr[$k] = img($v);
}
return $img_arr;
}
/**
* 删除商品
* @param $id
* @param $site_id
*/
public function deleteGoods($goods_ids, $site_id)
{
if(!empty($goods_ids)){
$array_goodsIds = explode(',',$goods_ids);
}
foreach($array_goodsIds as $k=>$goods_id){
$res[$k] = (new Weapp($site_id))->delSpu(['out_product_id' => $goods_id]);
if ($res[$k]['code'] != 0) return $res[$k];
}
model('shopcompoent_goods')->delete([ ['site_id', '=', $site_id], ['out_product_id','in', $goods_ids] ]);
return $this->success();
}
/**
* 商品上架
* @param $goods_ids
* @param $site_id
* @return array|mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function goodsListing($goods_ids, $site_id){
if(!empty($goods_ids)){
$array_goodsIds = explode(',',$goods_ids);
}
foreach($array_goodsIds as $k=>$goods_id) {
$res[$k] = (new Weapp($site_id))->listing(['out_product_id' => $goods_id]);
if ($res[$k]['code'] != 0) return $res[$k];
}
model('shopcompoent_goods')->update(['status' => 5], [ ['site_id', '=', $site_id], ['out_product_id','in', $goods_ids] ]);
return $this->success();
}
/**
* 商品下架
* @param $goods_ids
* @param $site_id
* @return array|mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function goodsDelisting($goods_ids, $site_id){
if(!empty($goods_ids)){
$array_goodsIds = explode(',',$goods_ids);
}
foreach($array_goodsIds as $k=>$goods_id) {
$res[$k] = (new Weapp($site_id))->delisting(['out_product_id' => $goods_id]);
if ($res[$k]['code'] != 0) return $res[$k];
}
model('shopcompoent_goods')->update(['status' => 11], [ ['site_id', '=', $site_id], ['out_product_id','in', $goods_ids] ]);
return $this->success();
}
/**
* @param $site_id
*/
public function getOrderPayInfo($site_id){
$join = [
['goods g', 'g.goods_id = sg.out_product_id', 'left']
];
$condition = [
['sg.site_id', '=', $site_id],
['sg.status', '=', 5],
['sg.edit_status', '=', 4],
['g.is_delete', '=', 0],
['g.goods_state', '=', 1]
];
$goods_info = model('shopcompoent_goods')->getInfo($condition, 'g.goods_name,g.price,g.goods_id,g.sku_id', 'sg', $join);
if (empty($goods_info)) return $this->error('', '请先将商品同步到微信侧,等待商品审核通过并已上架');
$qrcode_res = event('Qrcode', [
'site_id' => $site_id,
'app_type' => 'weapp',
'type' => 'create',
'data' => [
'goods_id' => $goods_info['goods_id'],
'is_test' => 1
],
'page' => '/pages/goods/detail',
'qrcode_path' => 'upload/qrcode/goods',
'qrcode_name' => "goods_qrcode_" . $goods_info['sku_id']
], true);
if ($qrcode_res['code'] != 0) return $qrcode_res;
$goods_info['qrcode_path'] = $qrcode_res['data']['path'];
return $this->success($goods_info);
}
}