<?php

namespace app\common\logic;
use think\facade\Db;

/**
 * ============================================================================
 * 
 * ============================================================================
 * 版权所有 2014-2028 浙江惠利玛产业互联网有限公司，并保留所有权利。
 * 网站地址: https://www.valimart.net/
 * ----------------------------------------------------------------------------
 * 
 * ============================================================================
 * 逻辑层模型
 */
class Vrorder
{
    /**
     * 取消订单
     * @param array $order_info
     * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
     * @param string $msg 操作备注
     * @param boolean $if_queue 是否使用队列
     * @return array
     */
    public function changeOrderStateCancel($order_info, $role, $msg, $if_queue = true)
    {

        try {

            $vrorder_model = model('vrorder');
            Db::startTrans();
            
            $ppintuanorder_model=model('ppintuanorder');
            if($order_info['order_promotion_type']==2){
                $condition=array();
                $condition[]=array('order_id','=',$order_info['order_id']);
                $condition[]=array('pintuanorder_type','=',1);
                $condition[]=array('pintuanorder_state','=',1);
                $ppintuanorder_model->editPpintuanorder($condition, array('pintuanorder_state'=>0));
            }
            //库存、销量变更
            model('goods')->cancelOrderUpdateStorage(array($order_info['goods_id'] => $order_info['goods_num']),$order_info['virtual_type']>1?true:false);


            
            $predeposit_model = model('predeposit');

            //解冻充值卡
            $rcb_amount = floatval($order_info['rcb_amount']);
            $data_rcb = array();
            $data_rcb['member_id'] = $order_info['buyer_id'];
            $data_rcb['member_name'] = $order_info['buyer_name'];
            $data_rcb['amount'] = $rcb_amount;
            $data_rcb['order_sn'] = $order_info['order_sn'];


            //解冻预存款
            $pd_amount = floatval($order_info['pd_amount']);
            $data_pd = array();
            $data_pd['member_id'] = $order_info['buyer_id'];
            $data_pd['member_name'] = $order_info['buyer_name'];
            $data_pd['amount'] = $pd_amount;
            $data_pd['order_sn'] = $order_info['order_sn'];


            if ($order_info['order_state'] == ORDER_STATE_NEW) {
                if ($rcb_amount > 0) {
                    $predeposit_model->changeRcb('order_cancel', $data_rcb);
                }
                if ($pd_amount > 0) {
                    $predeposit_model->changePd('order_cancel', $data_pd);
                }
            }
            if ($order_info['order_state'] == ORDER_STATE_PAY) {
                $refundreturn_model=model('refundreturn');
                $refundreturn_model->refundAmount($order_info, $order_info['order_amount']);

                if($order_info['order_promotion_type']==2){//如果是拼团
                    $ppintuangroup_info=Db::name('ppintuangroup')->where('pintuangroup_id', $order_info['promotions_id'])->lock(true)->find();
                    if ($ppintuangroup_info && $ppintuangroup_info['pintuangroup_state'] == 1) {
                        if ($ppintuangroup_info['pintuangroup_joined'] > 0) {
                            Db::name('ppintuangroup')->where('pintuangroup_id', $order_info['promotions_id'])->dec('pintuangroup_joined')->update();
                            if ($ppintuangroup_info['pintuangroup_joined'] == 1) {
                                //拼团统计开团数量
                                $condition = array();
                                $condition[] = array('pintuan_id', '=', $ppintuangroup_info['pintuan_id']);
                                $condition[] = array('pintuan_count', '>', 0);
                                Db::name('ppintuan')->where($condition)->dec('pintuan_count')->update();
                            }
                        }
                    }
                }
            }
            //更新订单信息
            $update_order = array(
                'order_state' => ORDER_STATE_CANCEL, 'pd_amount' => 0, 'close_time' => TIMESTAMP, 'close_reason' => $msg
            );
            $update = $vrorder_model->editVrorder($update_order, array('order_id' => $order_info['order_id']));
            if (!$update) {
                throw new \think\Exception('保存失败', 10006);
            }
            //分销佣金取消
            $condition=array();
            $condition[]=array('orderinviter_order_id','=',$order_info['order_id']);
            $condition[]=array('orderinviter_valid','=',0);
            $condition[]=array('orderinviter_order_type','=',1);
            Db::name('orderinviter')->where($condition)->update(['orderinviter_valid' => 2]);

            Db::commit();
            return ds_callback(true, '更新成功');

        } catch (Exception $e) {
            Db::rollback();
            return ds_callback(false, $e->getMessage());
        }
    }

