Files
2019-02-28 19:48:21 +08:00

732 lines
24 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* tpshop
* ============================================================================
* 版权所有 2015-2027 深圳搜豹网络科技有限公司,并保留所有权利。
* 网站地址: http://www.tp-shop.cn
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* ============================================================================
* Author: dyr
* Date: 2016-08-23
*/
namespace app\common\model;
use think\Model;
use think\Db;
use app\common\logic\VirtualLogic;
/**
* @package Home\Model
*/
class Order extends Model
{
public function shop()
{
return $this->hasOne('shop', 'shop_id', 'shop_id');
}
public function shopOrder()
{
return $this->hasOne('ShopOrder', 'order_id', 'order_id');
}
//获取所有订单商品
public function OrderGoods()
{
return $this->hasMany('OrderGoods', 'order_id', 'order_id');
}
//订单商品总数
public function countGoodsNum()
{
return $this->hasMany('OrderGoods', 'order_id', 'order_id')->sum('goods_num');
}
/**
* 获取订单操作记录
* @return \think\model\relation\HasMany
*/
public function OrderAction()
{
return $this->hasMany('OrderAction', 'order_id', 'order_id')->order('action_id desc');
}
/**
* 获取订单发货单
* @return \think\model\relation\HasMany
*/
public function DeliveryDoc()
{
return $this->hasMany('DeliveryDoc', 'order_id', 'order_id');
}
public function users()
{
return $this->hasone('users', 'user_id', 'user_id')->field('user_id,nickname');
}
/**
* 获取虚拟订单的兑换码
* @return \think\model\relation\HasMany
*/
public function VrOrderCode()
{
return $this->hasMany('vr_order_code', 'order_id', 'order_id');
}
/**
* 获取订单状态对应的中文
* @param $value
* @param $data
* @return mixed
*/
public function getOrderStatusDetailAttr($value, $data)
{
$data_status_arr = C('ORDER_STATUS_DESC');
// 货到付款
if ($data['pay_code'] == 'cod') {
if (in_array($data['order_status'], array(0, 1)) && $data['shipping_status'] == 0) {
return $data_status_arr['WAITSEND']; //'待发货',
}
} else {
// 非货到付款
if ($data['pay_status'] == 0 && $data['order_status'] == 0) {
return $data_status_arr['WAITPAY']; //'待支付',
}
if($data['pay_status'] == 2 && $data['order_status'] == 0){
return '部分支付';
}
if ($data['pay_status'] == 1 && in_array($data['order_status'], array(0, 1)) && $data['shipping_status'] != 1) {
if ($data['prom_type'] == 5) { //虚拟商品
return $data_status_arr['WAITRECEIVE']; //'待收货',
} elseif ($data['prom_type'] == 6) {
if ($data['order_status'] == 0) {
return '待处理';
} else {
if ($data['shop_id'] > 0) {
return '待自提';
}
return $data_status_arr['WAITSEND']; //'待发货',
}
} else {
if ($data['shop_id'] > 0) {
return '待自提';
}
if($data['shipping_status']==0 && $data['pay_status'] == 1){
return $data_status_arr['WAITSEND']; //'待发货',
}
}
}
}
if (($data['shipping_status'] == 1) && ($data['order_status'] == 1)) {
return $data_status_arr['WAITRECEIVE']; //'待收货',
}
if (($data['shipping_status'] == 2) && in_array($data['order_status'],[1,2,4])) {
return $data_status_arr['PORTIONSEND']; //'部分发货',
}
if ($data['order_status'] == 2) {
return $data_status_arr['WAITCCOMMENT']; //'待评价',
}
if ($data['order_status'] == 3) {
return $data_status_arr['CANCEL']; //'已取消',
}
if ($data['order_status'] == 4) {
return $data_status_arr['FINISH']; //'已完成',
}
if ($data['order_status'] == 5) {
return $data_status_arr['CANCELLED']; //'已作废',
}
return $data_status_arr['OTHER'];
}
/**
* 只有在订单为拼团才有用:prom_type = 6
*/
public function teamActivity()
{
return $this->hasOne('TeamActivity', 'team_id', 'prom_id');
}
public function preSell()
{
return $this->hasOne('PreSell', 'pre_sell_id', 'prom_id');
}
public function teamFollow()
{
return $this->hasOne('TeamFollow', 'order_id', 'order_id');
}
/**
* 是否虚拟订单获取虚拟订单的code码
*/
public function getVrordersCodeAttr($value, $data)
{
if($data['prom_type'] == 5){
$VirtualLogic = new VirtualLogic();
$virtual = $VirtualLogic->check_virtual_code($data);
return $virtual['vrorders'];
}
return [];
}
/**
* 订单详细收货地址
* @param $value
* @param $data
* @return string
*/
public function getFullAddressAttr($value, $data)
{
$province = Db::name('region')->where(['id' => $data['province']])->value('name');
$city = Db::name('region')->where(['id' => $data['city']])->value('name');
$district = Db::name('region')->where(['id' => $data['district']])->value('name');
$address = $province . '' . $city . '' . $district . '' . $data['address'];
return $address;
}
/**
* 订单是否可拆单
* @param $value
* @param $data
* @return bool
*/
public function getIsSplitAttr($value, $data)
{
if ($data['shop_id'] > 0) {
return false;
}
if ($data['prom_type'] == 4) {
return false;
}
if ($data['order_status'] < 2) {
$goods_num = Db::name('order_goods')->where('order_id', $data['order_id'])->sum('goods_num');
if ($goods_num > 1) {
return true;
}
}
return false;
}
public function teamFound()
{
return $this->hasOne('TeamFound', 'order_id', 'order_id');
}
/**
* 获取当前可操作的按钮(后台)
* @param $data
* @return array
*/
public function getAdminOrderButtonAttr($value, $data)
{
/*
* 操作按钮汇总 :付款、设为未付款、确认、取消确认、无效、去发货、确认收货、申请退货
*
*/
$os = $data['order_status'];//订单状态
$ss = $data['shipping_status'];//发货状态
$ps = $data['pay_status'];//支付状态
$pt = $data['prom_type'];//订单类型0默认1抢购2团购3优惠4预售5虚拟6拼团
$btn = array();
if ($data['pay_code'] == 'cod') {
if ($os == 0 && $ss == 0) {
if ($pt != 6) {
$btn['confirm'] = '确认';
}
} elseif ($os == 1 && ($ss == 0 || $ss == 2)) {
$btn['delivery'] = '去发货';
if ($pt != 6) {
$btn['cancel'] = '取消确认';
}
} elseif ($ss == 1 && $os == 1 && $ps == 0) {
$btn['pay'] = '付款';
} elseif ($ps == 1 && $ss == 1 && $os == 1) {
if ($pt != 6) {
$btn['pay_cancel'] = '设为未付款';
}
}
} else {
if ($ps == 0 && $os == 0 || $ps == 2) {
$btn['pay'] = '付款';
} elseif ($os == 0 && $ps == 1) {
if ($pt != 6) {
$btn['pay_cancel'] = '设为未付款';
$btn['confirm'] = '确认';
}
if ($pt == 4) {
$pre_sell = Db::name('pre_sell')->where('pre_sell_id', $data['prom_id'])->find();
if ($pre_sell['is_finished'] == 2) {
$btn['confirm'] = '确认';
}
}
} elseif ($os == 1 && $ps == 1 && ($ss == 0 || $ss == 2)) {
if ($pt != 6) {
$btn['cancel'] = '取消确认';
}
$btn['delivery'] = '去发货';
}
}
if ($ss == 1 && $os == 1 && $ps == 1) {
// $btn['delivery_confirm'] = '确认收货';
$btn['refund'] = '申请退货';
} elseif ($os == 2 || $os == 4) {
$btn['refund'] = '申请退货';
} elseif ($os == 3 || $os == 5) {
$btn['remove'] = '移除';
}
if ($os != 5) {
$btn['invalid'] = '无效';
}
return $btn;
}
/**
* 支付按钮
* @param $value
* @param $data
* @return int
*/
public function getPayBtnAttr($value, $data)
{
// 三个月(90天)内的订单才可以进行有操作按钮. 三个月(90天)以外的过了退货 换货期, 即便是保修也让他联系厂家, 不走线上
if (time() - $data['add_time'] > (86400 * 90)) {
return 0;
}
// 货到付款,虚拟订单不会为cod
if ($data['pay_code'] == 'cod') {
return 0;
}
// 待支付
if ($data['pay_status'] == 0 && $data['order_status'] == 0) {
return 1; // 去支付按钮
}
return 0;
}
/**
* 取消按钮
* @param $value
* @param $data
* @return int
*/
public function getCancelBtnAttr($value, $data)
{
// 三个月(90天)内的订单才可以进行有操作按钮. 三个月(90天)以外的过了退货 换货期, 即便是保修也让他联系厂家, 不走线上
if (time() - $data['add_time'] > (86400 * 90)) {
return 0;
}
// 货到付款
if ($data['pay_code'] == 'cod') {
if (in_array($data['order_status'], [0, 1]) && $data['shipping_status'] == 0) {
return 1; // 取消按钮 (订单待确认和已确认,未发货情况)
}
}
//(订单已支付待确认和已确认,未发货情况)
if ($data['pay_status'] == 1 && in_array($data['order_status'], [0, 1])) {
//拼团和预售已支付订单不能取消,普通订单已支付未发货能取消,虚拟订单不走这个逻辑
if(!in_array($data['prom_type'], [4, 5, 6]) && $data['shipping_status'] == 0){
return 1;
}
if($data['prom_type'] == 5){
$vr_order_code = Db::name('vr_order_code')->where(['order_id' => $data['order_id']])->find();
if (!empty($vr_order_code)) {
if ($vr_order_code['vr_state'] != 1 && $vr_order_code['refund_lock'] < 1) {
if ($vr_order_code['vr_indate'] > time()) {
return 2; // 已支付取消按钮
}
if ($vr_order_code['vr_indate'] < time() && $vr_order_code['vr_invalid_refund'] == 1) {
return 2; // 已支付取消按钮
}
}
}
}
}
// 待支付
if ($data['pay_status'] == 0 && $data['order_status'] == 0) {
return 1; // 取消按钮
}
return 0;
}
/**
* 确认收货
* @param $value
* @param $data
* @return int
*/
public function getReceiveBtnAttr($value, $data)
{
// 三个月(90天)内的订单才可以进行有操作按钮. 三个月(90天)以外的过了退货 换货期, 即便是保修也让他联系厂家, 不走线上
if (time() - $data['add_time'] > (86400 * 90)) {
return 0;
}
// 货到付款
if ($data['pay_code'] == 'cod') {
if ($data['shipping_status'] == 1 && $data['order_status'] == 1) //待收货
{
return 1; // 确认收货 (已确认,已发货)
}
} else {
if ($data['pay_status'] == 1 && $data['order_status'] == 1 && $data['shipping_status'] == 1) {
return 1; // 确认收货(已支付,已确认,已发货)
}
}
if($data['prom_type'] == 5){
$vr_order_code = Db::name('vr_order_code')->where(['order_id' => $data['order_id']])->find();
if (!empty($vr_order_code)) {
if ($data['pay_status'] == 1 && $data['order_status'] < 2 && $vr_order_code['vr_state'] != 1 && $vr_order_code['refund_lock'] < 1) {
return 1;
}
}
}
return 0;
}
/**
* 评价按钮
* @param $value
* @param $data
* @return int
*/
public function getCommentBtnAttr($value, $data)
{
// 三个月(90天)内的订单才可以进行有操作按钮. 三个月(90天)以外的过了退货 换货期, 即便是保修也让他联系厂家, 不走线上
if (time() - $data['add_time'] > (86400 * 90)) {
return 0;
}
if ($data['order_status'] == 2) {
return 1; // (已收货状态出现评价按钮)
}
return 0;
}
/**
* 查看物流
* @param $value
* @param $data
* @return int
*/
public function getShippingBtnAttr($value, $data)
{
// 三个月(90天)内的订单才可以进行有操作按钮. 三个月(90天)以外的过了退货 换货期, 即便是保修也让他联系厂家, 不走线上
if (time() - $data['add_time'] > (86400 * 90)) {
return 0;
}
if ($data['shipping_status'] > 0 && $data['order_status'] > 1) {
return 1; // 已发货并且已支付
}
return 0;
}
//支付尾款按钮
public function getPayTailBtnAttr($value, $data){
if($data['prom_type'] == 4 && $data['pay_status'] == 2){
$pre_sell = db('pre_sell')->where('pre_sell_id', $data['prom_id'])->find();
if($pre_sell['is_finished'] == 2 && (time() >= $pre_sell['pay_start_time'] && $pre_sell['pay_end_time'] >= time())){
return 1;
}
}
return 0;
}
/**
* 退货按钮 (联系客服)
* @param $value
* @param $data
* @return int
*/
public function getReturnBtnAttr($value, $data)
{
// 三个月(90天)内的订单才可以进行有操作按钮. 三个月(90天)以外的过了退货 换货期, 即便是保修也让他联系厂家, 不走线上
if (time() - $data['add_time'] > (86400 * 90)) {
return 0;
}
if (in_array($data['order_status'], [2, 4]) || (in_array($data['shipping_status'], [1]) && $data['order_status'] == 1 && $data['pay_status']==1)) {
return 1; // 退货按钮 (联系客服)
}
// if (in_array($data['shipping_status'], [1, 2]) && $data['order_status'] == 1) {
// return 1; // 退货按钮 (联系客服)
// }
return 0;
}
/**
* 取消详情
* @param $value
* @param $data
* @return int
*/
public function getCancelInfoAttr($value, $data)
{
// 三个月(90天)内的订单才可以进行有操作按钮. 三个月(90天)以外的过了退货 换货期, 即便是保修也让他联系厂家, 不走线上
if (time() - $data['add_time'] > (86400 * 90)) {
return 0;
}
if ($data['order_status'] == 3 && in_array($data['pay_status'],[1,3,4])) {
return 1; // 取消订单详情
}
return 0;
}
/**废弃,禁止使用 获取订单状态的显示按钮(用户)*/
public function getOrderButtonAttr($value, $data)
{
/**
* 订单用户端显示按钮
* 去支付 AND pay_status=0 AND order_status=0 AND pay_code ! ="cod"
* 取消按钮 AND pay_status=0 AND shipping_status=0 AND order_status=0
* 确认收货 AND shipping_status=1 AND order_status=0
* 评价 AND order_status=1
* 查看物流 if(!empty(物流单号))
*/
$btn_arr = array(
'pay_btn' => 0, // 去支付按钮
'cancel_btn' => 0, // 取消按钮
'receive_btn' => 0, // 确认收货
'comment_btn' => 0, // 评价按钮
'shipping_btn' => 0, // 查看物流
'return_btn' => 0, // 退货按钮 (联系客服)
);
// 三个月(90天)内的订单才可以进行有操作按钮. 三个月(90天)以外的过了退货 换货期, 即便是保修也让他联系厂家, 不走线上
if (time() - $data['add_time'] > (86400 * 90)) {
return $btn_arr;
}
// 货到付款
if ($data['pay_code'] == 'cod') {
if (($data['order_status'] == 0 || $data['order_status'] == 1) && $data['shipping_status'] == 0) {
$btn_arr['cancel_btn'] = 1; // 取消按钮 (联系客服)
}
if ($data['shipping_status'] == 1 && $data['order_status'] == 1) //待收货
{
$btn_arr['receive_btn'] = 1; // 确认收货
$btn_arr['return_btn'] = 1; // 退货按钮 (联系客服)
}
} // 非货到付款
else {
if ($data['pay_status'] == 0 && $data['order_status'] == 0) // 待支付
{
$btn_arr['pay_btn'] = 1; // 去支付按钮
$btn_arr['cancel_btn'] = 1; // 取消按钮
}
if ($data['pay_status'] == 1 && $data['order_status'] < 2 && $data['shipping_status'] == 0) {
if ($data['prom_type'] == 6 || $data['prom_type'] == 4) {
$btn_arr['cancel_btn'] = 0;
} else {
$btn_arr['cancel_btn'] = 1; // 取消按钮
}
}
if ($data['pay_status'] == 1 && $data['order_status'] == 1 && $data['shipping_status'] == 1) {
$btn_arr['receive_btn'] = 1; // 确认收货
}
}
if ($data['order_status'] == 4 || $data['order_status'] == 5) {
$btn_arr['return_btn'] = 1; // 退货按钮 (联系客服)
}
if ($data['order_status'] == 2) {
if ($data['is_comment'] == 0) $btn_arr['comment_btn'] = 1; // 评价按钮
$btn_arr['return_btn'] = 1; // 退货按钮 (联系客服)
}
if ($data['shipping_status'] > 0 && $data['order_status'] == 1) {
$btn_arr['shipping_btn'] = 1; // 查看物流
}
if ($data['shipping_status'] == 2 && $data['order_status'] == 1) {
$btn_arr['return_btn'] = 1; // 退货按钮 (联系客服)
}
// if($data['order_status'] == 3 && ($data['pay_status'] == 1 || $data['pay_status'] == 4)){
// $btn_arr['cancel_info'] = 1; // 取消订单详情
// }
if ($data['order_status'] == 3 && ($data['pay_status'] == 1 || $data['pay_status'] == 4 || $data['pay_status'] == 3)) {
$btn_arr['cancel_info'] = 1; // 取消订单详情
}
return $btn_arr;
}
//废弃,禁止使用 虚拟订单操作按钮
public function getVirtualOrderButtonAttr($value, $data)
{
$vr_order_code = Db::name('vr_order_code')->where(['order_id' => $data['order_id']])->find();
$Virtual_btn_arr = array(
'pay_btn' => 0, // 去支付按钮
'cancel_btn' => 0, // 取消按钮
'receive_btn' => 0, // 确认收货
'comment_btn' => 0, // 评价按钮
);
if ($data['pay_status'] == 0 && $data['order_status'] == 0) { // 待支付
$Virtual_btn_arr['pay_btn'] = 1; // 去支付按钮
$Virtual_btn_arr['cancel_btn'] = 1; //未支付取消按钮
}
if (!empty($vr_order_code)) {
if ($data['pay_status'] == 1 && $data['order_status'] < 2 && $vr_order_code['vr_state'] != 1 && $vr_order_code['refund_lock'] < 1) {
if ($vr_order_code['vr_indate'] > time()) {
$Virtual_btn_arr['cancel_btn'] = 2; // 已支付取消按钮
}
if ($vr_order_code['vr_indate'] < time() && $vr_order_code['vr_invalid_refund'] == 1) {
$Virtual_btn_arr['cancel_btn'] = 2; // 已支付取消按钮
M('vr_order_code')->where(array('order_id' => $data['order_id']))->update(['vr_state' => 2]);
}
$Virtual_btn_arr['receive_btn'] = 1;
}
if ($data['order_status'] == 2) {
if ($data['is_comment'] == 0) $Virtual_btn_arr['comment_btn'] = 1; // 评价按钮
}
}
return $Virtual_btn_arr;
}
public function getAddressRegionAttr($value, $data)
{
$regions = Db::name('region')->where('id', 'IN', [$data['province'], $data['city'], $data['district'], $data['twon']])->order('level desc')->select();
$address = '';
if ($regions) {
foreach ($regions as $regionKey => $regionVal) {
$address = $regionVal['name'] . $address;
}
}
return $address;
}
public function getPayStatusDetailAttr($value, $data)
{
$pay_status = config('PAY_STATUS');
return $pay_status[$data['pay_status']];
}
public function getShippingStatusDetailAttr($value, $data)
{
$shipping_status = config('SHIPPING_STATUS');
return $shipping_status[$data['shipping_status']];
}
public function getPromTypeDescAttr($value, $data)
{
if ($data['prom_type'] == 4) {
return '预售订单';
} elseif ($data['prom_type'] == 5) {
return '虚拟订单';
} elseif ($data['prom_type'] == 6) {
return '拼团订单';
} else {
return '普通订单';
}
}
/**
* 是否显示支付到期时间FinallyPayTime
* @param $value
* @param $data
* @return bool
*/
public function getPayBeforeTimeShowAttr($value, $data)
{
if ($data['prom_type'] == 4) {
return false;
}
return true;
}
/**
* 订单支付期限
* @param $value
* @param $data
* @return mixed
*/
public function getFinallyPayTimeAttr($value, $data)
{
return $data['add_time'] + config('finally_pay_time');
}
/**
* 付款URL
* @param $value
* @param $data
* @return string
*/
public function getPayUrlAttr($value, $data)
{
if ($data['prom_type'] == 4) {
return U('Cart/cart4', ['master_order_sn' => $data['master_order_sn']]);
} else {
return U('Cart/cart4', ['order_id' => $data['order_id']]);
}
}
/**
* 订单发票
* @return string
*/
public function invoice()
{
return $this->hasOne('invoice', 'order_id', 'order_id');
}
/**
* 配送方式
*/
public function getDeliveryMethodAttr($value, $data)
{
if ($data['shop_id'] > 0) {
return "上门自提";
} else {
return "快递配送";
}
}
public function getConsigneeDescAttr($value, $data)
{
if ($data['shop_id'] > 0) {
return "提货人";
} else {
return "收货人";
}
}
public function getShippingStatusDescAttr($value, $data)
{
$config = config('SHIPPING_STATUS');
return $config[$data['shipping_status']];
}
public function getCountGoodsNumAttr($value, $data)
{
return Db::name('order_goods')->where('order_id', $data['order_id'])->sum('goods_num');
}
/*
* 获取拼团订单的团长
*@param $value
* @param $data
* @return mixed
*/
public function getOrderTeamFoundAttr($value, $data)
{
if(6 !==$data['prom_type']){
return '';
}
$orderTeamFound = $this['team_found'];
if ($orderTeamFound) {
//团长的单
return $orderTeamFound;//团长
} else {
//去找团长
$TeamFound = new \app\common\model\TeamFound();
$teamFound = $TeamFound::get(['found_id' => $orderTeamFound['found_id']]);
return $teamFound;//团长
}
}
}