cxfoot/models/common/integral/mall/CommonIntegralMallOrderDataForm.php
2023-10-27 14:25:12 +08:00

213 lines
8.6 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;
}
}