    /**
     * 支付订单
     * @param array $order_info
     * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
     * @param string $post
     * @return array
     */
    public function changeOrderStatePay($order_info, $role, $post)
    {
        try {

            $vrorder_model = model('vrorder');
            Db::startTrans();

            $predeposit_model = model('predeposit');
            //下单，支付被冻结的充值卡
            $rcb_amount = floatval($order_info['rcb_amount']);
            if ($rcb_amount > 0) {
                $data_pd = array();
                $data_pd['member_id'] = $order_info['buyer_id'];
                $data_pd['member_name'] = $order_info['buyer_name'];
                $data_pd['amount'] = $rcb_amount;
                $data_pd['order_sn'] = $order_info['order_sn'];
                $predeposit_model->changeRcb('order_comb_pay', $data_pd);
            }

            //下单，支付被冻结的预存款
            $pd_amount = floatval($order_info['pd_amount']);
            if ($pd_amount > 0) {
                $data_pd = array();
                $data_pd['member_id'] = $order_info['buyer_id'];
                $data_pd['member_name'] = $order_info['buyer_name'];
                $data_pd['amount'] = $pd_amount;
                $data_pd['order_sn'] = $order_info['order_sn'];
                $predeposit_model->changePd('order_comb_pay', $data_pd);
            }

            //更新订单状态
            $update_order = array();
            $update_order['order_state'] = ORDER_STATE_PAY;
            $update_order['payment_time'] = isset($post['payment_time']) ? strtotime($post['payment_time']) : TIMESTAMP;
            $update_order['payment_code'] = $post['payment_code'];
            $update_order['trade_no'] = $post['trade_no'];
            $update = $vrorder_model->editVrorder($update_order, array('order_id' => $order_info['order_id']));
            if (!$update) {
                throw new \think\Exception(lang('ds_common_save_fail'), 10006);
            }
                //如果是拼团
                if ($order_info['order_promotion_type']==2) {
                    $ppintuangroup_model=model('ppintuangroup');
                    $ppintuangroup_info=Db::name('ppintuangroup')->where('pintuangroup_id', $order_info['promotions_id'])->lock(true)->find();
                    if($ppintuangroup_info && $ppintuangroup_info['pintuangroup_state']==1){
                        if($ppintuangroup_info['pintuangroup_joined']==0){
                            //拼团统计开团数量
                            $condition=array();
                            $condition[]=array('pintuan_id','=', $ppintuangroup_info['pintuan_id']);
                            Db::name('ppintuan')->where($condition)->inc('pintuan_count')->update();
                        }
                        //开团统计新增人数
                        Db::name('ppintuangroup')->where('pintuangroup_id', $order_info['promotions_id'])->inc('pintuangroup_joined')->update();
                        if(($ppintuangroup_info['pintuangroup_joined']+1)>=$ppintuangroup_info['pintuangroup_limit_number']){
                            $condition = array();
                            $condition[] = array('pintuangroup_id','=', $order_info['promotions_id']);
                            $ppintuangroup_model->successPpintuangroup($condition,$condition);
                            $this->addVrorderCode($order_info);
                            $condition=array();
                            $condition[]=array('pintuan_id','=', $ppintuangroup_info['pintuan_id']);
                            Db::name('ppintuan')->where($condition)->inc('pintuan_ok_count')->update();
                        }
                    }
                    
                }elseif($order_info['virtual_type']==0){//虚拟商品拼团等拼团成功再发兑换码
                $this->addVrorderCode($order_info);
            }else{
                    $result = $this->changeOrderStateSuccess($order_info['order_id']);
                    if (!$result['code']) {
                        return $result;
                    }
                }

            Db::commit();
            return ds_callback(true, '更新成功');

        } catch (Exception $e) {
            Db::rollback();
            return ds_callback(false, $e->getMessage());
        }
    }
    
