213 lines
8.4 KiB
PHP
213 lines
8.4 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @author Any
|
|
* @description KISS
|
|
* @date 2021年10月13日
|
|
* @version 1.0.0
|
|
*
|
|
* _____LOG_____
|
|
*
|
|
*/
|
|
namespace app\models\common\integral\mall;
|
|
|
|
use app\models\common\CommonGoodsListForm;
|
|
use app\models\integral\mall\IntegralMallGoods;
|
|
use app\models\integral\mall\IntegralMallGoodsAttr;
|
|
use app\models\integral\Integral;
|
|
use app\models\Goods;
|
|
use app\models\GoodsAttr;
|
|
use app\models\GoodsHub;
|
|
use app\models\Order;
|
|
use app\models\Address;
|
|
use app\models\Model;
|
|
use app\components\SiteHelper;
|
|
use app\components\SysConst;
|
|
use app\components\Serializer;
|
|
use app\components\FlashStorage;
|
|
use app\models\common\CommonGeocoderForm;
|
|
|
|
|
|
class CommonIntegralMallOrderDataForm extends Model
|
|
{
|
|
public $cx_mch_id;
|
|
public $goods_info;
|
|
public $user_id;
|
|
|
|
public function rules()
|
|
{
|
|
return [
|
|
[['goods_info'], 'safe'],
|
|
[['cx_mch_id', 'user_id'], 'integer'],
|
|
[['cx_mch_id', 'goods_info', 'user_id'], 'required'],
|
|
];
|
|
}
|
|
|
|
public function search()
|
|
{
|
|
if(!$this->validate()){
|
|
return $this->getModelError();
|
|
}
|
|
$data = [];
|
|
//商品信息
|
|
$res = $this->getGoodsInfo();
|
|
if($res['code'] != 0){
|
|
return $res;
|
|
}
|
|
$data['goods_list'] = $res['data']['goods_list'];
|
|
//地址信息
|
|
$data['address'] = $this->getDefaultAddress();
|
|
//支付方式
|
|
$data['pay_types'] = $this->getPayTypes();
|
|
return $this->apiReturnSuccess('ok', $data);
|
|
}
|
|
|
|
private function getGoodsInfo()
|
|
{
|
|
$goods_list = [];
|
|
$goods_info = is_array($this->goods_info) ? $this->goods_info : json_decode($this->goods_info, true);
|
|
//商品信息检查
|
|
$res = $this->checkGoodsInfo($goods_info);
|
|
if($res['code'] != 0){
|
|
return $res;
|
|
}
|
|
$goods_info = $res['data']['goods_info'];
|
|
foreach ($goods_info as $index => $item){
|
|
$goods_item = Goods::find()->alias('g')
|
|
->leftJoin(['gh' => GoodsHub::tableName()], 'g.goods_hub_id=gh.id')
|
|
->leftJoin(['img' => IntegralMallGoods::tableName()],'img.goods_id=g.id')
|
|
->where([
|
|
'g.cx_mch_id' => $this->cx_mch_id,
|
|
'g.is_delete' => 0,
|
|
'g.status' => Goods::STATUS_ONLINE,
|
|
'gh.is_delete' => 0,
|
|
'img.is_delete' => 0,
|
|
'g.id' => $item['goods_id']
|
|
])
|
|
->select('g.id,g.price,g.goods_stock,g.use_attr,g.attr_groups,gh.name,gh.cover_pic,gh.unit,gh.type,img.integral_num')->asArray()->one();
|
|
if($goods_item == null){
|
|
return $this->apiReturnError('所选商品不存在或已经下架');
|
|
}
|
|
$goods_item['attr_groups'] = !empty($goods_item['attr_groups']) ? json_decode($goods_item['attr_groups'],true) : [];
|
|
$goods_item['cover_pic'] = SiteHelper::getFullUrl($goods_item['cover_pic']);
|
|
$goods_item['goods_attr_info'] = GoodsAttr::find()->alias('gr')
|
|
->leftJoin(['imgr' => IntegralMallGoodsAttr::tableName()],'imgr.goods_attr_id=gr.id')
|
|
->where([
|
|
'gr.id' => $item['goods_attr_id'],
|
|
'gr.goods_id' => $item['goods_id'],
|
|
'gr.is_delete' => 0,
|
|
'imgr.is_delete' => 0,
|
|
])
|
|
->select('gr.id,gr.goods_id,gr.price,gr.sign_id,gr.stock,gr.serial_no,gr.weight,gr.cover_pic,imgr.integral_num')
|
|
->asArray()->one();
|
|
$goods_item['goods_num'] = isset($item['goods_num']) ? $item['goods_num'] : 1;
|
|
|
|
if($goods_item['goods_attr_info']){
|
|
$goods_item['goods_stock'] = (int)$goods_item['goods_attr_info']['stock'];
|
|
$goods_item['integral_num'] = (int)$goods_item['goods_attr_info']['integral_num'];
|
|
$goods_item['price'] = sprintf('%.2f',$goods_item['goods_attr_info']['price']);
|
|
$goods_item['goods_attr_info']['cover_pic'] = SiteHelper::getFullUrl($goods_item['goods_attr_info']['cover_pic']);
|
|
$goods_item['goods_attr_info']['attr_info_list'] = Goods::getGoodsAttrInfoListBySignId($goods_item['goods_attr_info']['sign_id'], $goods_item['attr_groups']);
|
|
$goods_item['goods_attr_info']['attr_info'] = Goods::getGoodsAttrInfoToString($goods_item['goods_attr_info']['sign_id'], $goods_item['attr_groups'], '|');
|
|
$goods_item['goods_attr_info']['goods_name'] = $goods_item['name'];
|
|
$goods_item['goods_attr_info']['goods_unit'] = $goods_item['unit'];
|
|
$goods_item['goods_attr_info']['goods_type'] = $goods_item['type'];
|
|
} else {
|
|
if($item['goods_attr_id'] != 0){
|
|
return $this->apiReturnError('商品规格不存在');
|
|
}
|
|
}
|
|
$goods_item['total_original_price'] = $item['goods_num'] * $goods_item['price'];
|
|
$goods_item['total_original_price'] = sprintf('%.2f',$goods_item['total_original_price']);
|
|
|
|
$goods_item['total_integral_num'] = $item['goods_num'] * $goods_item['integral_num'];
|
|
$goods_item['has_stock'] = $item['goods_nun'] > $goods_item['goods_stock'] ? false : true;
|
|
|
|
$goods_list[] = $goods_item;
|
|
}
|
|
if(count($goods_list) == 0){
|
|
return $this->apiReturnError('商品信息不能为空');
|
|
}
|
|
return $this->apiReturnSuccess('ok', ['goods_list' => $goods_list]);
|
|
}
|
|
|
|
private function checkGoodsInfo($goods_info)
|
|
{
|
|
$goods_list = [];
|
|
foreach ($goods_info as $index => $item){
|
|
if(!isset($item['goods_id'])){
|
|
return $this->apiReturnError('商品信息缺少goods_id参数');
|
|
}
|
|
if(!isset($item['goods_attr_id'])){
|
|
return $this->apiReturnError('商品信息缺少goods_attr_id参数');
|
|
}
|
|
if(!isset($item['goods_num'])){
|
|
return $this->apiReturnError('商品信息缺少goods_num参数');
|
|
}
|
|
$goods_list = $this->mergeGoodsList($item, $goods_list);
|
|
}
|
|
if(count($goods_list) == 0){
|
|
return $this->apiReturnError('商品信息不能为空');
|
|
}
|
|
return $this->apiReturnSuccess('ok', ['goods_info' => $goods_list]);
|
|
}
|
|
|
|
private function mergeGoodsList($goods, $goods_list)
|
|
{
|
|
$is_exists = false;
|
|
foreach ($goods_list as $index => $item){
|
|
if($item['goods_id'] == $goods['goods_id'] && $item['goods_attr_id'] == $goods['goods_attr_id']){
|
|
$item['goods_num'] += $goods['goods_num'];
|
|
$goods_list[$index] = $item;
|
|
$is_exists = true;
|
|
break;
|
|
}
|
|
}
|
|
if(!$is_exists){
|
|
$goods_list[] = $goods;
|
|
}
|
|
return $goods_list;
|
|
}
|
|
|
|
|
|
private function getDefaultAddress()
|
|
{
|
|
//最近收货使用地址
|
|
$order = Order::findOne(['user_id' => $this->user_id, 'cx_mch_id' => $this->cx_mch_id, 'is_delete' => 0, 'send_type' => [0, 2, 4]]);
|
|
if($order != null && $order->location != null){
|
|
$location = explode(',', $order->location);
|
|
$address = Address::findOne(['user_id' => $this->user_id, 'cx_mch_id' => $this->cx_mch_id, 'is_delete' => 0, 'lat' => $location[0], 'lng' => $location[1]]);
|
|
} else {
|
|
$address = Address::findOne(['user_id' => $this->user_id, 'cx_mch_id' => $this->cx_mch_id, 'is_delete' => 0, 'is_default' => 1]);
|
|
}
|
|
if($address != null){
|
|
return [
|
|
'id' => $address->id,
|
|
'name' => $address->name,
|
|
'mobile' => $address->mobile,
|
|
'address' => $address->province.$address->city.$address->district.$address->detail,
|
|
'location' => $address->location,
|
|
'province' => $address->province,
|
|
'city' => $address->city,
|
|
'district' => $address->district,
|
|
'detail' => $address->detail
|
|
];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private function getPayTypes()
|
|
{
|
|
$pay_types = [];
|
|
$pay_types[] = [
|
|
'name' => '积分支付',
|
|
'short_name' => 'integral',
|
|
'is_show' => true,
|
|
'is_open' => true,
|
|
];
|
|
return $pay_types;
|
|
}
|
|
|
|
}
|
|
|