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.
 
 
 
 
 
 
ymww_backend/application/api/controller/Order.php

608 lines
24 KiB

<?php
namespace app\api\controller;
use app\common\controller\Api;
use app\admin\model\Warehouse;
use app\admin\model\Goods;
use app\admin\model\Order as OrderModel;
use app\admin\model\order\Detail;
use app\admin\model\shopro\user\Address;
use app\admin\model\shopro\user\Coupon as UserCouponModel;
use app\common\service\UserService;
use think\Config;
use app\common\model\User;
use addons\shopro\library\pay\PayService;
use think\Db;
use Yansongda\Pay\Exceptions\GatewayException;
use app\admin\model\transaction\Record;
use think\Log;
use addons\shopro\traits\CouponSend;
/**
* 首页接口
*/
class Order extends Api
{
use CouponSend;
protected $noNeedLogin = ['callback'];
protected $noNeedRight = ['*'];
/**
* 首页
*
*/
public function getWarehouseList()
{
$user = $this->auth->getUserinfo();
$list = model('\app\admin\model\Warehouse')->limit(1)->select();
if (!$list) {
$this->success('succ');
}
$time = time();
foreach ($list as $key => $value) {
if ($value['id'] != $user['warehouse_id']) {
unset($list[$key]);
continue;
}
$value['is_allow_access'] = $this->userIsAllowAccess($user, $value, $time) > 0 ? 1 : 0;
}
$this->success('succ', array_values($list));
}
/**
* 用户是否允许进入仓库
* [userIsAllowAccess description]
* @param [type] $user [description]
* @param [type] $warehouse [description]
* @return [type] [description]
*/
public function userIsAllowAccess($user, $warehouse, $time){
$advance_access_minute = $user['advance_access_minute'] * 60;
$is_allow_access = 0;
//是否在时间范围内
$start = strtotime($warehouse['start']);
$end = strtotime($warehouse['end']);
//仓库限制用户总抢购次数
if ($warehouse['limit_buy_num'] > 0) {
$count = Db::name('user_access_record')->where('user_id', $user['id'])->count();
if ($count > $warehouse['limit_buy_num']) {
$is_allow_access = 0;
return $is_allow_access;
}
}
//提前进场
if ($advance_access_minute > 0 && $user['deadline'] > $time) {
if (($time + $advance_access_minute) >= $start && ($time + $advance_access_minute) <= $end) {
//提前进入次数
$count = Db::name('user_access_record')->where('user_id', $user['id'])->where('is_advance', 1)->count();
if ($user['advance_access_num'] == 0 || $count < $user['advance_access_num']) {
$is_allow_access = 1;
return $is_allow_access;
}
}
}
//正常进场
if ($time >= $start && $time <= $end) {
//正常进入次数
$count = Db::name('user_access_record')->where('user_id', $user['id'])->where('is_advance',0)->count();
if ($user['buy_goods_num_per_day'] == 0 || $count < $user['buy_goods_num_per_day']) {
$is_allow_access = 2;
return $is_allow_access;
}
}
return $is_allow_access;
}
/**
* 商品列表
* [getGoodsList description]
* @return [type] [description]
*/
public function getGoodsList(){
$page = $this->request->post("page", 1);
$limit = $this->request->post("limit", 10);
$warehouse_id = $this->request->post("warehouse_id", 3);
$user = $this->auth->getUserinfo();
$warehouse = Warehouse::where('id', $warehouse_id)->find();
if (!$warehouse) {
$this->error("区域不存在");
}
$is_allow_access = $this->userIsAllowAccess($user, $warehouse, time());
if ($is_allow_access == 0) {
$this->error("不允许进入抢购");
}
$list = Goods::where('warehouse_id', $warehouse_id)->where('goods_type', 1)->order('id', 'desc')->paginate($this->request->param('list_rows', $limit))->each(function ($item, $key){
$warehouse = Warehouse::where('id', $item['warehouse_id'])->find();
$owner = User::where('id', $item['owner_id'])->find();
$item['warehouse'] = $warehouse;
$item['owner'] = $owner;
$item['image'] = cdnurl($item['image'], true);
return $item;
});
$this->success("succ", $list);
}
/**
* 商品列表
* [getGoodsList description]
* @return [type] [description]
*/
public function goodsDetail(){
$id = $this->request->get("id", 1);
$info = Goods::where('id', $id)->find();
if (!$info) {
$this->error("商品不存在");
}
$user = $this->auth->getUserinfo();
$warehouse = Warehouse::where('id', $info['warehouse_id'])->find();
$is_allow_access = $this->userIsAllowAccess($user, $warehouse, time());
if ($is_allow_access == 0) {
$this->error("不允许进入抢购");
}
$warehouse = Warehouse::where('id', $info['warehouse_id'])->find();
$owner = User::where('id', $info['owner_id'])->find();
$info['warehouse'] = $warehouse;
$info['owner'] = $owner;
$info['image'] = cdnurl($info['image'], true);
//写进入记录
$start = date("Y-m-d H:i:s", strtotime($warehouse['start']));
$end = date("Y-m-d H:i:s", strtotime($warehouse['end']));
$code = $start."-".$end;
$info1 = Db::name('user_access_record')->where('warehouse_id', $info['warehouse_id'])->where('user_id', $user['id'])->where('code', $code)->count();
if (!$info1) {
Db::name('user_access_record')->insert(['user_id' => $user['id'],'warehouse_id' => $info['warehouse_id'],'code' => $code, "createtime"=>time(), 'is_advance' => $is_allow_access == 1 ? 1 : 2]);
}
$this->success("succ", $info);
}
/**
* 创建订单
* [createOrder description]
* @return [type] [description]
*/
public function createOrder(){
$address_id = $this->request->post("address_id", 0);
$goods_id = $this->request->post("goods_id", 0);
$num = $this->request->post("num", 1);
$coupon_id = $this->request->post("coupon_id", 0);
$user_id = $this->auth->id;
$address = Address::where('id', $address_id)->where('user_id', $user_id)->find();
if (!$address) {
$this->error("收货地址不存在");
}
$goods = Goods::where('id', $goods_id)->where('status','normal')->find();
if (!$goods) {
$this->error("商品不存在");
}
$order_amount = $goods['price'] * $num;
$coupon_price = 0;
if ($coupon_id) {
// $coupon = UserCouponModel::with('coupon')->where('id', $coupon_id)->where('user_id', $user_id)->find();
// if($order_amount < $coupon['enough']) {
// $this->error("不能使用优惠卷");
// }
// if($coupon['use_time'] > 0) {
// $this->error("优惠卷已使用");
// }
// if(strtotime($coupon['user_end_time']) < time()) {
// $this->error("优惠卷已过期");
// }
// $coupon_price = $coupon['amount'] ?? 0;
}
$pay_amount = $order_amount - $coupon_price;
$order_sn = "ZH".date("YmdHis").rand(1000,9999);
//创建订单
$orderData = [
"buyer_id" => $user_id,
"seller_id" => $goods['owner_id'],
"order_sn" => $order_sn,
"warehouse_id" => $goods['warehouse_id'],
"order_amount" => $order_amount,
"pay_amount" => $pay_amount,
"coupon_price" => $coupon_price,
"coupon_id" => $coupon_id,
"consignee" => $address['consignee'],
"mobile" => $address['consignee'],
"province" => $address['province_name'],
"city" => $address['city_name'],
"district" => $address['district_name'],
"address" => $address['address'],
];
$order = OrderModel::create($orderData);
if ($order === false) {
$this->error("下单失败");
}
$orderDetail = [
"order_id" => $order->id,
"buyer_id" => $user_id,
"seller_id" => $goods['owner_id'],
"goods_id" => $goods['id'],
"goods_name" => $goods['name'],
"goods_image" => $goods['image'],
"goods_price" => $goods['price'],
"num" => $num,
];
$ret = Detail::create($orderDetail);
if ($ret === false) {
$this->error("下单失败");
}
//使用优惠卷
$ret = UserCouponModel::where("id", $coupon_id)->update(['use_order_id' => $order->id, 'use_time' => time()]);
if ($ret === false) {
$this->error("下单失败");
}
//分佣给买家上级
$site = Config::get("site");
$commission = bcmul($order_amount, $site['primary_distribution'] * 0.01, 2);
$obj = new UserService();
$obj->userCommission(0, $this->auth->getUserinfo(), $order_sn, $commission);
//更新商品状态为下架
Goods::where('id', $goods_id)->update(['status' => 'hidden', "updatetime" => time()]);
$this->success("succ");
}
/**
* 卖方订单列表
* [getSellerOrderList description]
* @return [type] [description]
*/
public function getSellerOrderList(){
$user_id = $this->auth->id;
$page = $this->request->get("page", 1);
$limit = $this->request->get("limit", 10);
$status = $this->request->get("status", "");
$where = [];
if ($status != "") {
$where['status'] = ['in', explode(",", $status)];
}
$list = OrderModel::where('seller_id', $user_id)->where($where)->order('id', 'desc')->paginate($this->request->param('list_rows', $limit))->each(function ($item, $key){
$order_goods = Detail::where('order_id', $item['id'])->select();
if ($order_goods) {
foreach ($order_goods as $key => $value) {
$value['goods_image'] = cdnurl($value['goods_image'], true);
}
}
$warehouse = Warehouse::where('id', $item['warehouse_id'])->select();
$item['order_goods'] = $order_goods;
$item['warehouse'] = $warehouse;
return $item;
});
$this->success("succ", $list);
}
/**
* 买方订单列表
* [getBuyerOrderList description]
* @return [type] [description]
*/
public function getBuyerOrderList(){
$user_id = $this->auth->id;
$page = $this->request->get("page", 1);
$limit = $this->request->get("limit", 10);
$status = $this->request->get("status", "");
$where = [];
if ($status != "") {
$where['status'] = ['in', explode(",", $status)];
}
$list = OrderModel::where('buyer_id', $user_id)->where($where)->order('id', 'desc')->paginate($this->request->param('list_rows', $limit))->each(function ($item, $key){
$order_goods = Detail::where('order_id', $item['id'])->select();
if ($order_goods) {
foreach ($order_goods as $key => $value) {
$value['goods_image'] = cdnurl($value['goods_image'], true);
}
}
$warehouse = Warehouse::where('id', $item['warehouse_id'])->find();
$item['order_goods'] = $order_goods;
$item['warehouse'] = $warehouse;
return $item;
});
$this->success("succ", $list);
}
/**
* 订单详情
* [orderDetail description]
* @return [type] [description]
*/
public function orderDetail(){
$user_id = $this->auth->id;
$id = $this->request->get("id", 0);
$info = OrderModel::where('id', $id)->find();
if (!$info) {
$this->success("succ", $info);
}
$order_goods = Detail::where('order_id', $info['id'])->select();
if ($order_goods) {
foreach ($order_goods as $key => $value) {
$value['goods_image'] = cdnurl($value['goods_image'], true);
}
}
$warehouse = Warehouse::where('id', $info['warehouse_id'])->find();
$info['order_goods'] = $order_goods;
$info['warehouse'] = $warehouse;
$info['entrusted_ratio'] = Config::get("site.entrusted_ratio");
$info['entrustment_ratio'] = Config::get("site.entrustment_ratio");
$seller = User::where('id', $info['seller_id'])->field(['id', 'username', 'nickname', 'mobile', 'avatar', 'score','sign_image','sign_status','alipay_image','wechat_image','buy_goods_num_per_day','advance_access_num','bank_realname','bank_mobile','bank_no','bank_address','reason','warehouse_id','advance_access_minute','deadline','pid','total_commission_amount','available_commission_amount'])->find();
$info['seller'] = $seller;
$this->success("succ", $info);
}
/**
* 取消订单
* [cancelOrder description]
* @return [type] [description]
*/
public function cancelOrder(){
$id = $this->request->post("id", 0);
$order = OrderModel::where('id', $id)->find();
if (!$order) {
$this->error("订单不存在");
}
$info = OrderModel::where('id', $id)->update(['status' => -1,'cancel_time' => time()]);
if ($info === false) {
$this->error("取消失败");
}
$detail = Detail::where("order_id", $id)->find();
//上架商品
Goods::where('id', $detail['goods_id'])->update(['status' => 'normal', "updatetime" => time()]);
//分佣给买家上级
$site = Config::get("site");
$commission = bcmul($order['order_amount'], $site['primary_distribution'] * 0.01, 2);
$obj = new UserService();
$obj->userCommission(1, $this->auth->getUserinfo(), $order['order_sn'], -$commission);
$this->success("succ", $info);
}
/**
* 上传支付凭证
* [uploadPayVoucher description]
* @return [type] [description]
*/
public function orderPay(){
$pay_voucher = $this->request->post("pay_voucher", "");
$status = $this->request->post("status", "");
$pay_method = $this->request->post("pay_method", 0);
$id = $this->request->post("id", "");
$info = OrderModel::where('id', $id)->find();
if (!$info) {
$this->error("订单不存在");
}
$upData = ['updatetime' => time()];
if ($pay_voucher) {
$upData['pay_voucher'] = $pay_voucher;
$upData['pay_time'] = time();
$upData['pay_method'] = $pay_method;
$upData['status'] = $status;
} else {
$upData['status'] = $status;
}
$info = OrderModel::where('id', $id)->update($upData);
if ($info === false) {
$this->error("操作失败");
}
$this->success("succ", $info);
}
/**
* 商品上架
* [upGoods description]
* @return [type] [description]
*/
public function payUpGoods(){
$info = get_addon_info('epay');
if(empty($info) || $info['state'] == 0){
$this->error('请到后台插件管理安装《微信支付宝整合》插件');
}
$order_id = $this->request->post("order_id", 0);
$coupon_id = $this->request->post("coupon_id", 0);
$use_commission = $this->request->post("use_commission", 0);
$num = $this->request->post("num", 1);
$user = $this->auth->getUserinfo();
$user_id = $user['id'];
$goods = Detail::where('order_id', $order_id)->find();
if (!$goods) {
$this->error("订单不存在");
}
//商品是否上架
$goods_info = Goods::where('id', $goods['goods_id'])->where('status', 'hidden')->find();
if (!$goods_info) {
$this->error("商品不存在");
}
//判断上架时间,开始前一小时,和结束前一小时,以及活动中不能上架
$time = time();
$warehouse = Warehouse::where('id', $goods_info['warehouse_id'])->find();
$start = strtotime($warehouse['start']);
$end = strtotime($warehouse['end']);
$after_activity_hour = $warehouse['after_activity_hour'] * 3600;
$before_activity_hour = $warehouse['before_activity_hour'] * 3600;
// var_dump($start);
// var_dump(($time > $start && $time < $end));
// var_dump((($start - $time) > 0 && (($start - $time) < $before_activity_hour)));
// var_dump((($time - $end) > 0 && (($time - $end) < $after_activity_hour)));
// exit();
if ((($start - $time) > 0 && (($start - $time) < $before_activity_hour)) || (($time - $end) > 0 && (($time - $end) < $after_activity_hour)) || ($time > $start && $time < $end)) {
$this->error("该时间段不能上架");
}
$order_amount = $goods['goods_price'] * $goods['num'] ;
$coupon_price = 0;
if ($coupon_id) {
$coupon = UserCouponModel::with('coupon')->where('id', $coupon_id)->where('user_id', $user_id)->find();
// if($order_amount < $coupon['enough']) {
// $this->error("不能使用优惠卷");
// }
if($coupon['use_time'] > 0) {
$this->error("优惠卷已使用");
}
if(strtotime($coupon['user_end_time']) < time()) {
$this->error("优惠卷已过期");
}
$coupon_price = $coupon['amount'] ?? 0;
OrderModel::where("id", $order_id)->update(['coupon_id' => $coupon_id, 'coupon_price' => $coupon_price]);
}
$pay_sn = "NO".date("YmdHis").rand(1000,9999);
$fee = bcmul($order_amount, Config::get("site.entrustment_ratio") * 0.01, 2);
$pay_amount = $fee - $coupon_price;
$pay_amount = $pay_amount > 0 ? $pay_amount : 0;
$pay_method = "mp";
$order_data = [
'order_id' => $order_id,
'out_trade_no' => $pay_sn,
'total_amount' => $fee,
'coupon_amount' => $coupon_price,
'pay_amount' => $pay_amount,
'status' => 0,
'user_id' => $user_id,
'create_time' => time(),
];
$params = [
'amount' => $pay_amount,
'orderid' => $pay_sn,
'type' => "wechat",
'title'=> "商品支付",
'notifyurl' => $this->request->domain()."/api/order/callback",
'returnurl'=>"",
'method'=>$pay_method,
'openid' => $user['openid'],
];
$goods_price = bcmul($goods['goods_price'], (Config::get("site.entrusted_ratio") * 0.01 + 1), 2);
// var_dump($order_data);
// var_dump($params);
// exit();
if ($use_commission) {
if ($pay_amount < $user['available_commission_amount']) {
$order_data['pay_source'] = 0;//佣金支付
$order_data['status'] = 1;//佣金支付
Db::name("pay_record")->insert($order_data);
//修改商品价格和归属人
Goods::where('id', $goods['goods_id'])->update(['price' => $goods_price, 'owner_id' => $user_id,"updatetime" => time(),'status'=>'normal']);
//写入用户收益
$profit = bcmul($goods['goods_price'], (Config::get("site.entrusted_ratio") - Config::get("site.entrustment_ratio")) * 0.01, 2);
Record::create(["user_id" => $user_id, "type" => 2, "item_id" => $order_id,"amount"=> $profit]);
//修改用户可用佣金
User::where('id', $user_id)->update(['available_commission_amount' => $user['available_commission_amount'] - $pay_amount,"profit_amount" =>$profit, "updatetime" => time()]);
//更新订单信息
OrderModel::where("id", $order_id)->update(['status' => 7]);
Detail::where("order_id", $order_id)->update(['commission_price' => $goods_price, "fee" => $fee, "dikou_price" => $pay_amount]);
//使用优惠卷
if ($coupon_id) {
UserCouponModel::where('id', $coupon_id)->update(['use_order_id'=>$order_id, "use_time"=>time()]);
}
$this->success('succ', ['pay_data' => 1]);
} else {
if ($user['available_commission_amount'] > 0) {
//写佣金支付
$order_data['pay_source'] = 0;//佣金支付
$order_data['pay_amount'] = $user['available_commission_amount'];
Db::name("pay_record")->insert($order_data);
//微信支付流水号
$pay_sn = "NO".date("YmdHis").rand(1000,9999);
}
//写微信支付
$order_data['pay_source'] = 1;//微信支付
$order_data['out_trade_no'] = $pay_sn;//微信支付
$order_data['pay_amount'] = $pay_amount - $user['available_commission_amount'];
Db::name("pay_record")->insert($order_data);
//修改微信支付信息
$params['amount'] = $order_data['pay_amount'];
$params['orderid'] = $pay_sn;
Detail::where("order_id", $order_id)->update(['commission_price' => $goods_price, "fee" => $fee, "dikou_price" => $user['available_commission_amount']]);
}
}
//$params['amount'] = 0.01;
try {
$result = \addons\epay\library\Service::submitOrder($params);
}catch (GatewayException $e){
$this->error($e->getMessage());
}
$this->success('', ['pay_data' => $result]);
}
/**
* 支付回调
* [callback description]
* @return function [description]
*/
public function callback(){
$pay = \addons\epay\library\Service::checkNotify("wechat");
if (!$pay) {
echo '签名错误';
return;
}
$data = $pay->verify();
try {
Log::record("支付回调数据:".$data);
$out_trade_no = explode("_",$data['out_trade_no']);
if(empty($out_trade_no[0])){
return;
}
$order_no = $out_trade_no[0];
$pay_record = Db::name("pay_record")->where('out_trade_no', $order_no)->where('status', 0)->find();
if (!$pay_record) {
echo $pay->success();
exit();
}
$goods = Detail::where('order_id', $pay_record['order_id'])->find();
if (!$goods) {
echo $pay->success();
}
$user_id = $pay_record['user_id'];
$order_id = $pay_record['order_id'];
$user = User::where('id', $user_id)->find();
//修改支付记录
Db::name("pay_record")->where('order_id', $order_id)->update(['status'=>1, "update_time"=>time()]);
//修改商品价格和归属人
$goods_price = bcmul($goods['goods_price'], (Config::get("site.entrusted_ratio") * 0.01 + 1), 2);
Goods::where('id', $goods['goods_id'])->update(['price' => $goods_price, 'owner_id' => $user_id,"updatetime" => time(),"status"=>'normal']);
//写入用户收益
$profit = bcmul($goods['goods_price'], (Config::get("site.entrusted_ratio") - Config::get("site.entrustment_ratio")) * 0.01, 2);
Record::create(["user_id" => $user_id, "type" => 2, "item_id" => $order_id,"amount"=> $profit]);
//修改用户可用佣金
User::where('id', $user_id)->update(['available_commission_amount' => $user['available_commission_amount'] - $goods['dikou_price'],"profit_amount" => $user['profit_amount'] + $profit, "updatetime" => time()]);
//更新订单状态
OrderModel::where("id", $order_id)->update(['status' => 7]);
//使用优惠卷
$order_info = OrderModel::where("id", $order_id)->find();
if ($order_info['coupon_id']) {
UserCouponModel::where('id', $order_info['coupon_id'])->update(['use_order_id'=>$order_id, "use_time"=>time()]);
}
} catch (Exception $e) {
Log::record("支付回调报错:".$e->getMessage());
}
echo $pay->success();
exit();
}
}