Files
littleTiger/application/common/logic/OrderLogic.php
2019-02-28 19:48:21 +08:00

973 lines
39 KiB
PHP
Raw 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
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* 采用最新Thinkphp5助手函数特性实现单字母函数M D U等简写方式
* ============================================================================
* Author: 当燃
* Date: 2016-03-19
*/
namespace app\common\logic;
use app\common\logic\wechat\WechatUtil;
use app\common\model\Order as OrderModel;
use app\common\model\SpecGoodsPrice;
use app\common\logic\MessageTemplateLogic;
use app\common\logic\MessageFactory;
use think\Cache;
use think\Db;
/**
* Class orderLogic
* @package Common\Logic
*/
class OrderLogic
{
protected $user_id=0;
public function setUserId($user_id){
$this->user_id=$user_id;
}
/**
* 取消订单
* @param $user_id|用户ID
* @param $order_id|订单ID
* @param string $action_note 操作备注
* @return array
*/
public function cancel_order($user_id,$order_id,$action_note='您取消了订单'){
$order = M('order')->where(array('order_id'=>$order_id,'user_id'=>$user_id))->find();
//检查是否未支付订单 已支付联系客服处理退款
if(empty($order))
return array('status'=>-1,'msg'=>'订单不存在','result'=>'');
if($order['order_status'] == 3){
return array('status'=>-1,'msg'=>'该订单已取消','result'=>'');
}
//检查是否未支付的订单
if($order['pay_status'] > 0 || $order['order_status'] > 0)
return array('status'=>-1,'msg'=>'支付状态或订单状态不允许','result'=>'');
//获取记录表信息
//$log = M('account_log')->where(array('order_id'=>$order_id))->find();
if($order['prom_type'] == 6){
$team_follow = Db::name('team_follow')->where(['order_id'=>$order_id])->find();
if($team_follow){
$team_found_queue = Cache::get('team_found_queue');
$team_found_queue[$team_follow['found_id']] = $team_found_queue[$team_follow['found_id']] + 1;
Cache::set('team_found_queue', $team_found_queue);
}
}
//有余额支付的情况
if($order['user_money'] > 0 || $order['integral'] > 0){
accountLog($user_id,$order['user_money'],$order['integral'],"订单取消,退回{$order['user_money']}元,{$order['integral']}积分",0,$order['order_id'],$order['order_sn']);
}
if($order['coupon_price'] >0){
$res = array('use_time'=>0,'status'=>0,'order_id'=>0);
M('coupon_list')->where(array('order_id'=>$order_id,'uid'=>$user_id))->save($res);
}
$row = M('order')->where(array('order_id'=>$order_id,'user_id'=>$user_id))->save(array('order_status'=>3));
$reduce = tpCache('shopping.reduce');
if($reduce == 1 || empty($reduce)){
$this->alterReturnGoodsInventory($order);
}
$this->orderActionLog($order_id,$action_note,'用户取消订单');
if(!$row)
return array('status'=>-1,'msg'=>'操作失败','result'=>'');
return array('status'=>1,'msg'=>'操作成功','result'=>'');
}
public function addReturnGoods($rec_id,$order)
{
$data = I('post.');
$confirm_time_config = tpCache('shopping.auto_service_date');//后台设置多少天内可申请售后
$confirm_time = $confirm_time_config * 24 * 60 * 60;
if ((time() - $order['confirm_time']) > $confirm_time && !empty($order['confirm_time'])) {
return ['status'=>-1,'msg'=>'已经超过' . ($confirm_time_config ?: 0) . "天内退货时间"];
}
$img = $this->uploadReturnGoodsImg();
if ($img['status'] !== 1) {
return $img;
}
$data['imgs'] = $img['result'] ?: ($data['imgs'] ?: ''); //兼容小程序多传imgs
$data['addtime'] = time();
$data['user_id'] = $order['user_id'];
$order_goods = M('order_goods')->where(array('rec_id'=>$rec_id))->find();
if($data['type'] < 2){
$useRapplyReturnMoney = $order_goods['final_price']*$data['goods_num']; //要退的总价 商品购买单价*申请数量
$userExpenditureMoney = $order['goods_price']-$order['order_prom_amount']-$order['coupon_price']; //用户实际使用金额
$rate = round($useRapplyReturnMoney/$userExpenditureMoney,8);
$data['refund_integral'] = floor($rate*$order['integral']);//该退积分支付
//积分规则修改后的逻辑
$point_rate = tpCache('integral.point_rate');
$integralDeductionMoney = $data['refund_integral']/$point_rate ; //积分抵了多少钱,要扣掉
if($order['order_amount']>0){
$order_amount = $order['order_amount']+$order['paid_money']; //三方支付总额,预售要退定金
if($order_amount>$order['shipping_price']){
$data['refund_money'] = round($rate*($order_amount - $order['shipping_price']),2); //退款金额
$data['refund_deposit'] = $rate*$order['user_money'];
}else{
$data['refund_deposit'] = round($rate*($order['user_money'] - $order['shipping_price']+$order['paid_money'])-$integralDeductionMoney,2);//该退余额支付部分
}
}else{
$data['refund_deposit'] = round($useRapplyReturnMoney-$integralDeductionMoney,2);//该退余额支付部分
}
}
if(!empty($data['id'])){
$result = M('return_goods')->where(array('id'=>$data['id']))->save($data);
}else{
$result = M('return_goods')->add($data);
}
if($result){
return ['status'=>1,'msg'=>'申请成功'];
}
return ['status'=>-1,'msg'=>'申请失败'];
}
/**
* 上传退换货图片,兼容小程序
* @return array
*/
public function uploadReturnGoodsImg()
{
$return_imgs = '';
if ($_FILES['return_imgs']['tmp_name']) {
$files = request()->file("return_imgs");
if (is_object($files)) {
$files = [$files]; //可能是一张图片,小程序情况
}
$image_upload_limit_size = config('image_upload_limit_size');
$validate = ['size'=>$image_upload_limit_size,'ext'=>'jpg,png,gif,jpeg'];
$dir = UPLOAD_PATH.'return_goods/';
if (!($_exists = file_exists($dir))){
$isMk = mkdir($dir);
}
$parentDir = date('Ymd');
foreach($files as $key => $file){
$info = $file->rule($parentDir)->validate($validate)->move($dir, true);
if($info){
$filename = $info->getFilename();
$new_name = '/'.$dir.$parentDir.'/'.$filename;
$return_imgs[]= $new_name;
}else{
return ['status' => -1, 'msg' => $file->getError()];//上传错误提示错误信息
}
}
if (!empty($return_imgs)) {
$return_imgs = implode(',', $return_imgs);// 上传的图片文件
}
}
return ['status' => 1, 'msg' => '操作成功', 'result' => $return_imgs];
}
/**
* 获取可申请退换货订单商品
* @param $sale_t
* @param $keywords
* @param $user_id
* @return array
*/
public function getReturnGoodsIndex($sale_t, $keywords, $user_id)
{
if($keywords){
$condition['order_sn'] = $keywords;
}
$confirm_time_config = tpCache('shopping.auto_service_date');//后台设置多少天内可申请售后
$confirm_time = strtotime("-$confirm_time_config day");
$condition['add_time'] = ['gt',$confirm_time];
$condition['user_id'] = $user_id;
$condition['pay_status'] = 1;
$condition['shipping_status'] = 1;
$condition['deleted'] = 0;
$count = M('order')->where($condition)->count();
$Page = new \think\Page($count,10);
$show = $Page->show();
$order_list = M('order')->where($condition)->order('order_id desc')->limit($Page->firstRow.','.$Page->listRows)->select();
foreach ($order_list as $k=>$v) {
$order_list[$k] = set_btn_order_status($v); // 添加属性 包括按钮显示属性 和 订单状态显示属性
$data = M('order_goods')->where(['order_id'=>$v['order_id'],'is_send'=>['lt',2]])->select();
if(!empty($data)){
$order_list[$k]['goods_list'] = $data;
}else{
unset($order_list[$k]); //除去没有可申请的订单
}
}
return [
'order_list' => $order_list,
'page' => $show
];
}
/**
* 获取退货列表
* @param $keywords
* @param $addtime
* @param $status
* @param int $user_id
* @return array
*/
public function getReturnGoodsList($keywords, $addtime, $status, $user_id = 0)
{
if($keywords){
$where['order_sn|goods_name'] = array('like',"%$keywords%");
}
if($status === '0' || !empty($status)){
$where['status'] = $status;
}
if($addtime == 1){
$where['addtime'] = array('gt',(time()-90*24*3600));
}
if($addtime == 2){
$where['addtime'] = array('lt',(time()-90*24*3600));
}
$query = M('return_goods')->alias('r')->field('r.*,g.goods_name')
->join('__ORDER__ o', 'r.order_id = o.order_id AND o.deleted = 0 AND o.user_id='.$user_id)
->join('__GOODS__ g', 'r.goods_id = g.goods_id', 'LEFT')
->where($where);
$query2 = clone $query;
$count = $query->count();
$page = new \think\Page($count,10);
$list = $query2->order("id desc")->limit($page->firstRow, $page->listRows)->select();
$goods_id_arr = get_arr_column($list, 'goods_id');
if(!empty($goods_id_arr)) {
$goodsList = M('goods')->where("goods_id in (". implode(',',$goods_id_arr).")")->getField('goods_id,goods_name');
}
return [
'goodsList' => $goodsList,
'return_list' => $list,
'page' => $page->show()
];
}
/**
* 记录取消订单
* @param $user_id
* @param $order_id
* @param $user_note
* @param $consignee
* @param $mobile
* @return array
*/
public function recordRefundOrder($user_id, $order_id, $user_note, $consignee, $mobile)
{
$order = Db::name('order')->where(['order_id' => $order_id, 'user_id' => $user_id])->find();
if (!$order) {
return ['status' => -1, 'msg' => '订单不存在'];
}
$order_return_num = Db::name('return_goods')->where(['order_id' => $order_id, 'user_id' => $user_id,'status'=>['neq',5]])->count();
if($order_return_num > 0){
return ['status' => -1, 'msg' => '该订单中有商品正在申请售后'];
}
$order_status = 3;//已取消
$order_info = ['order_status'=> $order_status];
if($mobile){
$order_info['mobile'] = $mobile;
}
if($consignee){
$order_info['consignee'] = $consignee;
}
if($user_note){
$order_info['user_note'] = $user_note;
$data['action_note'] = $user_note;
}
$result = Db::name('order')->where(['order_id' => $order_id])->update($order_info);
if (!$result) {
return ['status' => 0, 'msg' => '操作失败'];
}
if($order['prom_type'] == 5){
//活动订单可能要操作其他东西,目前只是虚拟订单才需要,以后根据业务做修改
Db::name('vr_order_code')->where(['order_id' => $order_id])->update(['refund_lock'=>1]);
}
Db::name('rebate_log')->where(['order_id'=>$order_id])->save(array('status'=>4,'confirm_time'=>time()));
$order = new \app\common\logic\Order();
$order->setOrderById($order_id);
$order->orderActionLog('','用户取消已付款订单');
return ['status' => 1, 'msg' => '提交成功'];
}
/**
* 生成兑换码
* 长度 =3位 + 4位 + 2位 + 3位 + 1位 + 5位随机 = 18位
* @param $order
* @return mixed
*/
function make_virtual_code($order){
$order_goods = M('order_goods')->where(array('order_id'=>$order['order_id']))->find();
$goods = M('goods')->where(array('goods_id'=>$order_goods['goods_id']))->find();
M('order')->where(array('order_id'=>$order['order_id']))->save(array('order_status'=>1,'shipping_time'=>time()));
$perfix = mt_rand(100,999);
$perfix .= sprintf('%04d', $order['user_id'] % 10000)
. sprintf('%02d', (int) $order['user_id'] % 100).sprintf('%03d', (float) microtime() * 1000);
for ($i = 0; $i < $order_goods['goods_num']; $i++) {
$order_code[$i]['order_id'] = $order['order_id'];
$order_code[$i]['user_id'] = $order['user_id'];
//$baduyun = "百度云链接"+$goods['url']+"百度云账号"+$goods['gooduser']+"百度云密码"+$goods['goodpwd']
$order_code[$i]['vr_code'] = "百度云链接".$goods['url']."百度云账号".$goods['gooduser']."百度云密码".$goods['goodpwd'];
$order_code[$i]['pay_price'] = $goods['shop_price'];
$order_code[$i]['vr_indate'] = $goods['virtual_indate'];
$order_code[$i]['vr_invalid_refund'] = $goods['virtual_refund'];
}
$message_logic = new \app\common\logic\MessageLogisticsLogic([]);
$message_logic->sendVirtualOrder($order, $goods);
$res = checkEnableSendSms("7");
//生成虚拟订单, 向用户发送短信提醒
if($res && $res['status'] ==1){
$sender = $order['mobile'];
$goods_name = $goods['goods_name'];
$goods_name = getSubstr($goods_name, 0, 10);
$params = array('goods_name'=>$goods_name);
sendSms("7", $sender, $params);
}
return M('vr_order_code')->insertAll($order_code);
}
/**
* 自动取消订单
*/
public function abolishOrder(){
$set_time=1; //自动取消时间/天 默认1天
$abolishtime = strtotime("-$set_time day");
$order_where = [
'user_id' =>$this->user_id,
'add_time' =>['lt',$abolishtime],
'pay_status' =>0,
'order_status' => 0
];
$order = Db::name('order')->where($order_where)->getField('order_id',true);
foreach($order as $key =>$value){
$result = $this->cancel_order($this->user_id,$value);
}
return $result;
}
/**
* 获取订单 order_sn
* @return string
*/
public function get_order_sn()
{
$order_sn = null;
// 保证不会有重复订单号存在
while(true){
$order_sn = date('YmdHis').rand(1000,9999); // 订单编号
$order_sn_count = M('order')->where("order_sn = ".$order_sn)->count();
if($order_sn_count == 0)
break;
}
return $order_sn;
}
/**
* 批量订单操作记录
* @param $order_id
* @param $action_note 备注
* @param $status_desc 状态描述
* @param $action_user
* @return mixed
*/
public function orderActionLog($order_id,$action_note,$status_desc,$action_user=0){
$order = Db::name('order')->where(['order_id'=>$order_id])->find();
$data=[
'order_id' => $order_id,
'action_user' => $action_user,
'action_note' => $action_note,
'order_status' => $order['order_status'],
'pay_status' => $order['pay_status'],
'log_time' => time(),
'status_desc' => $status_desc,
'shipping_status' => $order['shipping_status'],
];
return M('order_action')->add($data);//订单操作记录
}
/**
* 取消订单后改变库存,根据不同的规格,商品活动修改对应的库存
* @param $order
* @param $rec_id|订单商品表id 如果有只返还订单某个商品的库存,没有返还整个订单
*/
public function alterReturnGoodsInventory($order, $rec_id='')
{
if($order['prom_type'] == 6){
if($order['teamActivity']['team_type']==2){ //抽奖团取消不用退库存
return ;
}
}
if($rec_id){
$orderGoodsWhere['rec_id'] = $rec_id;
$retunn_info = Db::name('return_goods')->where($orderGoodsWhere)->select(); //查找购买数量和购买规格
$order_goods_prom = Db::name('order_goods')->where($orderGoodsWhere)->find(); //购买时参加的活动
$order_goods = $retunn_info;
$order_goods[0]['prom_type'] = $order_goods_prom['prom_type'];
$order_goods[0]['prom_id'] = $order_goods_prom['prom_id'];
$order_goods[0]['goods_name'] = $order_goods_prom['goods_name'];
$order_goods[0]['spec_key_name'] = $order_goods_prom['spec_key_name'];
}else{
$orderGoodsWhere = ['order_id'=>$order['order_id']];
$order_goods = Db::name('order_goods')->where($orderGoodsWhere)->select(); //查找购买数量和购买规格
}
foreach($order_goods as $key=>$val){
if(!empty($val['spec_key'])){ // 先到规格表里面扣除数量
$SpecGoodsPrice = new SpecGoodsPrice();
$specGoodsPrice = $SpecGoodsPrice::get(['goods_id' => $val['goods_id'], 'key' => $val['spec_key']]);
if($specGoodsPrice){
$specGoodsPrice->store_count = $specGoodsPrice->store_count + $val['goods_num'];
$specGoodsPrice->save();//有规格则增加商品对应规格的库存
}
}
update_stock_log($order['user_id'], $val['goods_num'], $val, $order['order_sn']);//库存日志
Db::name('goods')->where(['goods_id' => $val['goods_id']])->setInc('store_count', $val['goods_num']);//增加商品库存
Db::name('Goods')->where("goods_id", $val['goods_id'])->setDec('sales_sum', $val['goods_num']); // 减少商品销售量
//更新活动商品购买量
if ($val['prom_type'] == 1 || $val['prom_type'] == 2) {
$GoodsPromFactory = new GoodsPromFactory();
$goodsPromLogic = $GoodsPromFactory->makeModule($val, $specGoodsPrice);
$prom = $goodsPromLogic->getPromModel();
if ($prom['is_end'] == 0) {
$tb = $val['prom_type'] == 1 ? 'flash_sale' : 'group_buy';
M($tb)->where("id", $val['prom_id'])->setDec('buy_num', $val['goods_num']);
M($tb)->where("id", $val['prom_id'])->setDec('order_num',1);
}
}
}
}
/**
* 修改订单兑换码
* @param $order
*/
public function alterOrderCode($order)
{
Db::name('vr_order_code')->where(['order_id'=>$order['order_id']])->save(['refund_lock'=>1]);
}
/*****admin*****/
/**
* 根据商品型号获取商品
* @param $goods_id_arr
* @return array|bool
*/
public function get_spec_goods($goods_id_arr){
if(!is_array($goods_id_arr)) return false;
foreach($goods_id_arr as $key => $val)
{
$arr = array();
$goods = Db::name('goods')->where("goods_id = $key")->find();
$arr['goods_id'] = $key; // 商品id
$arr['goods_name'] = $goods['goods_name'];
$arr['goods_sn'] = $goods['goods_sn'];
$arr['market_price'] = $goods['market_price'];
$arr['goods_price'] = $goods['shop_price'];
$arr['cost_price'] = $goods['cost_price'];
$arr['member_goods_price'] = $goods['shop_price'];
foreach($val as $k => $v)
{
$arr['goods_num'] = $v['goods_num']; // 购买数量
// 如果这商品有规格
if($k != 'key')
{
$arr['spec_key'] = $k;
$spec_goods = Db::name('spec_goods_price')->where("goods_id = $key and `key` = '{$k}'")->find();
$arr['spec_key_name'] = $spec_goods['key_name'];
$arr['member_goods_price'] = $arr['goods_price'] = $spec_goods['price'];
$arr['sku'] = $spec_goods['sku']; // 参考 sku http://www.zhihu.com/question/19841574
}
$order_goods[] = $arr;
}
}
return $order_goods;
}
/*
* 获取订单商品总价格
*/
public function getGoodsAmount($order_id){
$sql = "SELECT SUM(goods_num * goods_price) AS goods_amount FROM __PREFIX__order_goods WHERE order_id = {$order_id}";
$res = DB::query($sql);
return $res[0]['goods_amount'];
}
/**
* 得到发货单流水号
*/
public function get_delivery_sn()
{
// /* 选择一个随机的方案 */send_http_status('310');
mt_srand((double) microtime() * 1000000);
return date('YmdHi') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}
/*
* 获取当前可操作的按钮
*/
public function getOrderButton($order){
/*
* 操作按钮汇总 :付款、设为未付款、确认、取消确认、无效、去发货、确认收货、申请退货
*
*/
$os = $order['order_status'];//订单状态
$ss = $order['shipping_status'];//发货状态
$ps = $order['pay_status'];//支付状态
$pt = $order['prom_type'];//订单类型0默认1抢购2团购3优惠4预售5虚拟6拼团
$btn = array();
if($order['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'] = '确认';
}
}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;
}
public function orderProcessHandle($order_id,$act,$ext=array()){
$update = array();
switch ($act){
case 'pay': //付款
$order_sn = Db::name('order')->where("order_id = $order_id")->getField("order_sn");
update_pay_status($order_sn,$ext); // 调用确认收货按钮
return true;
case 'pay_cancel': //取消付款
$update['pay_status'] = 0;
$this->order_pay_cancel($order_id);
return true;
case 'confirm': //确认订单
$update['order_status'] = 1;
break;
case 'cancel': //取消确认
$update['order_status'] = 0;
break;
case 'invalid': //作废订单
$update['order_status'] = 5;
$reduce = tpCache('shopping.reduce');
$order = Db::name('order')->where("order_id", $order_id)->find();
if(($reduce == 1 || empty($reduce)) || ($reduce == 2 && $order['pay_status'] == 1)){
$this->alterReturnGoodsInventory($order);
}
break;
case 'remove': //移除订单
$order = new \app\common\logic\Order();
$order->setOrderById($order_id);
$order->AdminDelOrder();
break;
case 'delivery_confirm'://确认收货
confirm_order($order_id); // 调用确认收货按钮
return true;
default:
return true;
}
return Db::name('order')->where("order_id=$order_id")->save($update);//改变订单状态
}
//管理员取消付款
function order_pay_cancel($order_id)
{
//如果这笔订单已经取消付款过了
$count = Db::name('order')->where(['order_id' => $order_id, 'pay_status' => 1])->count(); // 看看有没已经处理过这笔订单 支付宝返回不重复处理操作
if($count == 0) return false;
// 找出对应的订单
$Order = new \app\common\logic\Order();
$Order->setOrderById($order_id);
$order = $Order->getOrder();
// 增加对应商品的库存
$orderGoodsArr = Db::name('OrderGoods')->where("order_id = $order_id")->select();
foreach($orderGoodsArr as $key => $val)
{
if(!empty($val['spec_key']))// 有选择规格的商品
{ // 先到规格表里面增加数量 再重新刷新一个 这件商品的总数量
$SpecGoodsPrice = new \app\common\model\SpecGoodsPrice();
$specGoodsPrice = $SpecGoodsPrice::get(['goods_id' => $val['goods_id'], 'key' => $val['spec_key']]);
$specGoodsPrice->where(['goods_id' => $val['goods_id'], 'key' => $val['spec_key']])->setDec('store_count', $val['goods_num']);
refresh_stock($val['goods_id']);
}else{
$specGoodsPrice = null;
Db::name('Goods')->where("goods_id = {$val['goods_id']}")->setInc('store_count',$val['goods_num']); // 增加商品总数量
}
Db::name('Goods')->where("goods_id = {$val['goods_id']}")->setDec('sales_sum',$val['goods_num']); // 减少商品销售量
//更新活动商品购买量
if ($val['prom_type'] == 1 || $val['prom_type'] == 2) {
$GoodsPromFactory = new \app\common\logic\GoodsPromFactory();
$goodsPromLogic = $GoodsPromFactory->makeModule($val, $specGoodsPrice);
$prom = $goodsPromLogic->getPromModel();
if ($prom['is_end'] == 0) {
$tb = $val['prom_type'] == 1 ? 'flash_sale' : 'group_buy';
Db::name($tb)->where("id", $val['prom_id'])->setInc('buy_num', $val['goods_num']);
Db::name($tb)->where("id", $val['prom_id'])->setInc('order_num');
}
}
}
// 根据order表查看消费记录 给他会员等级升级 修改他的折扣 和 总金额
Db::name('order')->where("order_id=$order_id")->save(array('pay_status'=>0));
// update_user_level($order['user_id']);
$User =new \app\common\logic\User();
$User->setUserById($order['user_id']);
$User->updateUserLevel();
$Order->orderActionLog('订单取消付款','用户取消已付款订单');
//分销设置
Db::name('rebate_log')->where("order_id = {$order['order_id']}")->save(array('status'=>0));
}
/**
* 处理发货单
* @param array $data 查询数量
* @return array
* @throws \think\Exception
*/
public function deliveryHandle($data){
$orderModel = new \app\common\model\Order();
$orderObj = $orderModel::get(['order_id'=>$data['order_id']]);
$order = $orderObj->append(['full_address','orderGoods'])->toArray();
$orderGoods = $order['orderGoods'];
$selectgoods = $data['goods'];
$data['order_sn'] = $order['order_sn'];
$data['delivery_sn'] = $this->get_delivery_sn();
$data['zipcode'] = $order['zipcode'];
$data['user_id'] = $order['user_id'];
$data['admin_id'] = session('admin_id');
$data['consignee'] = $order['consignee'];
$data['mobile'] = $order['mobile'];
$data['country'] = $order['country'];
$data['province'] = $order['province'];
$data['city'] = $order['city'];
$data['district'] = $order['district'];
$data['address'] = $order['address'];
$data['shipping_price'] = $order['shipping_price'];
$data['create_time'] = time();
if($data['shipping'] == 1){ //修改物流
$r =$this->updateOrderShipping($data,$order);
}else{
if($data['send_type'] == 0 || $data['send_type'] == 3){
$did = Db::name('delivery_doc')->add($data);
}else{
$result = $this->submitOrderExpress($data,$orderGoods);
if($result['status'] == 1){
$did = $result['did'];
}else{
return array('status'=>0,'msg'=>$result['msg']);
}
}
$is_delivery = 0;
foreach ($orderGoods as $k=>$v){
if($v['is_send'] >= 1){
$is_delivery++;
}
if($v['is_send'] == 0 && in_array($v['rec_id'],$selectgoods)){
$res['is_send'] = 1;
$res['delivery_id'] = $did;
$r = Db::name('order_goods')->where("rec_id=".$v['rec_id'])->save($res);//改变订单商品发货状态
$is_delivery++;
}
}
// shipping_code or shipping_name 为null时报错
$update['shipping_time'] = time();
$update['shipping_code'] = $data['shipping_code'] ? $data['shipping_code'] : '';
$update['shipping_name'] = $data['shipping_name'] ? $data['shipping_name'] : '';
if($is_delivery == count($orderGoods)){
$update['shipping_status'] = 1;
}else{
$update['shipping_status'] = 2;
}
Db::name('order')->where("order_id=".$data['order_id'])->save($update);//改变订单状态
$convert_action= C('CONVERT_ACTION')["delivery"];
$this->orderActionLog($order['order_id'],$data['note'],$convert_action,session('admin_id'));//操作日志
}
//商家发货, 发送短信给客户
$res = checkEnableSendSms("5");
if ($res && $res['status'] ==1) {
$user_id = $data['user_id'];
$users = Db::name('users')->where('user_id', $user_id)->getField('user_id , nickname , mobile' , true);
if($users){
$nickname = $users[$user_id]['nickname'];
$sender = $users[$user_id]['mobile'];
$params = array('user_name'=>$nickname , 'consignee'=>$data['consignee']);
sendSms("5", $sender, $params,'');
}
}
// 发送微信模板消息通知
$wechat = new WechatLogic;
$wechat->sendTemplateMsgOnDeliver($data);
if($r){
$order_arr = Db::name('order_goods')->where("order_id", $order['order_id'])->find();
// 添加发消息通知
$goods_original_img = Db::name('goods')->where("goods_id", $order_arr['goods_id'])->value('original_img');
$send_data = [
'message_title' => '商品已发货',
'message_content' => $order_arr['goods_name'],
'img_uri' => $goods_original_img,
'order_sn' => $order['order_sn'],
'order_id' => $order['order_id'],
'mmt_code' => 'deliver_goods_logistics',
'type' => 2,
'users' => [$order['user_id']],
'category' => 2,
'message_val' => []
];
$messageFactory = new MessageFactory();
$messageLogic = $messageFactory->makeModule($send_data);
$messageLogic->sendMessage();
return array('status'=>1,'printhtml'=>isset($result['printhtml']) ? $result['printhtml'] : '');
}else{
return array('status'=>0,'msg'=>'发货失败');
}
}
/**
* 修改订单发货信息
* @param array $data
* @param array $order
* @return bool|mixed
*/
public function updateOrderShipping($data=[],$order=[]){
$updata['shipping_code'] = $data['shipping_code'];
$updata['shipping_name'] = $data['shipping_name'];
Db::name('order')->where(['order_id'=>$data['order_id']])->save($updata); //改变物流信息
$updata['invoice_no'] = $data['invoice_no'];
$delivery_res = Db::name('delivery_doc')->where(['order_id'=>$data['order_id']])->save($updata); //改变售后的信息
if ($delivery_res){
return $this->orderActionLog($order['order_id'],$data['note'],'订单修改发货信息',session('admin_id'));//操作日志
}else{
return false;
}
}
//订单发货在线下单、电子面单
public function submitOrderExpress($data,$orderGoods){
/*code_21快递鸟电子面单*/
$eorder = [];
$eorder["ShipperCode"] = $data['shipping_code'];//物流公司编码
$eorder["OrderCode"] = $data['order_sn'];//订单号
$eorder["PayType"] = 1;
$eorder["ExpType"] = 1;
$shop_info = tpCache('shop_info');
$region_ids = array($shop_info['province'],$shop_info['city'],$shop_info['district'],$data['province'],$data['city'],$data['district']);
$region = Db::name('region')->where(array('id'=>array('in',$region_ids)))->getField('id,name');
$sender = [];
$sender["Name"] = $shop_info['contact'];
$sender["Mobile"] = $shop_info['mobile'];
$sender["ProvinceName"] = $region[$shop_info['province']];
$sender["CityName"] = $region[$shop_info['city']];
$sender["ExpAreaName"] = $region[$shop_info['district']];
$sender["Address"] = $shop_info['address'];
$receiver = [];
$receiver["Name"] = $data['consignee'];
$receiver["Mobile"] = $data['mobile'];
$receiver['PostCode'] = $data['zipcode'];
$receiver["ProvinceName"] = $region[$data['province']];
$receiver["CityName"] = $region[$data['city']];
$receiver["ExpAreaName"] = $region[$data['district']];
$receiver["Address"] = $data['address'];
$commodityOne = $commodity = [];
foreach ($orderGoods as $val){
if($val['is_send'] == 0 && in_array($val['rec_id'],$data['goods'])){
$commodityOne["GoodsName"] = $val['goods_name'];
$commodityOne['Goodsquantity'] = $val['goods_num'];
$commodity[] = $commodityOne;
}
}
$eorder["Sender"] = $sender;//收件人信息
$eorder["Receiver"] = $receiver;//发件人信息
$eorder["Commodity"] = $commodity;//发货商品信息
$eorder['Remark'] = $data['note'];
$jsonParam = json_encode($eorder, JSON_UNESCAPED_UNICODE);
$jsonParam = str_replace("+","/",$jsonParam); // 电子面单时,商品带有+号,会提示非法参数
require_once(PLUGIN_PATH . 'kdniao/kdniao.php');
//1001预约取件接1007电子面单
$request_type = ($data['send_type']>1) ? 1007 : 1001;
$kdniao = new \kdniao($request_type);
$jsonResult = $kdniao->submitEOrder($jsonParam);
$res = json_decode($jsonResult,true);
if(!$res['Success']){
return array('status'=>0,'msg'=>$res['Reason']);
}else{
$data['invoice_no'] = $res['Order']['LogisticCode'];
$did = Db::name('delivery_doc')->add($data);
$printhtml = empty($res['PrintTemplate']) ? '' : $res['PrintTemplate'];
return array('status'=>1,'did'=>$did,'printhtml'=>$printhtml);
}
/*code_21快递鸟电子面单*/
}
/**
* 获取地区名字
* @param int $p
* @param int $c
* @param int $d
* @return string
*/
public function getAddressName($p=0,$c=0,$d=0){
$p = Db::name('region')->where(array('id'=>$p))->field('name')->find();
$c = Db::name('region')->where(array('id'=>$c))->field('name')->find();
$d = Db::name('region')->where(array('id'=>$d))->field('name')->find();
return $p['name'].','.$c['name'].','.$d['name'].',';
}
/**
* 当订单里商品都退货完成,将订单状态改成关闭
* @param $order_id
* @return bool
* @throws \think\Exception
*/
function closeOrderByReturn($order_id)
{
$order_goods_list = Db::name('order_goods')->where(['order_id' => $order_id])->select();
$order_goods_count = count($order_goods_list);
$order_goods_return_count = 0;//退货个数
for ($i = 0; $i < $order_goods_count; $i++) {
if ($order_goods_list[$i]['is_send'] == 3) {
$order_goods_return_count++;
}
}
if ($order_goods_count == $order_goods_return_count) {
$res = Db::name('order')->where(['order_id' => $order_id])->update(['order_status' => 5]);
if(!$res){
return false;
}
}
return true;
}
/**
* 退货,取消订单,处理优惠券
* @param $return_info
*/
public function disposereRurnOrderCoupon($return_info){
$coupon_list = Db::name('coupon_list')->where(['uid'=>$return_info['user_id'],'order_id'=>$return_info['order_id']])->find(); //有没有关于这个商品的优惠券
if(!empty($coupon_list)){
$update_coupon_data = ['status'=>0,'use_time'=>0,'order_id'=>0];
Db::name('coupon_list')->where(['id'=>$coupon_list['id'],'status'=>1])->save($update_coupon_data);//符合条件的,优惠券就退给他
}
//追回赠送优惠券,一般退款才会走这里
$coupon_info = Db::name('coupon_list')->where(['uid'=>$return_info['user_id'],'get_order_id'=>$return_info['order_id']])->find();
if(!empty($coupon_info)){
if($coupon_info['status'] == 1) { //如果优惠券被使用,那么从退款里扣
$coupon = Db::name('coupon')->where(array('id' => $coupon_info['cid']))->find();
if ($return_info['refund_money'] > $coupon['money']) {
//退款金额大于优惠券金额,先从这里扣
$return_info['refund_money'] = $return_info['refund_money'] - $coupon['money'];
Db::name('return_goods')->where(['id' => $return_info['id']])->save(['refund_money' => $return_info['refund_money']]);
}else{
$return_info['refund_deposit'] = $return_info['refund_deposit'] - $coupon['money'];
Db::name('return_goods')->where(['id' => $return_info['id']])->save(['refund_deposit' => $return_info['refund_deposit']]);
}
}else {
Db::name('coupon_list')->where(array('id' => $coupon_info['id']))->delete();
Db::name('coupon')->where(array('id' => $coupon_info['cid']))->setDec('send_num');
}
}
}
public function getRefundGoodsMoney($return_goods){
$order_goods = Db::name('order_goods')->where(array('rec_id'=>$return_goods['rec_id']))->find();
if($return_goods['is_receive'] == 1){
if($order_goods['give_integral']>0){
$user = get_user_info($return_goods['user_id']);
if($order_goods['give_integral']>$user['pay_points']){
//积分被使用则从退款金额里扣
$return_goods['refund_money'] = $return_goods['refund_money'] - $order_goods['give_integral']/100;
}
}
$coupon_info = Db::name('coupon_list')->where(array('uid'=>$return_goods['user_id'],'get_order_id'=>$return_goods['order_id']))->find();
if(!empty($coupon_info)){
if($coupon_info['status'] == 1) { //如果优惠券被使用,那么从退款里扣
$coupon = Db::name('coupon')->where(array('id' => $coupon_info['cid']))->find();
if ($return_goods['refund_money'] > $coupon['money']) {
$return_goods['refund_money'] = $return_goods['refund_money'] - $coupon['money'];//退款金额大于优惠券金额
}
}
}
}
return $return_goods['refund_money'];
}
//识别单号
public function distinguishExpress(){
require_once(PLUGIN_PATH . 'kdniao/kdniao.php');
$kdniao = new \kdniao();
$data['LogisticCode'] = I('invoice_no');
$kdniao->getOrderTracesByJson(json_encode($data));
}
}