    public function addVrorderCode($order_info) {
        $vrorder_model = model('vrorder');
        //发放兑换码
        $insert = $vrorder_model->addVrorderCode($order_info);
        if (!$insert) {
            throw new \think\Exception('兑换码发送失败', 10006);
        }

        // 支付成功发送买家消息
        $param = array();
        $param['code'] = 'order_payment_success';
        $param['member_id'] = $order_info['buyer_id'];
                //阿里短信参数
                $param['ali_param'] = array(
                    'order_sn' => $order_info['order_sn'],
                );
                $param['ten_param'] = array(
                    $order_info['order_sn'],
                );
        $param['param'] = array_merge($param['ali_param'],array(
            'order_url' => HOME_SITE_URL .'/Membervrorder/show_order?order_id='.$order_info['order_id']
        ));
        //微信模板消息
                $param['weixin_param'] = array(
                    'url' => config('ds_config.h5_site_url').'/pages/member/vrorder/OrderDetail?order_id='.$order_info['order_id'],
                    'data'=>array(
                        "keyword1" => array(
                            "value" => $order_info['order_sn'],
                            "color" => "#333"
                        ),
                        "keyword2" => array(
                            "value" => $order_info['goods_name'],
                            "color" => "#333"
                        ),
                        "keyword3" => array(
                            "value" => $order_info['order_amount'],
                            "color" => "#333"
                        ),
                        "keyword4" => array(
                            "value" => date('Y-m-d H:i',$order_info['add_time']),
                            "color" => "#333"
                        )
                    ),
                );
        model('cron')->addCron(array('cron_exetime'=>TIMESTAMP,'cron_type'=>'sendMemberMsg','cron_value'=>serialize($param)));

        // 支付成功发送店铺消息
        $param = array();
        $param['code'] = 'new_order';
        $param['store_id'] = $order_info['store_id'];
        $param['ali_param'] = array(
            'order_sn' => $order_info['order_sn']
        );
        $param['ten_param'] = array(
            $order_info['order_sn']
        );
        $param['param'] = $param['ali_param'];
        $param['weixin_param']=array(
                    'url' => config('ds_config.h5_store_site_url').'/pages/seller/vrorder/OrderDetail?order_id='.$order_info['order_id'],
                    'data'=>array(
                        "keyword1" => array(
                            "value" => $order_info['order_sn'],
                            "color" => "#333"
                        ),
                        "keyword2" => array(
                            "value" => $order_info['goods_name'],
                            "color" => "#333"
                        ),
                        "keyword3" => array(
                            "value" => $order_info['order_amount'],
                            "color" => "#333"
                        ),
                        "keyword4" => array(
                            "value" => date('Y-m-d H:i',$order_info['add_time']),
                            "color" => "#333"
                        )
                    ),
                );
        model('cron')->addCron(array('cron_exetime'=>TIMESTAMP,'cron_type'=>'sendStoremsg','cron_value'=>serialize($param)));

        //发送兑换码到手机 
        $param = array(
            'order_id' => $order_info['order_id'], 'buyer_id' => $order_info['buyer_id'],
            'buyer_phone' => $order_info['buyer_phone']
        );
        $vrorder_model->sendVrCode($param);
    }

    /**
     * 完成订单
     * @param int $order_id
     * @return array
     */
    public function changeOrderStateSuccess($order_id)
    {
        $vrorder_model = model('vrorder');
        $condition = array();
        $condition[] = array('vr_state','=',0);
        $condition[] = array('refund_lock','in', array(0, 1));
        $condition[] = array('order_id','=',$order_id);
        $condition[] = array('vr_indate','>',TIMESTAMP);
        $order_code_info = $vrorder_model->getVrordercodeInfo($condition, '*');
        if (empty($order_code_info)) {
            $update = $vrorder_model->editVrorder(array(
                                                     'order_state' => ORDER_STATE_SUCCESS, 'finnshed_time' => TIMESTAMP
                                                 ), array('order_id' => $order_id));
            if (!$update) {
                ds_callback(false, '更新失败');
            }
        }

            
        $order_info = $vrorder_model->getVrorderInfo(array('order_id' => $order_id));
        //添加会员积分
        if (config('ds_config.points_isuse') == 1) {
            model('points')->savePointslog('order', array(
                'pl_memberid' => $order_info['buyer_id'], 'pl_membername' => $order_info['buyer_name'],
                'orderprice' => $order_info['order_amount'], 'order_sn' => $order_info['order_sn'],
                'order_id' => $order_info['order_id']
            ), true);
        }

        //添加会员经验值
        model('exppoints')->saveExppointslog('order', array(
            'explog_memberid' => $order_info['buyer_id'], 'explog_membername' => $order_info['buyer_name'],
            'orderprice' => $order_info['order_amount'], 'order_sn' => $order_info['order_sn'],
            'order_id' => $order_info['order_id']
        ), true);

        return ds_callback(true, '更新成功');
    }
}