汪总电商平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1131 lines
41 KiB

<?php
namespace app\api\controller\wanlshop\groups;
use addons\wanlshop\library\WanlSdk\Common;
use app\common\controller\Api;
use think\Cache;
use think\Db;
use think\Exception;
use think\exception\PDOException;
/**
* WanlShop 拼团应用订单接口
*/
class Order extends Api
{
protected $noNeedLogin = [];
protected $noNeedRight = ['*'];
/**
* 获取拼团订单列表 ---
*
* @ApiSummary (WanlShop 拼团订单接口获取拼团订单列表)
* @ApiMethod (GET)
* 2021年6月28日12:50:01
*
* @param string $state 状态
*/
public function getOrderList()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
$state = $this->request->request('state');
if ($state && $state != 0) {
$where['state'] = $state;
}
$where['status'] = 'normal';
$where['user_id'] = $this->auth->id;
// 列表
$list = model('app\api\model\wanlshop\groups\Order')
->where($where)
->field('id,shop_id,state')
->order('updatetime desc')
->paginate()
->each(function($order, $key){
$order['goods'] = model('app\api\model\wanlshop\groups\OrderGoods')
->where(['order_id'=> $order->id])
->field('id,title,image,difference,price,market_price,group_price,group_type,group_no,people_num,is_ladder,ladder_id,number,refund_status')
->select();
// 获取支付 1.1.2升级
$order['pay'] = model('app\api\model\wanlshop\Pay')
->where(['order_id' => $order->id, 'type' => 'groups'])
->field('number, price, order_price, freight_price, discount_price, actual_payment')
->find();
$order['shop'] = $order->shop ? $order->shop->visible(['shopname']):[];
return $order;
});
$list?($this->success('ok',$list)):($this->error(__('网络繁忙')));
}
/**
* 查询用户店铺订单记录
*
* @ApiSummary (查询用户店铺订单记录 1.0.2升级)
* @ApiMethod (POST)
*
* @param string $shop_id 店铺ID
*/
public function getOrderListToShop()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if($this->request->isPost()){
$shop_id = $this->request->post('shop_id');
$shop_id ? '':($this->error(__('Invalid parameters')));
$list = model('app\api\model\wanlshop\Order')
->where(['shop_id' => $shop_id, 'user_id' => $this->auth->id, 'status' => 'normal'])
->field('id,shop_id,order_no,state')
->order('updatetime desc')
->select();
// 订单状态:1=待支付,2=待发货,3=待收货,4=待评论,5=售后订单(已弃用),6=已完成,7=已取消
foreach ($list as $row) {
$row['goods'] = model('app\api\model\wanlshop\OrderGoods')
->where(['order_id'=> $row->id])
->field('id,title,image,difference,price,market_price,number,refund_status')
->select();
}
$this->success(__('发送成功'), $list);
}
$this->error(__('非法请求'));
}
/**
* 获取订单详情 ----
*
* @ApiSummary (WanlShop 订单接口获取订单详情)
* @ApiMethod (GET)
*
* @param string $id 订单ID
*/
public function getOrderInfo()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
$id = $this->request->request('id');
$id ? $id : ($this->error(__('非法请求')));
$order = model('app\api\model\wanlshop\groups\Order')
->where(['id' => $id, 'user_id' => $this->auth->id])
->field('id,shop_id,order_no,isaddress,express_no,express_name,
freight_type,state,createtime,paymenttime,delivertime,taketime,dealtime')
->find();
$order ? $order : ($this->error(__('网络繁忙')));
// 输出配置
$config = get_addon_config('wanlshop');
$order['config'] = $config['order'];
switch ($order['state']) {
case 1:
$express = [
'context' => '付款后,完成拼团即可将宝贝发出',
'status' => '尚未付款',
'time' => date('Y-m-d H:i:s', $order['createtime'])
];
break;
case 2:
$express = [
'context' => '正在分享拼团中',
'status' => '已付款',
'time' => date('Y-m-d H:i:s', $order['createtime'])
];
break;
case 3:
$express = [
'context' => '商家正在处理订单',
'status' => '已付款',
'time' => date('Y-m-d H:i:s', $order['paymenttime'])
];
break;
default: // 获取物流
$eData = model('app\api\model\wanlshop\KuaidiSub')
->where(['express_no' => $order['express_no']])
->find();
// 获取数据 兼容PHP7.4 1.1.5升级
if(!empty($eData['data'])){
$ybData = json_decode($eData['data'], true);
$express = $ybData[0];
}else{
$express = [
'status' => '已发货',
'context' => '包裹正在等待快递小哥揽收~',
'time' => date('Y-m-d H:i:s', $order['delivertime'])
];
}
}
// 获取物流
$order['logistics'] = $express;
// 获取地址
$order['address'] = model('app\api\model\wanlshop\groups\OrderAddress')
->where(['order_id' => $id, 'user_id' => $this->auth->id])
->order('isaddress desc')
->field('id,name,mobile,address,address_name')
->find();
// 获取店铺
$order['shop'] = $order->shop?$order->shop->visible(['shopname']):[];
// 获取订单商品
$order['goods'] = model('app\api\model\wanlshop\groups\OrderGoods')
->where(['order_id'=> $id])
->field('id,goods_id,title,image,difference,price,market_price,actual_payment,discount_price,freight_price,group_type,group_no,is_alone,is_ladder,ladder_id,people_num,group_hour,group_price,number,refund_id,refund_status')
->select();
// 获取支付 1.1.2升级
$order['pay'] = model('app\api\model\wanlshop\Pay')
->where(['order_id' => $order->id, 'type' => 'groups'])
->field('id, pay_no, number, price, order_price, freight_price, discount_price, actual_payment')
->find();
$this->success('ok',$order);
}
/**
* 取消订单 ----
*
* @ApiSummary (WanlShop 订单接口取消订单)
* @ApiMethod (POST)
*
* @param string $id 订单ID
*/
public function cancelOrder()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$id = $this->request->post('id');
$id ? $id : ($this->error(__('非法请求')));
// 判断权限
$this->getOrderState($id) != 1 ? ($this->error(__('订单异常'))):'';
$row = model('app\api\model\wanlshop\groups\Order')->get(['id' => $id, 'user_id' => $this->auth->id]);
$result = $row->allowField(true)->save(['state' => 7]);
// 还原优惠券
if($row['coupon_id'] != 0){
model('app\api\model\wanlshop\CouponReceive')->where(['id' => $row['coupon_id'], 'user_id' => $this->auth->id])->update(['state' => 1]);
}
// 释放库存
foreach(model('app\api\model\wanlshop\groups\OrderGoods')->all(['order_id' => $row['id']]) as $vo){
// 查询商品是否需要释放库存
if(model('app\api\model\wanlshop\groups\Goods')->get($vo['goods_id'])['stock'] == 'porder'){
model('app\api\model\wanlshop\groups\GoodsSku')->where('id', $vo['goods_sku_id'])->setInc('stock', $vo['number']);
}
// 删除拼团-1.0.8临时方案
model('app\api\model\wanlshop\groups\Groups')
->where([
'group_no' => $vo['group_no'],
'user_id' => $this->auth->id,
'state' => 'ready'
])
->setField('deletetime', time());
}
$this->success('ok', $result ? true : false);
}
$this->error(__('非法请求'));
}
/**
* 删除订单 -----
*
* @ApiSummary (WanlShop 订单接口删除订单)
* @ApiMethod (POST)
*
* @param string $id 订单ID
*/
public function delOrder()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$id = $this->request->post('id');
$id ? $id : ($this->error(__('非法请求')));
// 判断权限
$state = $this->getOrderState($id);
$state == 6 || $state == 7 ? '' :($this->error(__('非法请求')));
$order = model('app\api\model\wanlshop\groups\Order')
->save(['status' => 'hidden'],['id' => $id]);
$this->success('ok', $order ? true : false);
}
$this->error(__('非法请求'));
}
/**
* 修改地址 ----
*
* @ApiSummary (WanlShop 订单接口修改地址)
* @ApiMethod (POST)
*
* @param string $id 订单ID
*/
public function editOrderAddress()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$order_id = $this->request->post('id');
$address_id = $this->request->post('address_id');
$order_id || $address_id ? $order_id : ($this->error(__('非法请求')));
// 判断权限
$this->getOrderState($order_id) > 3 ? ($this->error(__('订单异常'))):'';
// 订单
$order = model('app\api\model\wanlshop\groups\Order')
->where(['id' => $order_id, 'user_id' => $this->auth->id])
->find();
//判断是否修改过
if($order['isaddress'] == 1){
$this->error(__('已经修改过一次了'));
}else{
// 获取地址
$address = model('app\api\model\wanlshop\Address')
->where(['id' => $address_id, 'user_id' => $this->auth->id])
->find();
// 修改地址
$data = model('app\api\model\wanlshop\groups\OrderAddress')->save([
'user_id' => $this->auth->id,
'shop_id' => $order->shop_id,
'order_id' => $order_id,
'isaddress' => 1,
'name' => $address['name'],
'mobile' => $address['mobile'],
'address' => $address['province'].'/'.$address['city'].'/'.$address['district'].'/'.$address['address'],
'address_name' => $address['address_name'],
'location' => $address['location']
]);
// 修改状态
model('app\api\model\wanlshop\groups\Order')->where(['id' => $order_id, 'user_id' => $this->auth->id])->update(['isaddress' => 1]);
$this->success('ok',$data);
}
}
$this->error(__('非法请求'));
}
/**
* 确认收货 ----
*
* @ApiSummary (WanlShop 订单接口确认收货)
* @ApiMethod (POST)
*
* @param string $id 订单ID ------ 后续版本优化 Db::startTrans();
*/
public function confirmOrder()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$id = $this->request->post('id');
$id ? $id : ($this->error(__('非法请求')));
// 判断权限
$order = model('app\api\model\wanlshop\groups\Order')
->where(['id' => $id, 'state'=> 4, 'user_id' => $this->auth->id])
->find();
if(!$order){
$this->error(__('订单异常'));
}
// 1.1.6 升级
$type = 'groups';
// 获取支付 1.1.2升级
$pay = model('app\api\model\wanlshop\Pay')->get(['order_id' => $id, 'type' => $type]);
// 平台转款给商家
controller('addons\wanlshop\library\WanlPay\WanlPay')->money(+$pay['price'], $order['shop']['user_id'], '买家确认收货', $type, $order['order_no']);
// 查询是否有退款 1.1.2升级
$refund = model('app\api\model\wanlshop\Refund')
->where(['order_id' => $id, 'state' => 4, 'order_type' => $type])
->select();
// 退款存在
if($refund){
foreach($refund as $value){
controller('addons\wanlshop\library\WanlPay\WanlPay')->money(-$value['price'], $order['shop']['user_id'], '该订单存在的退款', $type, $order['order_no']);
}
}
// 更新退款
$order->save(['state' => 5,'taketime' => time()],['id' => $id]);
$this->success('ok', $order ? true : false);
}
$this->error(__('非法请求'));
}
/**
* 评论订单
*
* @ApiSummary (WanlShop 订单接口评论订单)
* @ApiMethod (POST)
*
* @param string $id 订单ID
*/
public function commentOrder()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$post = $this->request->post();
$post ? $post : ($this->error(__('数据异常')));
$user_id = $this->auth->id;
// 判断权限
$this->getOrderState($post['order_id']) != 5 ? ($this->error(__('已经评论过或订单异常'))):'';
// 生成列表
$commentData = [];
foreach ($post['goodsList'] as $value) {
$commentData[] = [
'user_id' => $user_id,
'shop_id' => $post['shop']['id'],
'order_id' => $post['order_id'],
'goods_id' => $value['goods_id'],
'order_type' => 'groups',
'order_goods_id' => $value['id'],
'state' => $value['state'],
'content' => $value['comment'],
'suk' => $value['difference'],
'images' => $value['imgList'],
'score' => round((($post['shop']['describe'] + $post['shop']['service'] + $post['shop']['deliver'] + $post['shop']['logistics']) / 4) ,1),
'score_describe' => $post['shop']['describe'],
'score_service' => $post['shop']['service'],
'score_deliver' => $post['shop']['deliver'],
'score_logistics' => $post['shop']['logistics'],
'switch' => 0
];
//评论暂不考虑并发,为列表提供好评付款率,减少并发只能写进商品中
model('app\api\model\wanlshop\groups\Goods')->where(['id' => $value['goods_id']])->setInc('comment');
if($value['state'] == 0){
model('app\api\model\wanlshop\groups\Goods')->where(['id' => $value['goods_id']])->setInc('praise');
}else if($value['state'] == 1){
model('app\api\model\wanlshop\groups\Goods')->where(['id' => $value['goods_id']])->setInc('moderate');
}else if($value['state'] == 2){
model('app\api\model\wanlshop\groups\Goods')->where(['id' => $value['goods_id']])->setInc('negative');
}
}
if(model('app\api\model\wanlshop\GoodsComment')->saveAll($commentData)){
$order = model('app\api\model\wanlshop\groups\Order')
->where(['id' => $post['order_id'], 'user_id' => $user_id])
->update(['state' => 6]);
}
//更新店铺评分
$score = model('app\api\model\wanlshop\GoodsComment')
->where(['user_id' => $user_id])
->select();
// 从数据集中取出
$describe = array_column($score,'score_describe');
$service = array_column($score,'score_service');
$deliver = array_column($score,'score_deliver');
$logistics = array_column($score,'score_logistics');
// 更新店铺评分
model('app\api\model\wanlshop\Shop')
->where(['id' => $post['shop']['id']])
->update([
'score_describe' => bcdiv(array_sum($describe), count($describe), 1),
'score_service' => bcdiv(array_sum($service), count($service), 1),
'score_deliver' => bcdiv(array_sum($deliver), count($deliver), 1),
'score_logistics' => bcdiv(array_sum($logistics), count($logistics), 1)
]);
$this->success('ok',[]);
}
$this->error(__('非法请求'));
}
/**
* 获取订单物流状态 ----
*
* @ApiSummary (WanlShop 订单接口获取订单物流状态)
* @ApiMethod (POST)
*
* @param string $id 订单ID
*/
public function getLogistics()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$id = $this->request->post('id');
$id ? $id : ($this->error(__('非法请求')));
//获取订单
$order = model('app\api\model\wanlshop\groups\Order')
->where(['id' => $id, 'user_id' => $this->auth->id])
->field('id,shop_id,express_name,express_no,order_no,createtime,paymenttime,delivertime')
->find();
// 获取快递
switch ($order['state']) {
case 1:
$express[] = [
'context' => '付款后,即可将宝贝发出',
'status' => '尚未付款',
'time' => date('Y-m-d H:i:s', $order['createtime'])
];
break;
case 2:
$express[] = [
'context' => '商家接受到您的订单,准备出库',
'status' => '已下单',
'time' => date('Y-m-d H:i:s', $order['paymenttime'])
];
break;
default: // 获取物流
$express = model('app\api\model\wanlshop\KuaidiSub')
->where(['express_no' => $order['express_no']])
->find();
if($express){
$express = json_decode($express['data'], true);
}else{
$express[] = [
'context' => '打包完成,正在等待快递小哥揽收~',
'status' => '仓库处理中',
'time' => date('Y-m-d H:i:s', $order['delivertime'])
];
}
}
$order['kuaidi'] = $order->kuaidi ? $order->kuaidi->visible(['name','logo','tel']) : [];
$order['express'] = $express;
$this->success('ok',$order);
}
$this->error(__('非法请求'));
}
/**
* 查询购买次数限制
*
* @ApiSummary (WanlShop 拼团接口查询购买次数限制)
* @ApiMethod (POST)
*
* @param string $data 商品数据
*/
public function getOrderPurchaseLimit($id = 0)
{
//设置过滤方法
$this->request->filter(['strip_tags']);
$goods = model('app\api\model\wanlshop\groups\Goods')
->where('id', $id)
->find();
if($goods){
if($goods['purchase_limit'] != 0){
$orderGoodsConunt = model('app\api\model\wanlshop\groups\OrderGoods')
->where(['goods_id' => $id, 'user_id' => $this->auth->id])
->count();
if($orderGoodsConunt >= $goods['purchase_limit']){
$this->error(__('此商品每个ID仅可购买'.$goods['purchase_limit'].'件,你已购买过'. $orderGoodsConunt .'件'));
}
}
$this->success('不满足限制条件');
}else{
$this->error(__('非法请求'));
}
}
/**
* 确认拼团订单
*
* @ApiSummary (WanlShop 拼团接口确认订单)
* @ApiMethod (POST)
*
* @param string $data 商品数据
*/
public function getOrderGoodsList()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$request = $this->request->post();
// 订单数据
$order = array();
$map = array();
// 客户端地址更新
$where = !empty($request['address_id']) ? ['id' => $request['address_id'], 'user_id' => $this->auth->id] : ['user_id' => $this->auth->id, 'default' => 1];
// 地址
$address = model('app\api\model\wanlshop\Address')
->where($where)
->field('id,name,mobile,province,city,district,address')
->find();
// 1.1.6升级
if(!$address){
$this->error(__('请添加收货地址'));
}
// 合计
$statis = array(
"allnum" => 0,
"allsub" => 0
);
foreach ($request['data'] as $post) {
$redis = Common::redis();
// 商品详情
$goods = model('app\api\model\wanlshop\groups\Goods')
->where('id', $post['goods_id'])
->field('id,shop_id,shop_category_id,title,image,
is_ladder,is_alone,is_discount,discount_type,discount,
stock,freight_id,sales')
->find();
// 获取SKU
$sku = model('app\api\model\wanlshop\groups\GoodsSku')
->where('id', $post['sku_id'])
->field('id,goods_id,difference,price,market_price,stock,weigh')
->find();
// 1.1.2升级 判断是否超出库存
$sku_key = 'groups_'.$sku['goods_id'].'_'.$sku['id'];
if($post['number'] > $redis->llen("{$sku_key}")){
$this->error("系统繁忙,请稍后抢购!");
}
// 判断团购
if($post['type'] === 'group'){
// 判断是否阶梯团
if($goods['is_ladder'] === 1){
$ladder = model('app\api\model\wanlshop\groups\Ladder')
->where(['id' => $post['ladder_id']])
->field('id,people_num,discount')
->find();
if($ladder){
$price = bcdiv(bcmul($sku['price'], $ladder['discount'], 2), 100, 2);
// 团购阶梯
$goods['ladder'] = $ladder;
$goods['groupType'] = 'ladder';
}else{
$this->error(__('查询团购阶梯失败'));
}
}else{
$price = $sku['price'];
$goods['groupType'] = 'group';
}
}else{
if($goods['is_alone'] === 0){
$this->error(__('订单暂时不支持单独购买'));
}
$price = $sku['market_price'];
$goods['groupType'] = 'alone';
}
$goods['groups_id'] = $post['groups_id'];
// 获取快递及价格
$goods['freight'] = $this->freight($goods['freight_id'], $sku['weigh'], $post['number'], $address['city']);
// 获取SKU
$goods['sku'] = $sku;
// 数量
$goods['number'] = $post['number'];
// 格式化
if (empty($map[$goods['shop_id']])) {
$order[] = array(
"shop_id" => $goods['shop_id'],
"shop_name" => $goods->shop ? $goods->shop->visible(['shopname'])['shopname']:[],
"products" => [$goods],
"coupon" => [],
"freight" => [$goods['freight']],
"number" => $goods['number'],
"sub_price" => bcmul($price, $goods['number'], 2)
);
$map[$goods['shop_id']] = $goods;
} else {
// 追加1-*
foreach ($order as $key => $value) {
if ($value['shop_id'] == $goods['shop_id']) {
array_push($order[$key]['products'], $goods);
array_push($order[$key]['freight'], $goods['freight']);
$order[$key]['number'] += $post['number'];
$order[$key]['sub_price'] = bcadd($order[$key]['sub_price'], bcmul($price, $post['number'], 2), 2);
break;
}
}
}
// 所有店铺统计
$statis['allnum'] += $goods['number'];
}
// 获取运费策略-店铺循环
foreach ($order as $key => $value) {
$config = model('app\api\model\wanlshop\ShopConfig')
->where('shop_id',$value['shop_id'])
->find();
if($config){
if($config['freight'] == 0){
// 运费叠加
$order[$key]['freight'] = [
'id' => $value['freight'][0]['id'],
'name' => '运费叠加',
'price' => number_format(array_sum(array_column($value['freight'],'price')), 2)
];
}else if($config['freight'] == 1){
// 以最低结算
array_multisort(array_column($value['freight'],'price'),SORT_ASC,$value['freight']);
$order[$key]['freight'] = [
'id' => $value['freight'][0]['id'],
'name' => $value['freight'][0]['name'],
'price' => number_format($value['freight'][0]['price'], 2)
];
}else if($config['freight'] == 2){
// 以最高结算
array_multisort(array_column($value['freight'],'price'),SORT_DESC,$value['freight']);
$order[$key]['freight'] = [
'id' => $value['freight'][0]['id'],
'name' => $value['freight'][0]['name'],
'price' => number_format($value['freight'][0]['price'], 2)
];
}
$order[$key]['order_price'] = $order[$key]['sub_price'];
// 2020年9月19日12:10:59 添加快递价格备份,用于还原运费
$order[$key]['freight_price_bak'] = number_format($order[$key]['freight']['price'], 2);
// 1.0.8升级
$order[$key]['sub_price'] = bcadd($order[$key]['sub_price'], $order[$key]['freight']['price'], 2);
$statis['allsub'] = bcadd($statis['allsub'], $order[$key]['sub_price'], 2);
}else{
$this->error(__('商家未配置运费组策略,暂不支持下单'));
}
}
// 传递Token
$datalist['token'] = Common::creatToken('orderToken_'. $this->auth->id);
// 地址
$datalist['addressData'] = $address;
// 订单
$datalist['orderData']['lists'] = $order;
$datalist['orderData']['statis'] = $statis;
$this->success('ok', $datalist);
} else {
$this->error(__('非法请求'));
}
}
/**
* 提交订单
*
* @ApiSummary (WanlShop 订单接口提交订单)
* @ApiMethod (POST)
*
* @param string $data 数组
*/
public function addOrder()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$result = false;
$params = $this->request->post();
// 验证Token
if(array_key_exists('token', $params)){
if(!Common::checkToken($params['token'], 'orderToken_'. $this->auth->id)){
$this->error(__('页面安全令牌已过期!请重返此页'));
}
}else{
$this->error(__('非法提交,未传入Token'));
}
$user_id = $this->auth->id;
$addressList = [];
$goodsList = [];
$groupsList = [];
$payList = [];
if(array_key_exists('address_id',$params['order'])){
$address_id = $params['order']['address_id']; // 地址ID
}else{
$this->error(__('请点击上方添加收货地址'));
}
// 判断订单是否合法
if(array_key_exists('lists',$params['order'])){
$lists = $params['order']['lists'];
if(!isset($lists) && count($lists) == 0){
$this->error(__('订单繁忙ERR001:请返回商品详情重新提交订单'));
}
}else{
$this->error(__('订单繁忙ERR002:请返回商品详情重新提交订单'));
}
// 查询地址
$address = model('app\api\model\wanlshop\Address')
->where(['id' => $address_id,'user_id' =>$user_id])
->find();
if(!isset($address)){
$this->error(__('地址异常,没有找到该地址'));
}
// 数据库事务操作
Db::startTrans();
try {
// 遍历已店铺分类列表
foreach ($lists as $item) {
// 1.0.6升级 修复跨店累加
$priceAll = 0; // 总价格
$numberAll = 0; // 总数量
$freightALL = [];
$coupon_price = 0; //优惠券金额
$discount_price = 0; // 优惠金额,因为后续版本涉及到活动减免,所以优惠金额要单独拎出来
// 获取店铺ID
$shop_id = $item['shop_id'];
// 查询店铺配置
$config = model('app\api\model\wanlshop\ShopConfig')
->where('shop_id', $shop_id)
->find();
// 如果不存在,按照累计运费
if(!$config){
$config['freight'] = 0;
}
// 生成订单
$order = new \app\api\model\wanlshop\groups\Order;
$order->freight_type = $config['freight'];
$order->user_id = $user_id;
$order->shop_id = $shop_id;
$order->order_no = $shop_id.$user_id;
if(isset($item['remarks'])){
$order->remarks = $item['remarks'];
}
// 2020年9月19日 05:30:10 新增优惠券功能
// 2021年3月04日 06:54:11 修改优惠券逻辑
$coupon = model('app\api\model\wanlshop\CouponReceive')
->where(['id' => $item['coupon_id'], 'user_id' => $user_id, 'shop_id' => $shop_id])
->find();
$order->coupon_id = $coupon ? $coupon['id'] : 0;
// 要补充活动ID
if($order->save()){
// 计算订单价格
foreach ($item['products'] as $data){
$redis = Common::redis();
// 查询商品 1.2.0升级
$goods = model('app\api\model\wanlshop\groups\Goods')
->where(['id' => $data['goods_id'], 'status' => 'normal'])
->find();
// 判断是否为阶梯拼团
$isLadder = false;
if($goods['is_ladder'] === 1 && $data['groupType'] === 'ladder'){
$ladder = model('app\api\model\wanlshop\groups\Ladder')->get($data['ladder_id']);
if($ladder){
$isLadder = true;
}else{
throw new Exception('查询团购阶梯失败');
}
}
// 获取sku
$sku = model('app\api\model\wanlshop\groups\GoodsSku')->get($data['sku_id']);
// 1.1.2升级
$sku_key = 'groups_'.$sku['goods_id'].'_'.$sku['id'];
// 1.1.0升级
if(!$goods) throw new Exception('对不起当前商品不存在或已下架!');
// 效验shop_id是否正确 1.1.2升级
if($goods['shop_id'] != $shop_id) throw new Exception('网络异常SHOPID错误!');
// 1.1.10升级 判断前端商品数量0
$data['number'] = (int)$data['number'];
if($sku['stock'] <= 0){
throw new Exception("商品被抢光了");
}else if($sku['stock'] < $data['number']){
throw new Exception("库存不足");
}else if($data['number'] <= 0){
throw new Exception("操作异常");
}
// 库存计算方式:porder=下单减库存,payment=付款减库存
if($goods['stock'] == 'porder'){
// 1.1.2升级
if($data['number'] > $redis->llen("{$sku_key}")){
throw new Exception('系统繁忙,请稍后抢购!');
}else{
for ($i = 0; $i < $data['number']; $i ++) {
$redis->rpop("{$sku_key}");
}
$sku->setDec('stock', $data['number']); // 1.0.3升级
}
}
$group_no = '';
// 判断是否支持直购
if($data['groupType'] === 'alone'){
if($goods['is_alone'] === 0){
throw new Exception('订单暂时不支持单独购买');
}
$goodsPrice = $sku['market_price'];
}else{
// 查询限制 1.1.0升级
if($goods['purchase_limit'] != 0){
$orderGoodsConunt = model('app\api\model\wanlshop\groups\OrderGoods')
->where(['goods_id' => $data['goods_id'], 'user_id' => $this->auth->id])
->count();
if($orderGoodsConunt >= $goods['purchase_limit']){
throw new Exception('此商品每个ID仅可购买'.$goods['purchase_limit'].'件,你已购买过'. $orderGoodsConunt .'件');
}
}
// 判断参团权限 如果参团存
if((int)$data['groups_id'] !== 0){
// 判断权限
$joinGroups = model('app\api\model\wanlshop\groups\Groups')->get($data['groups_id']);
// 获取其他团的拼团人数
if($joinGroups['group_type'] === 'ladder'){
$ladder = model('app\api\model\wanlshop\groups\Ladder')->get($joinGroups['ladder_id']);
$data['groupType'] = 'ladder';
if(!$ladder){
throw new Exception('查询团购阶梯失败');
}
}else{
$isLadder = false;
}
// 判断状态
if($joinGroups['state'] !== 'start'){
$joinGroupsText = ['ready' => '准备中','success' => '已成团','fail' => '拼团关闭','auto' => '已成团'][$joinGroups['state']];
throw new Exception('参与拼单失败,因选择的团'.$joinGroupsText);
}
// 判断拼自己的团
if($joinGroups['user_id'] === $this->auth->id){
throw new Exception("参与拼单失败,不可拼自己的团");
}
// 判断是否超团
if(model('app\api\model\wanlshop\groups\Team')->where(['group_no' => $joinGroups['group_no']])->count() >= $joinGroups['people_num']){
throw new Exception("参与拼单失败,因拼团已完成");
}
$group_no = $joinGroups['group_no'];
}else{
$group_no = date('YmdHis') . rand(10000000,99999999);
// 新建团
$groupsList[] = [
'group_no' => $group_no,
'user_id' => $this->auth->id,
'shop_id' => $shop_id,
'goods_id' => $goods['id'],
// 'goods_sku_id' => $sku['id'],
'group_type' => $data['groupType'], // 拼团类型
'is_ladder' => $goods['is_ladder'], // 是否阶梯
'ladder_id' => $isLadder ? $ladder['id'] : 0, // 阶梯ID
'people_num' => $isLadder ? $ladder['people_num'] : $goods['people_num'], //成团人数
'state' => 'ready', // 未开始
'validitytime' => time() + $goods['group_hour'] * 60 * 60 // 拼团有效期
];
}
// 查询团购阶梯
if($data['groupType'] === 'ladder'){
$goodsPrice = bcdiv(bcmul($sku['price'], $ladder['discount'], 2), 100, 2);
}else if($data['groupType'] === 'group' ){
$goodsPrice = $sku['price'];
}else{
throw new Exception("非法访问");
}
}
// 生成运费
$freight = $this->freight($goods['freight_id'], $sku['weigh'], $data['number'], $address['city']);
// 商品列表 actual_payment
$goodsList[] = [
'order_id' => $order->id, // 获取自增ID
'goods_id' => $goods['id'],
'user_id' => $this->auth->id,
'shop_id' => $shop_id,
'title' => $goods['title'],
'image' => $goods['image'],
// 拼团类型
'group_type' => $data['groupType'],
'group_no' => $group_no,
'is_alone' => $goods['is_alone'], // 是否单购是
'is_ladder' => $goods['is_ladder'], // 开启阶梯团
'ladder_id' => $isLadder ? $ladder['id'] : 0,
'people_num' => $isLadder ? $ladder['people_num'] : $goods['people_num'], // 组团人数
'purchase_limit' => $goods['purchase_limit'], // 购买次数限制
'group_hour' => $goods['group_hour'], // 组团限时(整数小时)
// 商品规格
'goods_sku_sn' => $sku['sn'],
'goods_sku_id' => $sku['id'],
'difference' => join(',', $sku['difference']),
'group_price' => $goodsPrice, // 团购价格
'market_price' => $sku['market_price'], // 市场价
'price' => $sku['price'], // 原价
'freight_price' => $freight['price'], //快递价格
'discount_price' => 0, // 优惠金额
'actual_payment' => bcmul($goodsPrice, $data['number'], 2), // 1.0.6修复 实际支付,因为要和总价进行计算
'number' => $data['number']
];
$freightALL[] = $freight;
$priceAll = bcadd($priceAll, bcmul($goodsPrice, $data['number'], 2), 2); // 计算价格
$numberAll += $data['number']; // 计算数量
}
// 计算运费叠加方案
if($config['freight'] == 0){
// 运费叠加
$freight = [
'id' => $freightALL[0]['id'],
'name' => '合并运费',
'price' => array_sum(array_column($freightALL,'price'))
];
}else if($config['freight'] == 1){ // 以最低结算
array_multisort(array_column($freightALL,'price'),SORT_ASC,$freightALL);
$freight = [
'id' => $freightALL[0]['id'],
'name' => $freightALL[0]['name'],
'price' => $freightALL[0]['price']
];
}else if($config['freight'] == 2){ // 以最高结算
array_multisort(array_column($freightALL,'price'),SORT_DESC,$freightALL);
$freight = [
'id' => $freightALL[0]['id'],
'name' => $freightALL[0]['name'],
'price' => $freightALL[0]['price']
];
}
$freight_price = $freight['price']; //快递金额
$price = bcadd($priceAll, $freight_price, 2); // 总价格
// 如果优惠券存在
if($coupon)
list($price, $coupon_price, $freight_price, $discount_price, $goodsList)
= $this->coupon($coupon, $goodsList, $priceAll, $freight_price, $order->id);
// 生成支付
$payList[] = [
'user_id' => $user_id,
'shop_id' => $shop_id,
'order_id' => $order->id,
'order_no' => $order->order_no,
'pay_no' => $order->order_no,
'type' => 'groups', // 1.0.8升级
'price' => $price <= 0 ? 0.01 : $price, // 支付价格,系统要求至少支付一分钱
'order_price' => $priceAll, // 订单总金额
'coupon_price' => $coupon_price, // 优惠券金额
'freight_price' => $freight_price, // 快递费
'discount_price' => $discount_price, // 优惠金额
'number' => $numberAll
];
// 生成地址
$addressList[] = [
'user_id' => $user_id,
'shop_id' => $shop_id,
'order_id' => $order->id,
'name' => $address['name'],
'mobile' => $address['mobile'],
'address' => $address['province'].'/'.$address['city'].'/'.$address['district'].'/'.$address['address'],
'address_name' => $address['address_name'],
'location' => $address['location']
];
}else{
throw new Exception("网络繁忙,创建订单失败!");
}
}
model('app\api\model\wanlshop\groups\OrderAddress')->saveAll($addressList);
model('app\api\model\wanlshop\groups\OrderGoods')->saveAll($goodsList);
model('app\api\model\wanlshop\groups\Groups')->saveAll($groupsList);
$result = model('app\api\model\wanlshop\Pay')->saveAll($payList);
Db::commit();
} catch (PDOException $e) {
Db::rollback();
$this->error($e->getMessage());
} catch (Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
if ($result !== false) {
$this->success('返回成功', [
'list' => $result,
'token' => Common::creatToken('orderToken_'. $this->auth->id)
]);
} else {
$this->error(__('订单异常,请返回重新下单'));
}
} else {
$this->error(__('非法请求'));
}
}
/**
* 订单状态码(方法内使用)
*
* @ApiSummary (WanlShop 返回订单状态码)
* @ApiMethod (POST)
*
* @param string $id 订单ID
*/
private function getOrderState($id = 0)
{
//设置过滤方法
$this->request->filter(['strip_tags']);
$order = model('app\api\model\wanlshop\groups\Order')
->where(['id' => $id, 'user_id' => $this->auth->id])
->find();
return $order['state'];
}
/**
* 拼团 获取优惠券后金额 内部方法
* 1.0.5升级
* @param string $coupon 优惠券数据
* @param string $goodsList 商品列表
* @param string $priceAll 订单总价格
* @param string $freight_price 运费价格
* @param string $order_id 订单ID
*/
private function coupon($coupon = [], $goodsList = [], $priceAll = 0, $freight_price = 0, $order_id = 0)
{
// 判断是否可用
if($priceAll >= $coupon['limit']){
if($coupon['type'] == 'reduction' || ($coupon['type'] == 'vip' && $coupon['usertype'] == 'reduction')){
$coupon_price = $coupon['price'];
}
if($coupon['type'] == 'discount' || ($coupon['type'] == 'vip' && $coupon['usertype'] == 'discount')){
// 排除异常折扣,还原百分之
$discount = $coupon['discount'] > 10 ? bcdiv($coupon['discount'], 100, 2) : bcdiv($coupon['discount'], 10, 2);
// 优惠金额 = 订单金额 - 订单金额 * 折扣
$coupon_price = bcsub($priceAll, bcmul($priceAll, $discount, 2), 2);
}
if($coupon['type'] == 'shipping'){
$coupon_price = $freight_price;
$freight_price = 0;
}
// 总优惠金额
$paycoupon = 0;
// 总实际支付金额
$payment = 0;
// 更新商品列表
$newGoodsList = [];
foreach ($goodsList as $row) {
// 1.1.9 升级 修复阶梯拼团优惠券异常
$price = $row['group_type'] == 'ladder'? bcmul($row['group_price'], $row['number'], 2) : bcmul($row['price'], $row['number'], 2);
$discount_price = round($coupon_price * ( $price / $priceAll ), 2); // 优惠金额
// 1.0.8升级,修复包邮
$actual_payment = $coupon['type'] === 'shipping' ? $price : bcsub($price, $discount_price, 2);
//优惠价格
$row['discount_price'] = $discount_price;
// 实际支付 1.0.9升级
$row['actual_payment'] = $actual_payment <= 0 ? '0.01' : $actual_payment;
// 1.0.8升级
$paycoupon = bcadd($paycoupon, $discount_price, 2);
$payment = bcadd($payment, $actual_payment, 2);
$row['freight_price'] = $freight_price;
$newGoodsList[] = $row;
}
// 更新已使用数量
model('app\api\model\wanlshop\Coupon')
->where(['id' => $coupon['coupon_id']])
->setInc('usenum');
// 修改该优惠券状态 已用
$coupon->allowField(true)->save(['state' => 2]);
//总金额 = 总优惠后金额 + 运费
return [bcadd($payment, $freight_price, 2), $paycoupon, $freight_price, $paycoupon, $newGoodsList];
}else{
model('app\api\model\wanlshop\groups\Order')->destroy($order_id);
$this->error('订单金额'.$priceAll.'元,不满'.$coupon['limit'].'元');
}
}
/**
* 获取运费模板和子类 内部方法
* @param string $id 运费ID
* @param string $weigh 商品重量
* @param string $number 商品数量
* @param string $city 邮递城市
*/
private function freight($id = null, $weigh = null, $number = 0, $city = null)
{
// 运费模板
$data = model('app\api\model\wanlshop\ShopFreight')->where('id', $id)->field('id,delivery,isdelivery,name,valuation')->find();
if(!$data){
$this->error(__('此商品运费模板不存在,暂不支持下单'));
}
$data['price'] = 0;
// 是否包邮:0=自定义运费,1=卖家包邮
if($data['isdelivery'] == 0){
// 获取地址编码 1.1.0升级
$list = model('app\api\model\wanlshop\ShopFreightData')
->where([
['EXP', Db::raw('FIND_IN_SET('.model('app\common\model\Area')->get(['name' => $city])->id.', citys)')],
'freight_id' => $id
])
->find();
// 查询是否存在运费模板数据
if(!$list){
$list = model('app\api\model\wanlshop\ShopFreightData')->get(['freight_id' => $id]);
}
// 计价方式:0=按件数,1=按重量,2=按体积 1.0.2升级
if($data['valuation'] == 0){
if($number <= $list['first']){
$price = $list['first_fee'];
}else{
$additional = $list['additional'] > 0 ? $list['additional'] : 1; //因为要更换vue后台,临时方案,为防止客户填写0
$price = bcadd(bcmul(ceil(($number - $list['first']) / $additional), $list['additional_fee'], 2), $list['first_fee'], 2);
}
}else{
$weigh = $weigh * $number; // 订单总重量
if($weigh <= $list['first']){ // 如果重量小于等首重,则首重价格
$price = $list['first_fee'];
}else{
$additional = $list['additional'] > 0 ? $list['additional'] : 1;
$price = bcadd(bcmul(ceil(($weigh - $list['first']) / $additional), $list['additional_fee'], 2), $list['first_fee'], 2);
}
}
$data['price'] = number_format($price, 2);
}
return $data;
}
}