<?php
class B2cOrder extends B2cBase
{
	/**
	  * @method 获取支付方式
	  * @param  $status  1:启用的  0所有
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> ['pam_code'=>['pam_status'=>1, 'pam_name'=>''], ....] ["code"]=> int(0) ]
	  */
	public function getPayMethod($status = 1)
	{
		$resArr = [];
		$where = empty($status)? '': ' and pam_status = 1';
		$Res = $this->get('or_pay_method', ['*'], $where);
		foreach($Res['data'] as $V)
		{
			$resArr[$V['pam_code']] = $V;
		}
		return LibFc::ReturnData(true, $resArr);
	}


	/**
	  * @method 订单状态变化日志
	  * @param  $dataArr ['orl_ord_id'=>xx,....]【or_order_log】
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function orderLog($dataArr)
	{
		if(!empty($dataArr['orl_ord_id']))
		{
			$ordIdArr = explode(',', $dataArr['orl_ord_id']);
			$this->B2CDb->Begin();
			foreach($ordIdArr as $ordId)
			{
				$dataArr['orl_ord_id'] = $ordId;
				$dataArr['orl_uid'] = mvc::$cfg['LOGUSER']['uid'];
				$dataArr['orl_by_uname'] = mvc::$cfg['LOGUSER']['urname'];
				$dataArr['orl_atime'] = time();
				$res = $this->add('or_order_log', $dataArr);
				$dataArr['orl_id'] = $res['data'];
			}
			$this->B2CDb->End();
		}
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 获取支付明细ID
	  * @param $where  string 【不包含ordIdArr】
	  * @param $ordIdArr array [111,...]
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> opl_id ["code"]=> int(0) ]
	  */
	public function getPayListId($where, $ordIdArr)
	{
		if(!empty($ordIdArr))
		{
			foreach($ordIdArr as $k=>$v)
			{
				$ordIdArr[$k] = (int) $v;
			}
			sort($ordIdArr);
			$table = 'or_order_pay_list left join or_order_pay_list_link on opll_opl_id = opl_id';
			$res = $this->get($table, ['opl_id', 'opll_ord_id'], sprintf(" %s and opll_ord_id in (%s) order by opl_id, opll_ord_id", $where, implode(',', $ordIdArr)));
			$tempArr = [];
			foreach($res['data'] as $v)
			{
				$tempArr[$v['opl_id']][] = $v['opll_ord_id'];
			}
			$arr = [];
			foreach($tempArr as $k=>$v)
			{
				if($v == $ordIdArr)
				{
					$arr[] =$k;
				}
			}
			return LibFc::ReturnData(true, $arr);
		}
		return LibFc::ReturnData(false, 'getPayListId提供的参数不正确');
	}
	

	/**
	  * @method 创建支付明细记录
	  * @param $ordIdArr array [111,...]
	  * @param $dataArr  array ['opl_pam_code'=>xx, 'opl_money'=>, 'opl_por_id'=>....]【or_order_pay_list】
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> opl_id ["code"]=> int(0) ]
	  */
	public function addPayList($ordIdArr, $dataArr)
	{
		if(!empty($ordIdArr) && !empty($dataArr))
		{
			$this->B2CDb->Begin();
			$dataArr['opl_status'] = 'wait';
			$dataArr['opl_add_time'] = time();
			$res = $this->add('or_order_pay_list', $dataArr);
			$dataArr['opl_id'] = $res['data'];
			foreach($ordIdArr as $k=>$v)
			{
				$v = (int) $v;
				if($v > 0)
				{
					$this->add('or_order_pay_list_link', ['opll_opl_id'=>$dataArr['opl_id'], 'opll_ord_id'=>$v]);
				}
			}
			$this->B2CDb->End();
			return LibFc::ReturnData(true, $dataArr['opl_id']);
		}
		return LibFc::ReturnData(false, 'addPayList提供的参数不正确');
	}


	/**
	  * @method 通过$oplId设置对应的订单付款成功
	  * @param  $oplId  int 付款明细ID 【or_order_pay_list】
	  * @author soul
	  * @copyright 2017/8/24
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function payOkByoplId($oplId)
	{
		$oplId = (int) $oplId;
		$res = $this->get('or_order_pay_list', ['opl_id', 'opl_money', 'opl_status', 'opl_por_id'], sprintf(" and opl_id=%d", $oplId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '付款明细oplId不存在或者已被删除');
		$oplArr = $res['data'];

		if($oplArr['opl_status'] == 'paied')
		{
			return LibFc::ReturnData(true);
		}
		else if($oplArr['opl_status'] == 'wait')
		{}
		else
		{
			return LibFc::ReturnData(false, '此支付交易已关闭。');
		}

		//获取对应的支付订单号
		$res = $this->getFieldUniVal('or_order_pay_list_link', 'opll_ord_id', sprintf(" and opll_opl_id=%d", $oplId));
		$oplArr['ordIds'] = $res['data'];
		$ordIds = implode(',', $oplArr['ordIds']);
		
		//重新计算订单金额
		$res = $this->get('or_order', ['count(ord_id) count', 'sum(ord_pay_money) ord_pay_money'], sprintf(" and ord_id in (%s) and ord_status='creat'", $ordIds), true);
		//订单相同并且支付金额一致
		if($res['data']['count'] == count($oplArr['ordIds']) && $res['data']['ord_pay_money'] == $oplArr['opl_money'])
		{}
		else
		{
			return LibFc::ReturnData(false, '付款金额与订单金额不一致！');
		}

		//调取支付平台的支付信息
		$LibYpApi = new LibYpApi();
		$res = $LibYpApi->get('order/checkPay', [], ['por_id'=>$oplArr['opl_por_id']]);
		
		$payArr = $res['data'];
		if($payArr['por_status'] == 1 && $payArr['por_money'] == $oplArr['opl_money'])
		{}
		else
		{
			return LibFc::ReturnData(false, '付款尚未成功或者付款金额与订单金额不一致！');
		}
		//修改订单状态
		$this->B2CDb->Begin();

		//支付明细状态
		$setArr = [
			'opl_status'=>'paied',
			'opl_pay_time'=>$payArr['por_pay_time'],
			'opl_check_by'=>mvc::$cfg['LOGUSER']['urname'],
			'opl_chekc_time'=>time()
		];
		$this->set('or_order_pay_list', $setArr, sprintf(" and opl_id=%d", $oplArr['opl_id']));
		
		//订单、配件状态
		$setArr = [
			'ord_status'=>'paied',
			'ord_pay_time'=>$payArr['por_pay_time']
		];
		$this->set('or_order', $setArr, sprintf(" and ord_id in (%s) and ord_status='creat'", $ordIds));
		$this->set('or_order_product', ['orp_status'=>'paied'], sprintf(" and orp_ord_id in (%s) and orp_status='creat'", $ordIds));

		//添加订单状态日志
		$logArr = [
			'orl_ord_id'=>$ordIds,
			'orl_old_status'=>'creat',
			'orl_new_status'=>'paied',
			'orl_text'=>'订单ID：'.$ordIds.'付款成功，支付流水号：'.$oplArr['opl_id'],
		];
		$this->orderLog($logArr);

		$res = $this->get('or_order', ['ord_uid'], sprintf(" and ord_id in (%s) limit 1", $ordIds), true);
		$orderData = $res['data'];

		$moneyLogArr = [
			'mol_uid'=>$orderData['ord_uid'],
			'mol_ord_ids'=>$ordIds,
			'mol_type'=>0,
			'mol_money'=>-$oplArr['opl_money'],
			'mol_des'=>'订单ID：'.$ordIds.'付款成功，支付流水号：'.$oplArr['opl_id'],
			'mol_opl_id'=>$oplArr['opl_id']
		];
		$B2cMoney = new B2cMoney();
		$B2cMoney->addUserMoney($moneyLogArr);
		//更改库存
		$this->updateOrdSaleNum(explode(',', $ordIds), 'add','pay');
		//关闭其余待支付的支付明细
		$table = 'or_order_pay_list left join or_order_pay_list_link on opll_opl_id = opl_id';
		$res = $this->getFieldUniVal($table, 'opl_id', sprintf(" and opll_ord_id in (%s) and opl_status='wait'", $ordIds));
		if(!empty($res['data']))
		{
			$this->closeOplIds($res['data']);
		}
		$this->B2CDb->End();
		// 将订单当前的状态发送给商户负责人
		$this->sendOrdStatBySms(explode(',', $ordIds));
		return LibFc::ReturnData(true);
	}

	/**
	  * @method 将当前订单状态发送给店铺负责人
	  * @param  $ordIds [int|arr] 订单ID
	  * @author xu
	  * @copyright 2018/06/25
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function sendOrdStatBySms($ordIds)
	{
		if(!is_array($ordIds)) $ordIds = [$ordIds];
		if(empty($ordIds = array_filter($ordIds,'LibFc::Int')))
		{
			return LibFc::ReturnData(true,true);
		}

		// 获取订单状态
		$table = "or_order left join sh_shop on shop_id=ord_shop_id ";
		$where = sprintf("and ord_id in (%s)",implode(',', $ordIds));
		$res = $this->get($table,['*'],$where);

		// 订单状态枚举
		$statusDes = ['creat' => '待付款','paied'=>'已付款','send'=>'已发货','cancel'=>'已取消','completed'=>'已完成'];
		$LibYpApi = new LibYpApi();
		foreach ($res['data'] as $k => $v)
		{
			if(!empty($v['shop_main_tel']) && $v['ord_status']!='cancel' && preg_match("/^\d{11}$/",$v['shop_main_tel']))
			{
				$dataArr = [
					'sms_type'=>'紧急',
					'sms_from'=>'B2C',
					'sms_style'=>'orderStatus',
					'sms_to_mobile'=>$v['shop_main_tel'],//负责人电话
					'sms_text'=>'{"ordId":"'.$v['ord_id'].'", "status":"'.$statusDes[$v['ord_status']].'"}'
				];
				$LibYpApi->Get('sms/send', [], $dataArr);
			}
		}
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 批量关闭订单生产的支付码
	  * @param  $ordIdArr  array 订单ID
	  * @author soul
	  * @copyright 2017/8/24
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function closeOrderPay($ordIdArr)
	{
		if(!empty($ordIdArr) && is_array($ordIdArr))
		{
			foreach($ordIdArr as $k=>$v)
			{
				$ordIdArr[$k] = (int) $v;
			}
			$porIdArr = [];
			$res = $this->get('or_order_pay_list_link join or_order_pay_list on opl_id=opll_opl_id', ['opl_id'], sprintf(" and opll_ord_id in (%s) and opl_status='wait'", implode(',', $ordIdArr)));
			$this->closeOplIds(array_column($res['data'], 'opl_id'));
		}
		return LibFc::ReturnData(true);
	}

	
	/**
	  * @method 批量关闭支付
	  * @param  $oplIdArr  array 付款明细ID 【or_order_pay_list】
	  * @author soul
	  * @copyright 2017/8/24
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function closeOplIds($oplIdArr)
	{
		if(!empty($oplIdArr) && is_array($oplIdArr))
		{
			foreach($oplIdArr as $k=>$v)
			{
				$oplIdArr[$k] = (int) $v;
			}
			$closeOplIdArr = [];
			$porIdArr = [];
			$res = $this->get('or_order_pay_list', ['opl_id', 'opl_por_id'], sprintf(" and opl_id in (%s) and opl_status='wait'", implode(',', $oplIdArr)));
			if(!empty($res['data']))
			{
				foreach($res['data'] as $v)
				{
					$closeOplIdArr[] = $v['opl_id'];
					if($v['opl_por_id'] > 0)
						$porIdArr[$v['opl_id']] = $v['opl_por_id'];
				}
				if(!empty($porIdArr))
				{
					$LibYpApi = new LibYpApi();
					$LibYpApi->get('order/closePay', [], ['por_id'=>$porIdArr]);
				}
				$setArr = [
					'opl_status'=>'close',
					'opl_check_by'=>mvc::$cfg['LOGUSER']['urname'],
					'opl_chekc_time'=>time()
				];
				$this->set('or_order_pay_list', $setArr, sprintf(" and opl_id in (%s)", implode(',', $closeOplIdArr)));	
			}
		}
		return LibFc::ReturnData(true);
	}






	/**
	  * @method 某订单确认收货   只有处于send并且无退款中的订单才可以确认收货
	  * @param  $orderId  订单ID
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function orderCompleted($orderId)
	{
		$uid = (int) $uid;
		$orderId = (int) $orderId;
		$res = $this->get('or_order', ['*'], sprintf(" and ord_id=%d", $orderId), true);
		if(empty($res['data']))
		{
			return LibFc::ReturnData(false, '订单不存在');
		}
		$orderArr = $res['data'];

		//订单已完成
		if($orderArr['ord_status'] == 'completed')
		{
			return LibFc::ReturnData(true);
		}
		else if($orderArr['ord_status'] != 'send')
		{
			return LibFc::ReturnData(false, '订单有配件处于非“待确认收货”状态，不允许确认收货');
		}

		//有申请退款中
		$res = $this->get('or_refund_pact', ['count(*) count'], sprintf(" and rep_ord_id=%d and rep_status not in ('close', 'refunded')", $orderArr['ord_id']), true);
		if(!empty($res['data']['count']))
		{
			return LibFc::ReturnData(false, '订单处于退款中，不允许确认收货');
		}

		//已退款的金额
		$res = $this->get('or_refund_pact', ['SUM(rep_money) rep_money'], sprintf(" and rep_ord_id=%d and rep_status='refunded'", $orderArr['ord_id']), true);
		$refundedMoney = $res['data']['rep_money'];

		$this->B2CDb->Begin();

		//卖家应收款
		$orderArr['money'] = $orderArr['ord_pay_money'] - $refundedMoney;
		
		//卖家余额变更
		$B2cMoney = new B2cMoney();
		$addArr = [
			'mon_shop_id'=>$orderArr['ord_shop_id'],
			'mon_stype'=>0,
			'mon_pay_by'=>1,
			'mon_dataid'=>$orderArr['ord_id'],
			'mon_money'=>$orderArr['money'],
			'mon_title'=>'订单ID：'.$orderArr['ord_id'].'确认收货'
		];
		$B2cMoney->addShopMoney($addArr);

		//订单状态修改
		$this->set('or_order', ['ord_status'=>'completed', 'ord_completed_time'=>time()], sprintf(" and ord_id=%d", $orderArr['ord_id']));

		//订单的配件状态
		$this->set('or_order_product', ['orp_status'=>'completed','orp_completed_time'=>time(),'orp_completed'=>1], sprintf(" and orp_ord_id=%d and orp_status='send'", $orderArr['ord_id']));

		//添加订单状态日志
		$logArr = [
			'orl_ord_id'=>$orderArr['ord_id'],
			'orl_old_status'=>$orderArr['ord_status'],
			'orl_new_status'=>'completed',
			'orl_text'=>'订单ID：'.$orderArr['ord_id'].'确认收货'
		];
		$this->orderLog($logArr);

		$this->B2CDb->End();
		return LibFc::ReturnData(true);
	}

	/**
	  * @method 退款原因
	  * @param  $type all 0仅退款  1退货退款   2换货   3卖家拒绝退款申请理由
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> [0=>['', ''], ....] ["code"]=> int(0) ]
	  */
	public function getRefundReason($type = 'all')
	{
		$arr = [
			0=>['多拍/拍错/不想要', '快递一直未送到', '未按约定时间发货', '快递无跟踪记录', '空包裹/少货', '其他'],	
			1=>['拍错/不喜欢/效果不好', '质量问题', '尺寸/规格不符', '卖家发错货', '假冒品牌', '收到商品少件/破损/污渍等', '其他'],	
			2=>['质量问题', '尺寸/规格不符', '卖家发错货', '假冒品牌', '收到商品少件/破损/污渍等', '其他'],
			3=>['商品已经影响二次销售', '申请时间已超售后服务时限', '请承担发货运费，商品发出时完好']
		];
		$data = $type == 'all'? $arr: $arr[$type];
		return LibFc::ReturnData(true, $data);
	}


	/**
	  * @method 退款方式
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> [0=>['', ''], ....] ["code"]=> int(0) ]
	  */
	public function getRefundType()
	{
		return LibFc::ReturnData(true, [0=>'仅退款', 1=>'退款退货', 2=>'换货']);
	}

	
	/**
	  * @method 订单配件ID可退款金额
	  * @param  $orpId 订单配件ID
	  * @param  $repId 退款ID  优先
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> ['maxMoney'=>最高可退, 'proMoney'=>配件可退, 'freightMoney'=>运费可退] ["code"]=> int(0) ]
	  */
	public function getRefundMoney($orpId = 0, $repId = 0)
	{
		$orpId = (int) $orpId;
		$repId = (int) $repId;
		$moneyArr = ['maxMoney'=>0.00, 'proMoney'=>0.00, 'freightMoney'=>0.00];

		if($repId > 0)
		{
			$res = $this->get('or_refund_pact', ['rep_id', 'rep_orp_id'], sprintf(" and rep_id=%d", $repId), true);
			if(empty($res['data']))
				return LibFc::ReturnData(false, '退款记录不存在');
			$orpId = $res['data']['rep_orp_id'];
		}

		$res = $this->get('or_order_product', ['orp_id', 'orp_ord_id', 'orp_money', 'orp_status', 'orp_completed_time'], sprintf(" and orp_id=%d", $orpId), true);
		if(empty($res['data']))
			return LibFc::ReturnData(false, '订单配件记录不存在');
		$orpArr = $res['data'];

		$res = $this->get('or_order', ['ord_id', 'ord_freight_money'], sprintf(" and ord_id=%d", $orpArr['orp_ord_id']), true);
		if(empty($res['data']))
			return LibFc::ReturnData(false, '订单不存在');
		$orderArr = $res['data'];

		//只有已支付、已发货、已完成的配件才可以申请退款
		if(!in_array($orpArr['orp_status'], ['paied', 'send', 'completed', 'refund']))
		{
			return LibFc::ReturnData(false, '此状态不允许申请退款');
		}

		if(empty($repId))
		{
			if($orpArr['orp_status'] == 'completed' && time() > ($orpArr['orp_completed_time'] + mvc::$cfg['ORDER']['refundDate']*24*3600))
				return LibFc::ReturnData(false, '您已错过了申请售后的时间段（交易完成'.mvc::$cfg['ORDER']['refundDate'].'天内）');
		}

		//可退运费
		$moneyArr['freightMoney'] = $orderArr['ord_freight_money'];
		if($orderArr['ord_freight_money'] > 0)
		{
			//已退或者退款中总运费
			$res = $this->get('or_refund_pact', ['sum(rep_freight_money) rep_freight_money'], sprintf(" and rep_id!=%d and rep_status !='close' and rep_ord_id=%d", $repId, $orpArr['orp_ord_id']), true);
			// print_r($res);
			// die;
			$moneyArr['freightMoney'] -= $res['data']['rep_freight_money'];
		}
		// print_r($orpArr);
		//此订单配件已退金额(已退或者退款中)，不含运费
		$moneyArr['proMoney'] = $orpArr['orp_money'];
		$res = $this->get('or_refund_pact',  ['sum(rep_money-rep_freight_money) rep_pro_money'], sprintf(" and rep_status ='refunded' and rep_orp_id=%d", $orpArr['orp_id']), true);
		$moneyArr['proMoney'] -= $res['data']['rep_pro_money'];

		$moneyArr['maxMoney'] = sprintf('%.2f', $moneyArr['proMoney'] + $moneyArr['freightMoney']);
		return LibFc::ReturnData(true, $moneyArr);
	}


	/**
	  * @method 申请退款
	  * @param  $dataArr   ['rep_orp_id'=>订单产品记录ID,
							'rep_type'=>0仅退款  1退货退款   2换货,
							'rep_money'=>实际退款金额,
							'rep_reason'=>退款理由,
							'rep_instructions'=>买方退款说明,
							'rep_freight_money'=>退还运费金额
						   ]
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function addRefund($dataArr)
	{
		$dataArr['rep_uid'] = (int) $dataArr['rep_uid'];

		if($dataArr['rep_instructions']&&strlen($dataArr['rep_instructions'])>200)
		{
			$dataArr['rep_instructions'] = mb_substr($dataArr['rep_instructions'], 0,200);
		}
		
		$res = $this->getEnum('rep_type');
		$repType = $res['data'];
		if(!isset($dataArr['rep_orp_id']) || $dataArr['rep_orp_id'] < 1)
			return LibFc::ReturnData(false, '订单配件记录不存在');
		if(!isset($repType[$dataArr['rep_type']]))
			return LibFc::ReturnData(false, '退款类型参数rep_type有误');
		if(!isset($dataArr['rep_money']) || !isset($dataArr['rep_reason']) || $dataArr['rep_uid'] < 1)
			return LibFc::ReturnData(false, '退款申请参数有误');

		$dataArr['rep_money'] = sprintf('%.2f', $dataArr['rep_money']);

		$res = $this->get('or_order_product join or_order on orp_ord_id = ord_id', ['orp_id', 'orp_ord_id', 'ord_shop_id','orp_money', 'orp_status', 'orp_completed_time'], sprintf(" and orp_id=%d and ord_uid=%d", $dataArr['rep_orp_id'], $dataArr['rep_uid']), true);
		if(empty($res['data']))
			return LibFc::ReturnData(false, '订单配件记录不存在');
		$orpArr = $res['data'];

		$res = $this->get('or_refund_pact', ['rep_id'], sprintf(" and rep_status not in ('close', 'refunded') and rep_orp_id=%d", $orpArr['orp_id']), true);
		if(!empty($res['data']))
			return LibFc::ReturnData(false, '此配件已申请售后，且尚未处理完毕，请勿重复申请');

		//获取可退款金额
		$res = $this->getRefundMoney($dataArr['rep_orp_id']);
		$moneyArr = $res['data'];
	
		if($dataArr['rep_money'] > $moneyArr['maxMoney'])
			return LibFc::ReturnData(false, '您最多可以申请退款'.$moneyArr['maxMoney'].'元');
		
		$this->B2CDb->Begin();

		// 更改订单配件表的退款状态
		$this->set("or_order_product", ['orp_refund_status'=>'wait'],sprintf(" and orp_id=%d", $dataArr['rep_orp_id']));

		$dataArr['rep_status'] = 'wait';
		$dataArr['rep_apply_time'] = time();
		$dataArr['rep_atime'] = time();
		$dataArr['rep_pmc_guid'] = LibFc::guid();
		$dataArr['rep_pre_guid'] = $dataArr['rep_pmc_guid'];
		$dataArr['rep_ord_id'] = $orpArr['orp_ord_id'];
		$dataArr['rep_shop_id'] = $orpArr['ord_shop_id'];

		//计算出退款金额中退运费金额
		$dataArr['rep_freight_money'] = $dataArr['rep_money'] <= $moneyArr['proMoney']? 0.00: sprintf('%.2f', $dataArr['rep_money']-$moneyArr['proMoney']);
		// print_r($dataArr['rep_freight_money']);
		// die;
		$dataArr['rep_pro_status'] = empty($dataArr['rep_pro_status']) ? 0: 1;
		$dataArr['rep_status'] =  'wait';
		unset($dataArr['rep_id']);
		$res = $this->add('or_refund_pact', $dataArr);
		$dataArr['rep_id'] = $res['data'];

		$res = $this->getEnum('rep_pro_status');
		$rep_pro_status = $res['data'];

		if($dataArr['rep_instructions']!="")
		{
			//退款日志
			$logArr = [
				'rel_rep_id'=>$dataArr['rep_id'],
				'rel_txt'=>'发起了'.$repType[$dataArr['rep_type']].'申请，货物状态：'.$rep_pro_status[$dataArr['rep_pro_status']].'，原因：'.$dataArr['rep_reason'].'，金额：'.$dataArr['rep_money'].'元，说明：'.$dataArr['rep_instructions'].'。',
				'rel_utype'=>1
			];
		}
		else
		{
			//退款日志
			$logArr = [
				'rel_rep_id'=>$dataArr['rep_id'],
				'rel_txt'=>'发起了'.$repType[$dataArr['rep_type']].'申请，货物状态：'.$rep_pro_status[$dataArr['rep_pro_status']].'，原因：'.$dataArr['rep_reason'].'，金额：'.$dataArr['rep_money'].'元。',
				'rel_utype'=>1
			];
		}
		$this->addRefundLog($logArr);

		$YpwBase = new YpwBase();
		$userres = $YpwBase->get('yp_user', ['u_id','u_mobile'], sprintf(" and u_id in (%d)", $orpArr['ord_shop_id']), true);
		$sArr = [
			'sms_type'=>'紧急',
			'sms_from'=>mvc::$cfg['FROM']?mvc::$cfg['FROM']:'PJD',
			'sms_style'=>'pjlOrderRefund',
			'sms_to_mobile'=>$userres['data']['u_mobile'],
			'sms_text'=>'{"sitetag":"跑街的","ordId":"'.$orpArr['orp_ord_id'].'", "status":"买家发起'.$repType[$dataArr['rep_type']].'申请"}'
		];
		$LibYpApi = new LibYpApi();
		$LibYpApi->Get('sms/send',[], $sArr);

		$this->B2CDb->End();
		return LibFc::ReturnData(true, $dataArr['rep_id']);
	}


	/**
	  * @method 修改退款
	  * @param  $repId 退款ID
	  * @param  $dataArr   ['rep_orp_id'=>订单产品记录ID,
							'rep_type'=>0仅退款  1退货退款   2换货,
							'rep_money'=>实际退款金额,
							'rep_reason'=>退款理由,
							'rep_instructions'=>买方退款说明,
							'rep_freight_money'=>退还运费金额
						   ]
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function setRefund($repId, $dataArr)
	{
		unset($dataArr['rep_ord_id']);
		unset($dataArr['rep_orp_id']);

		if($dataArr['rep_instructions']&&strlen($dataArr['rep_instructions'])>200)
		{
			$dataArr['rep_instructions'] = mb_substr($dataArr['rep_instructions'], 0,200);
		}

		$repId = (int) $repId;
		$dataArr['rep_uid'] = (int) $dataArr['rep_uid'];
		$res = $this->get('or_refund_pact', ['*'], sprintf(" and rep_status in ('wait','refuse') and rep_id=%d and rep_uid=%d", $repId, $dataArr['rep_uid']), true);
		if(empty($res['data']))
			return LibFc::ReturnData(false, '退款记录不存在或者当前状态下不允许修改退款数据');
		$repArr = $res['data'];
		
		//退款类型
		if(isset($dataArr['rep_type']))
		{
			$res = $this->getEnum('rep_type');
			$repType = $res['data'];
			if(!isset($repType[$dataArr['rep_type']]))
				return LibFc::ReturnData(false, '退款类型参数有误');
		}
		
		//可退金额
		$res = $this->getRefundMoney($repArr['rep_orp_id'], $repId);
		$moneyArr = $res['data'];

		if(isset($dataArr['rep_money']))
		{	
			$dataArr['rep_money'] = sprintf('%.2f', $dataArr['rep_money']);
			if($dataArr['rep_money'] > $moneyArr['maxMoney'])
				return LibFc::ReturnData(false, '您最多可以申请退款'.$moneyArr['maxMoney'].'元');
		}
		$this->B2CDb->Begin();

		$dataArr['rep_etime'] = time();

		$dataArr['rep_freight_money'] = $dataArr['rep_money'] <= $moneyArr['proMoney']? 0.00: sprintf('%.2f', $dataArr['rep_money']-$moneyArr['proMoney']);

		// 改为等待卖家确认状态
		$dataArr['rep_status'] = 'wait';
		$this->set('or_refund_pact', $dataArr, sprintf(" and rep_id=%d", $repArr['rep_id']));
		
		if(isset($dataArr['rep_status']))
		{
			$this->set("or_order_product",array('orp_refund_status'=>$dataArr['rep_status']),sprintf(" and orp_id=%d", $repArr['rep_orp_id']));
		}

		$res = $this->getEnum('rep_pro_status');
		$rep_pro_status = $res['data'];

		//退款日志
		$logArr = [
			'rel_rep_id'=>$dataArr['rep_id'],
			'rel_utype'=>1,
			'rel_txt'=>'修改退款协议'
		];
		if(isset($dataArr['rep_type']))
			$logArr['rel_txt'] .= '，退款方式：'.$repType[$dataArr['rep_type']];
		if(isset($dataArr['rep_pro_status']))
			$logArr['rel_txt'] .= '，货物状态：'.$rep_pro_status[$dataArr['rep_pro_status']];
		if(isset($dataArr['rep_money']) && $dataArr['rep_type']!=2)
			$logArr['rel_txt'] .= '，金额：'.$dataArr['rep_money'];
		if(isset($dataArr['rep_reason']))
			$logArr['rel_txt'] .= '，原因：'.$dataArr['rep_reason'];
		if(isset($dataArr['rep_instructions']))
			$logArr['rel_txt'] .= '，说明：'.($dataArr['rep_instructions']?$dataArr['rep_instructions']:'无');
		$this->addRefundLog($logArr);

		$YpwBase = new YpwBase();
		$userres = $YpwBase->get('yp_user', ['u_id','u_mobile'], sprintf(" and u_id in (%d)", $repArr['rep_shop_id']), true);
		$dataArr = [
			'sms_type'=>'紧急',
			'sms_from'=>mvc::$cfg['FROM']?mvc::$cfg['FROM']:'PJD',
			'sms_style'=>'pjlOrderRefund',
			'sms_to_mobile'=>$userres['data']['u_mobile'],
			'sms_text'=>'{"sitetag":"跑街的","ordId":"'.$repArr['rep_ord_id'].'", "status":"退款协议发生变更"}'
		];
		$LibYpApi = new LibYpApi();
		$LibYpApi->Get('sms/send',[], $dataArr);

		$this->B2CDb->End();
		return LibFc::ReturnData(true, $repId);
	}


	/**
	  * @method 添加退款日志
	  * @param  $dataArr
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function addRefundLog($dataArr)
	{
		if(empty($dataArr['rel_rep_id']) || empty($dataArr['rel_txt']))
			return LibFc::ReturnData(false, 'addRefundLog参数有误');
		$dataArr['rel_rep_id'] = (int) $dataArr['rel_rep_id'];
		$dataArr['rel_by_uid'] = mvc::$cfg['LOGUSER']['uid'];
		$dataArr['rel_by_uname'] = mvc::$cfg['LOGUSER']['urname'];
		$dataArr['rel_atime'] = time();
		return $this->add('or_refund_log', $dataArr);
	}


	/**
	  * @method 订单退款-确认完成操作
	  * @param  $repId  订单退款ID  1、原路返回  2、转买家微信【待开发】
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function refundCompleted($repId)
	{
		$repId = (int) $repId;
		$res = $this->get('or_refund_pact join or_order_product on orp_id=rep_orp_id', ['*'], sprintf(" and rep_id=%d", $repId), true);
		if(empty($res['data']))
		{
			return LibFc::ReturnData(false, '退款记录不存在');
		}
		$repArr = $res['data'];

		if($repArr['rep_status'] == 'refunded')
		{
			return LibFc::ReturnData(true);
		}
		if($repArr['rep_status'] == 'close')
			return LibFc::ReturnData(false, '退款已被关闭');

		$this->B2CDb->Begin();

		
		//需要退钱
		if($repArr['rep_money'] > 0)
		{
			$res = $this->getRefundMoney($repArr['rep_orp_id'], $repId);
			$moneyArr = $res['data'];

			if($repArr['rep_money'] > $moneyArr['maxMoney'])
				return LibFc::ReturnData(false, '最多可以退款'.$moneyArr['maxMoney'].'元');

			$B2cMoney = new B2cMoney();

			//已确认收货，先从冻结对应的退款资金
			$unvData['mou_id'] = 0;
			if($repArr['orp_completed'] == 1)
			{
				$res = $B2cMoney->getShopMoney($repArr['rep_shop_id']);
				if($res['data']['money_av'] < $repArr['rep_money'])
					return LibFc::ReturnData(false, '店铺可用资金不足，退款失败，请稍后重试');

				//先冻结资金
				$unvData = [
					'mou_shop_id'=>	$repArr['rep_shop_id'],
					'mou_status'=>	0,
					'mou_title'=> '订单ID：'.$repArr['orp_ord_id'].'确认退款，退款ID：'.$repId,
					'mou_money'=> $repArr['rep_money'],
					'mou_atime'=> time()
				];
				$res = $this->add('sh_money_unav', $unvData);
				$unvData['mou_id'] = $res['data'];
			}

			//查找原订单支付流水ID
			$res = $this->get('or_order_pay_list_link join or_order_pay_list on opl_id=opll_opl_id', ['opl_por_id'], sprintf(" and opll_ord_id=%d and opl_status = 'paied'", $repArr['orp_ord_id']), true);
			$payData = $res['data'];

			if(empty($repArr['rep_pre_guid'])) 
					return LibFc::ReturnData(false, 'rep_pre_guid为空，退款失败');

			$apiDataArr = [
				'pre_por_id'=>$payData['opl_por_id'],
				'pre_guid'=>$repArr['rep_pre_guid'],
				'pre_refund_money'=>$repArr['rep_money'],
				'pre_des'=>'订单ID：'.$repArr['orp_ord_id'].'确认退款，退款ID：'.$repId,
			];
			$LibYpApi = new LibYpApi();
			$res = $LibYpApi->get('order/refund', [], $apiDataArr);
			$refundOk = false;
			if(!empty($res['data']))
			{
				$refundOk = true;
				$setArr = [
					'rep_pre_id'=>$res['data'],
					'rep_refund_type'=>0,
					'rep_status'=>'refunded', 
					'rep_mou_id'=>$unvData['mou_id']
				];
			}
			else
			{
				//2、转账
				if(empty($repArr['rep_pmc_guid'])) 
					return LibFc::ReturnData(false, 'rep_pmc_guid为空，退款失败');

				$res = $this->get('us_user_base', ['ub_uid', 'UB_WX_OPENID', 'ub_wx_real_name'], sprintf(" and ub_uid=%d", $repArr['rep_uid']), true);
				$userData = $res['data'];
				if(empty($userData['UB_WX_OPENID'])) 
					return LibFc::ReturnData(false, '请先绑定收款微信账号。');

				$apiDataArr = [
					'pmc_u_id'=>$userData['ub_uid'],
					'pmc_guid'=>$repArr['rep_pmc_guid'],
					'pmc_from'=>'B2C',
					'pmc_to_openid'=>$userData['UB_WX_OPENID'],
					'pmc_to_name'=>$userData['ub_wx_real_name'],
					'pmc_pay_by'=>'weixin',
					'pmc_money'=>$repArr['rep_money'],
					'pmc_des'=> '订单ID：'.$repArr['orp_ord_id'].'确认退款，退款ID：'.$repId,
				];
				$LibYpApi = new LibYpApi();
				$res = $LibYpApi->get('order/mchPay', [], $apiDataArr);
				$mchArr = $res['data'];
				if(!empty($mchArr['pmc_id']))
				{
					$refundOk = true;
					$setArr = [
						'rep_pmc_id'=>$mchArr['pmc_id'],
						'rep_refund_type'=>1,
						'rep_status'=>'refunded', 
						'rep_mou_id'=>$unvData['mou_id']
					];
				}
				else
				{
					return LibFc::ReturnData(false, '退款异常，请稍后重试。'.$mchArr['err_msg']);
				}
			}
		}
		else
		{
			$setArr = ['rep_status'=>'refunded', 'rep_end'=>1];                                                                                                                                   
		}
		
		if($refundOk || $repArr['rep_money'] <= 0)
		{
			$setArr['rep_refunded_time'] = time();
			$this->set('or_refund_pact', $setArr, sprintf(" and rep_id=%d", $repArr['rep_id']));
			$this->set('or_order_product', ['orp_refund_status'=>'refunded'], sprintf(" and orp_id=%d", $repArr['orp_id']));

			//检查此配件是否下次可以继续申请退款
			$res = $this->get('or_order', ['ord_id', 'ord_pay_money', 'ord_status'], sprintf(" and ord_id=%d", $repArr['orp_ord_id']), true);
			$orderArr = $res['data'];

			$res = $this->get('or_refund_pact', ['sum(rep_money) rep_money'], sprintf(" and rep_ord_id=%d and rep_status='refunded'", $orderArr['ord_id']), true);
			$tempRepArr = $res['data'];
			//订单所有钱已退完，关闭订单
			if($orderArr['ord_pay_money'] == $tempRepArr['rep_money'])
			{
				$this->set('or_order', ['ord_status'=>'cancel'], sprintf(" and ord_id=%d", $orderArr['ord_id']));
				$this->set('or_order_product', ['orp_status'=>'cancel'], sprintf(" and orp_ord_id=%d", $orderArr['ord_id']));
				$logArr = [
					'orl_ord_id'=>$orderArr['ord_id'],
					'orl_old_status'=>$orderArr['ord_status'],
					'orl_new_status'=>'cancel',
					'orl_text'=>'退款ID'.$repId.'完成，订单关闭'
				];
				$this->orderLog($logArr);
			}
			$this->B2CDb->End();
			return LibFc::ReturnData(true);
		}
		else
		{
			return LibFc::ReturnData(false, '退款异常，请稍后重试。');
		}
	}


	/**
	  * @method 系统自动检测已付款，但是订单状态还是待付款
	  * @author soul
	  * @copyright 2018/3/1
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function autoPayOrder()
	{
		$res = $this->get('or_order_pay_list', ['*'], sprintf(" and opl_status='wait' and opl_add_time >%d", time()-86400*30));
		if(!empty($res['data']))
		{
			$checkPayArr = $res['data'];
			foreach($checkPayArr as $oplArr)
			{
				$this->B2CDb->Begin();
				$LibYpApi = new LibYpApi();
				$res = $LibYpApi->get('order/checkPay', [], ['por_id'=>$oplArr['opl_por_id']]);
				$payArr = $res['data'];
				if($payArr['por_status'] == 1 && $payArr['por_money'] == $oplArr['opl_money'])
				{
					$this->payOkByoplId($oplArr['opl_id']);
				}
				else if($payArr['por_status'] == -1)
				{
					$setArr = [
						'opl_status'=>'close',
						'opl_check_by'=>mvc::$cfg['LOGUSER']['urname'],
						'opl_chekc_time'=>time()
					];
					$this->set('or_order_pay_list', $setArr, sprintf(" and opl_id = %d ", $oplArr['opl_id']));	
				}
				$this->B2CDb->End();
			}
		}
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 系统自动检测检测退款状态
	  * @author soul
	  * @copyright 2018/3/1
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function autoOrderRefundStatus()
	{
		$res = $this->get('or_refund_pact', ['rep_id'], sprintf(" and rep_status != 'close' and rep_end = 0 and rep_apply_time >%d", time()-86400*30));
		
		if(!empty($res['data']))
		{
			foreach($res['data'] as $v)
			{
				$this->autoRefundStatus($v['rep_id']);
			}
		}
		return LibFc::ReturnData(true);
	}



	/**
	  * @method 系统自动确认收货（超时未确认）
	  * @author soul
	  * @copyright 2018/3/1
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function autoOkOrder()
	{
		//NOT in () and orp_send_time
		$endTime =  time()-86400*mvc::$cfg['ORDER']['autoPayDate'];
		$res = $this->get('or_order join or_order_product on ord_id = orp_ord_id', ['ord_id', 'orp_status', 'orp_send_time', 'orp_refund_status'], sprintf(" and ord_status='send' and ord_send_time <= %d", $endTime));
		if(!empty($res['data']))
		{
			$orderArr = [];
			foreach($res['data'] as $v)
			{
				$orderArr[$v['ord_id']] = [];
				if($v['orp_status'] != 'send')
					$orderArr[$v['ord_id']]['orp_status'][] = $v['orp_status'];
				if(in_array($v['orp_refund_status'], ['wait', 'confirm', 'refuse', 'refundpro']))
					$orderArr[$v['ord_id']]['orp_refund_status'][] = $v['orp_refund_status'];
				if($v['orp_send_time'] > $endTime)
					$orderArr[$v['ord_id']]['orp_send_time'][] = $v['orp_send_time'];
			}
			foreach($orderArr as $orderId=>$v)
			{
				if(empty($v['orp_status']) && empty($v['orp_send_time']) && empty($v['orp_refund_status']))
				$this->orderCompleted($orderId);
			}
		}
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 系统自动关闭24小时内未付款的订单
	  * @author soul
	  * @copyright 2018/3/1
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function autoCloseOrder()
	{
		$endTime = time()-86400*mvc::$cfg['ORDER']['autoCloseNoPayOrder'];
		$res = $this->get('or_order', ['ord_id'], sprintf(" and ord_status='creat' and ord_add_time <= %d", $endTime));
		if(!empty($res['data']))
		{
			$ordIdArr = array_column($res['data'], 'ord_id');
			foreach($ordIdArr as $ordId)
			{
				$this->B2CDb->Begin();
				//关闭对应的支付
				$res = $this->get('or_order_pay_list_link join or_order_pay_list on opl_id=opll_opl_id', ['opll_opl_id', 'opl_status', 'opl_por_id'], sprintf(" and opl_status != 'close' and opll_ord_id =%d", $ordId));
				$status = '';
				$porIdArr = [];
				$closeOplIdArr = [];
				foreach($res['data'] as $v)
				{
					//已完成支付，不允许关闭
					if($v['opl_status'] == 'paied')
					{
						$status = 'paied';
					}
					else
					{
						$closeOplIdArr[] = $v['opll_opl_id'];
						if(!empty($v['opl_por_id'])) $porIdArr[] = $v['opl_por_id'];
					}
				}
				if(!empty($porIdArr))
				{
					$LibYpApi = new LibYpApi();
					$LibYpApi->get('order/closePay', [], ['por_id'=>$porIdArr]);
				}
				if(!empty($closeOplIdArr))
				{
					$setArr = [
						'opl_status'=>'close',
						'opl_check_by'=>mvc::$cfg['LOGUSER']['urname'],
						'opl_chekc_time'=>time()
					];
					$this->set('or_order_pay_list', $setArr, sprintf(" and opl_id in (%s)", implode(',', $closeOplIdArr)));	
				}
				if($status == 'paied') continue;
				//关闭订单
				$setArr = [
					'ord_status'=>'cancel',
					'ord_cancel_reason'=>date('Y-m-d H:i:s').'超时未付款，系统取消订单'
				];
				$this->set('or_order', $setArr, ' and ord_id ='.$ordId);
				$this->updateOrdSaleNum($ordId, '', '');
				//取消订单的配件
				$this->set('or_order_product', ['orp_status'=>'cancel'], sprintf(" and orp_ord_id =%d and orp_status='creat'", $ordId));

				//订单日志
				$logArr = [
					'orl_ord_id'=>$ordId,
					'orl_old_status'=>'creat',
					'orl_new_status'=>'cancel',
					'orl_text'=>'超时未付款，系统取消订单'
				];
				$this->orderLog($logArr);
				$this->B2CDb->end();
			}
		}
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 系统自动处理申请退款状态
	  * @param  $repId 退款ID
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function autoRefundStatus($repId)
	{
		
		$repId = (int) $repId;
		if($repId < 1) return LibFc::ReturnData(true);
		$res = $this->get('or_refund_pact 
		join or_order on rep_ord_id=ord_id 
		join or_order_product on orp_ord_id=ord_id',['*'],sprintf(" and rep_id=%d", $repId), true);
		$repArr = $res['data'];
		if(empty($repArr)) return LibFc::ReturnData(true);
		$nowTime = time();
		$this->B2CDb->Begin();
	
		switch($repArr['rep_status'])
		{
			//等待卖家确认协议
			case 'wait':
				$lastTime = $repArr['orp_status'] == 'paied' ? $repArr['rep_apply_time']+mvc::$cfg['ORDER']['notSendRefundConfirm']*3600*24 : $lastTime = $repArr['rep_apply_time']+mvc::$cfg['ORDER']['sendRefundConfirm']*3600*24;
				//系统自动确认协议
				if($lastTime > 0 && $nowTime >= $lastTime)
				{	
					//申请的仅退款=》自动完成退款
					if($repArr['rep_type'] == 0)
					{
						$this->refundCompleted($repId);
						$logArr = [
							'rel_rep_id'=>$repId,
							'rel_txt'=>'由于商家超时未响应，系统自动确认退款。',
							'rel_utype'=>2
						];
						$this->addRefundLog($logArr);
					}
					else
					{
						$this->set('or_refund_pact', ['rep_status'=>'confirm', 'rep_confirm_time'=>$nowTime, 'rep_etime'=>$nowTime], sprintf(" and rep_id=%d", $repId));
						$this->set('or_order_product', ['orp_refund_status'=>'confirm'], sprintf(" and orp_id=%d", $repArr['rep_orp_id']));
						//退款日志
						$logArr = [
							'rel_rep_id'=>$repId,
							'rel_txt'=>'由于商家超时未响应，默认达成了本次售后服务申请。',
							'rel_utype'=>2
						];
						$this->addRefundLog($logArr);
					}
				}
			break;
			//卖家同意退款，等待买家退换货
			case 'confirm':
				if($repArr['rep_type'] == 1)
				{
					//退货退款 同意退款协议后，N天如果买家不退货则自动关闭退款
					$lastTime = $repArr['rep_confirm_time']+mvc::$cfg['ORDER']['waitRefundPro']*3600*24;
					if($nowTime >= $lastTime)
					{
						$this->closeRefund($repId);
						//退款日志
						$logArr = [
							'rel_rep_id'=>$repId,
							'rel_txt'=>'由于买家超时未退回货物，系统自动关闭退款。',
							'rel_utype'=>2
						];
						$this->addRefundLog($logArr);
					}
				}
				else if($repArr['rep_type'] == 2)
				{
					//卖家同意换货后，N天买家不处理，则自动完成换货
					$lastTime = $repArr['rep_confirm_time']+mvc::$cfg['ORDER']['waitRefundChangePro']*3600*24;
					if($nowTime >= $lastTime)
					{
						$this->refundCompleted($repId);
						//退款日志
						$logArr = [
							'rel_rep_id'=>$repId,
							'rel_txt'=>'由于买家超时未响应，系统自动确认换货完成。',
							'rel_utype'=>2
						];
						$this->addRefundLog($logArr);
					}
				}
			break;
			case 'refundpro':
				$lastTime = $repArr['rep_refund_pro_time']+mvc::$cfg['ORDER']['waitRefundProConfirm']*3600*24;
				if($nowTime >= $lastTime)
				{
					$this->refundCompleted($repId);
					//退款日志
					$logArr = [
						'rel_rep_id'=>$repId,
						'rel_txt'=>'买家已退回货物，由于商家超时未响应，系统自动完成退货退款。',
						'rel_utype'=>2
					];
					$this->addRefundLog($logArr);
				}
			break;
			case 'refunded':
				//检查退款资金是否已完成
				if($repArr['rep_end'] == 0)
				{
					$setArr = [];
					$LibYpApi = new LibYpApi();
					/*if(!empty($repArr['rep_pre_id']))
					{
						$res = $LibYpApi->get('order/getRefund', [], ['pre_id'=>$repArr['rep_pre_id']]);
						if($res['data']['pre_status'] == 1)
						{
							$setArr['rep_end'] = 1;
						}
					}
					else if(!empty($repArr['rep_pmc_id']))
					{
						$res = $LibYpApi->get('order/getMchPay', [], ['pmc_id'=>$repArr['rep_pmc_id']]);
						if($res['data']['pmc_status'] == 1)
						{
							$setArr['rep_end'] = 1;	
						}
					}*/
					
					if($setArr['rep_end'] == 1)
					{
						//冻结自己转流水
						$B2cMoney = new B2cMoney();
						if(!empty($repArr['rep_mou_id']))
						{
							$moneyLogArr = [
								'mon_shop_id'=>$repArr['rep_shop_id'],
								'mon_stype'=>1,
								'mon_money'=>-$repArr['rep_money'],
								'mon_title'=>'订单ID：'.$repArr['orp_ord_id'].'退款完成，退款ID：'.$repArr['rep_id'],
								'mon_tyle'=>1
							];
							$res = $B2cMoney->addShopMoney($moneyLogArr, $repArr['rep_mou_id']);
							$setArr['rep_mon_id'] = $res['data'];
							$this->set('sh_money_unav', ['mou_status'=>1, 'mou_ok_time'=>time()], 'and mou_id='.$repArr['rep_mou_id']);
						}

						//买家流水
						$moneyLogArr = [
							'mol_uid'=>$repArr['rep_uid'],
							'mol_ord_ids'=>$repArr['orp_ord_id'],
							'mol_type'=>1,
							'mol_money'=>$repArr['rep_money'],
							'mol_des'=>'订单ID：'.$repArr['orp_ord_id'].'退款完成，退款ID：'.$repArr['rep_id']
						];
						$B2cMoney = new B2cMoney();
						$B2cMoney->addUserMoney($moneyLogArr);
					}
					if(!empty($setArr))
					{
						$this->set('or_refund_pact', $setArr, 'and rep_id='.$repArr['rep_id']);
					}
				}
			break;
		}
		$this->B2CDb->End();
		return LibFc::ReturnData(true);
	}


	/**
	  * @method 检查退款状态
	  * @param  $repId  订单退款ID
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function checkRefund($repId)
	{
		$repId = (int) $repId;
		$res = $this->get('or_refund_pact', ['rep_id', 'rep_status', 'rep_pre_id', 'rep_pmc_id'], sprintf(" and rep_id=%d and rep_status not in ('close', 'refunded')", $repId), true);
		if(!empty($res['data']) && !empty($res['data']['rep_pre_id']))
		{
			$repArr = $res['data'];
			$LibYpApi = new LibYpApi();
			$res = $LibYpApi->get('order/getRefund', [], ['pre_id'=>$repArr['rep_pre_id']]);
			$resArr = $res['data'];
			if($resArr['pre_status'] === 1)
			{
				$this->refundCompleted($repArr['rep_id']);
			}
		}
		return LibFc::ReturnData(true);
	}


	
	/**
	  * @method 关闭退款
	  * @param  $repId  订单退款ID
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function closeRefund($repId)
	{
		$repId = (int) $repId;
		$res = $this->get('or_refund_pact join or_order_product on orp_id=rep_orp_id', ['rep_id', 'rep_status', 'rep_orp_id'], sprintf(" and rep_id=%d", $repId), true);
		if(empty($res['data']))
		{
			return LibFc::ReturnData(false, '退款记录不存在');
		}
		$repArr = $res['data'];

		if($repArr['rep_status'] == 'refunded')
			return LibFc::ReturnData(false, '退款已完成，不允许关闭');

		$this->B2CDb->Begin();
		$this->set('or_refund_pact', ['rep_status'=>'close','rep_etime'=>time(),'rep_close_time'=>time()], sprintf(" and rep_id=%d", $repArr['rep_id']));
		$this->set('or_order_product', ['orp_refund_status'=>''], sprintf(" and orp_id=%d", $repArr['rep_orp_id']));
		$this->B2CDb->End();
		return LibFc::ReturnData(true);
	}





	/**
	 * @method    getProductRealInfo
	 * @param     [arr]             $proId   [配件ID(一维)]
	 * @param     [int]             $userId  [用户ID]
	 * @param     [arr]             $shopArr [店铺ID(一维)]
	 * @param     [arr]             $source  [array([$shopid]=>array([$proid]=>$num)),以店铺ID为键名的二维数组,$proid:配件ID $num：数量]
	 * @return    [array]           [以店铺ID为键名的数组array([1] => Array([100031] => Array([pro_id] => 100031 [pro_name] => 宝马迷你前后刹车片[pro_sale_price] => 996,...),array(.....)] 包括折后价，会员信息，折后总价等信息
	 * @author 卢
	 * @copyright 2017-08-05
	 */
	public function getProductRealInfo($proId,$userId,$shopArr,$source)
	{
		if(is_array($proId)&&LibFc::Int($userId)&&is_array($shopArr)&&is_array($source))
		{
			$B2cProduct= new B2cProduct();
			
			$B2cUserFavourable= new B2cUserFavourable();
			$targetArr=array('pro_id','pro_name','pro_shop_id','pro_sale_price','pro_promotion_price','pro_count','pro_user_discount','pro_promotion_btime','pro_promotion_etime','pri_code','pri_set_inventory','pri_frt_id','pro_manjian','pro_prh_id','shop_status','pro_status','pro_price_vip1','pro_price_vip2','pro_price_vip3','shop_com_discount','pro_price_vip4');
			$proStr=implode(',',$proId);
			$where=sprintf(' and pro_id in (%s)',$proStr);
			$proData=$B2cProduct->getProduct($targetArr,$where);
			// print_r($proData);
			if(count($proData['data']))
			{
				//取图
				// print_r($proData);
				$picData=$B2cProduct->getProductPic($proId);
				$shopIdArr=array_column($proData['data'], 'pro_shop_id');
				// print_r($shopIdArr);
				if(count($shopIdArr))
				{
					$shopData=$this->get('sh_shop',['shop_name','shop_domain','shop_id'],sprintf(' and shop_id in (%s)',implode(',',$shopIdArr)));
					$shopData=array_column($shopData['data'],null, 'shop_id');
					// print_r($shopData);
				}
				$data=array();
				foreach ($proData['data'] as $k => $v) 
				{
					$data[$v['pro_shop_id']][$v['pro_id']]=isset($picData['data'][$v['pro_id']][0])?array_merge($v,$picData['data'][$v['pro_id']][0]):$v;
					$data[$v['pro_shop_id']][$v['pro_id']]['shopName']=$shopData[$v['pro_shop_id']]['shop_name'];
					$data[$v['pro_shop_id']][$v['pro_id']]['shopUrl']=$shopData[$v['pro_shop_id']]['shop_domain'];
				}
				//是否企业会员
				$cMemberArr=$this->get('us_user_base',['ub_level'],sprintf(' and ub_uid=%d',$userId),true);
				$cMember=!empty($cMemberArr['data']['ub_level'])?$cMemberArr['data']['ub_level']:0;
				//是否会员,取折扣
				$disData=$B2cUserFavourable->getMemMsgByUid($userId,$shopArr,['mem_discount','mel_name','mel_id','meml_mem_id','men_manjian','mem_status']);
				// print_r($disData);
				$memberOpen=0;
				foreach ($shopArr as $k => $v) 
				{
					if(is_array($disData['data'][$v]) && count($disData['data'][$v])>0&&$disData['data'][$v]['mem_status'])
					{
						//是会员
						$memberOpen=1;
						// $discount[$v]['discount']=$disData['data'][$v]['mem_discount'];
						$discount[$v]['discount']=10;
						$discount[$v]['label']='店铺'.$disData['data'][$v]['mel_name'];
						$discount[$v]['member_level']=$disData['data'][$v]['mel_id'];
					}
					else
					{
						$discount[$v]['discount']=10;
						$discount[$v]['label']='非会员';
						$discount[$v]['member_level']=0;
					}
				}
				//满减
				// $manJianInfo=$B2cUserFavourable->getManJian($shopArr);
				$vipArr=[1=>'pro_price_vip1',2=>'pro_price_vip2',3=>'pro_price_vip3',4=>'pro_price_vip4'];
				// print_r($data);
				
				//处理价格
				foreach ($data as $shopId => $pro) 
				{	
					if(in_array($shopId,[732634,965832,250162]))
					{
						if($shopId==732634)
						{
							$B2cCustom = new B2cCustom();
							$proIdArr = array_keys($pro);
							$priceArrRes = $B2cCustom->getProInfoByDy($userId,$proIdArr);
						}
						if($shopId==965832)
						{
							$B2cBDCustom = new B2cBDCustom();
							$proIdArr = array_keys($pro);
							$priceArrRes = $B2cBDCustom->getProInfoByDy($userId,$proIdArr);
						}	
						if($shopId==250162)
						{
							$B2cTylCustom = new B2cTylCustom();
							$proIdArr = array_keys($pro);
							$priceArrRes = $B2cTylCustom->getProInfoByDy($userId,$proIdArr);
						}				
						if($priceArrRes['data']){
							$priceArr = array_column($priceArrRes['data'],'price','pro_id');
							
						} 
					}
					foreach ($pro as $k => $v) 
					{
						// print_r($v);
						$data[$shopId][$k]['byNum']=(int)$source[$shopId][$k];
						$data[$shopId][$k]['discount']=$discount[$shopId]['discount'];
						$data[$shopId][$k]['is_member']=$discount[$shopId]['label'];
						$data[$shopId][$k]['level']=$memberOpen?$discount[$shopId]['member_level']:0;
						$data[$shopId][$k]['on_promote']=0;//非促销中

						// 明达 
						if(isset($priceArr[$k]) && in_array($shopId,[732634,965832]))
						{
							$data[$shopId][$k]['pro_promotion_price'] = $v['pro_promotion_price'] = $priceArr[$k];
							$data[$shopId][$k]['pro_sale_price'] = $v['pro_sale_price'] = $priceArr[$k];
							if($data[$shopId][$k]['level']>0)
							{
								if($v[$vipArr[$data[$shopId][$k]['level']]]>0)
								{
									$data[$shopId][$k][$vipArr[$data[$shopId][$k]['level']]] = $v[$vipArr[$data[$shopId][$k]['level']]]= $priceArr[$k];
								}
							}
						}

						$data[$shopId][$k]['realPrice']['salePrice']=$v['pro_sale_price'];//销售价格
						if($cMember)
						{
							$data[$shopId][$k]['realPrice']['comPrice']=$v['pro_sale_price']*$v['shop_com_discount']*0.1;
						}
						$data[$shopId][$k]['is_manJian']=1;//是否满减
						
						//配件参与会员打折
						if($v['pro_user_discount']=='Y')
						{
							if($data[$shopId][$k]['level']>0)
							{
								if($v[$vipArr[$data[$shopId][$k]['level']]]>0)
								{
									$data[$shopId][$k]['realPrice']['vipPrice']=$v[$vipArr[$data[$shopId][$k]['level']]];
								}
							}
							// $data[$shopId][$k]['realPrice']['salePrice']=$v['pro_sale_price']*($discount[$shopId]['discount']/10);//会员折扣价
						}
						//促销时间内
						if($v['pro_promotion_price']>0&&time()>=$v['pro_promotion_btime']&&time()<=$v['pro_promotion_etime'])
						{
							$data[$shopId][$k]['realPrice']['promPrice']=$v['pro_promotion_price'];
							$data[$shopId][$k]['on_promote']=1;//促销中
						}					
						if($data[$shopId][$k]['on_promote']>0) 
						{
							$data[$shopId][$k]['totalPrice']['promPrice']=$data[$shopId][$k]['byNum']*$data[$shopId][$k]['realPrice']['promPrice'];
							if($cMember)
							{
								$data[$shopId][$k]['realPrice']['comPrice']=$data[$shopId][$k]['realPrice']['promPrice']*$v['shop_com_discount']*0.1;
							}
						}
						$data[$shopId][$k]['totalPrice']['salePrice']=$data[$shopId][$k]['byNum']*$data[$shopId][$k]['realPrice']['salePrice'];
					}
				}
				return LibFc::ReturnData(true,$data);
			}
			return LibFc::ReturnData(true,[]);
		}
		return LibFc::ReturnData(false,'getProductRealInfo参数错误');
	}
	/**
	 * @method    获取订单列表
	 * @param     [int]       $nowPage [当前页码]
	 * @param     [int]       $perPage [每页条数]
	 * @param     [string]       $order   [排序条件]
	 * @param     [string]      $where   [筛选条件]
	 * @return    [array]                [array([0] => Array([ord_id] => 100016[ord_uid] => 164043[ord_shop_id] => 1.... [proArr] => Array([0] => Array([orp_id]=>12,[orp_pro_name]=>发动机)]
	 * @author 卢
	 * @copyright 2017-08-08
	 */
	public function getOrderList($nowPage,$perPage,$order,$where='')
	{
		if(LibFc::Int($nowPage)&&LibFc::Int($perPage)&&!empty($order))
		{
			$orderIdArr=$this->get('or_order left join or_order_product on ord_id=orp_ord_id left join us_user_base on ord_uid=ub_uid',['ord_id'],$where.' group by ord_id');
			$ordWhere=sprintf(' select distinct ord_id from or_order left join or_order_product on ord_id=orp_ord_id left join us_user_base on ord_uid=ub_uid where 1=1 %s',$where);

			$orderId = array_column($orderIdArr['data'], 'ord_id');

			if(count($orderId) == 0) return LibFc::ReturnData(true,[],"");
			$total=count($orderId);

			$twhere = sprintf(' and ord_id in (%s) order by %s limit %d,%d', $ordWhere, $order, ($nowPage-1)*$perPage, $perPage);
			$res=$this->Get('or_order',['*'], $twhere);
			$shopArr=array_column($res['data'], 'ord_shop_id');
			$shopUidArr=array_column($res['data'], 'ord_uid');
			$nowOrderArr=array_column($res['data'], 'ord_id');
			$refundOrderArr=array_column($res['data'],null, 'ord_id');
			if(count($shopArr))
			{
				// 店铺信息
				$shopInfo=$this->get('sh_shop left join us_user_base on shop_uid=ub_uid',['shop_name','shop_main_name','shop_main_tel','ub_username','shop_uid','shop_id','shop_domain','shop_top_domain'],sprintf(' and shop_id in (%s)',implode(',',$shopArr)));
				$shopInfo['data']=array_column($shopInfo['data'], null,'shop_id');
				//用户信息
				$userInfo=$this->get('us_user_base',['ub_username','ub_uid'],sprintf(' and ub_uid in (%s)',implode(',',$shopUidArr)));
				$userInfo=array_column($userInfo['data'], null,'ub_uid');
				//订单配件信息
				$proRes=$this->getOrderPro(sprintf(" and orp_ord_id in (%s) order by orp_pro_id desc",implode(',',$nowOrderArr)));
				$orderProductArr=[];
				$orpArr=array_column($proRes['data'], 'orp_id');
				$ordOrpLink=[];
				foreach ($proRes['data'] as $v) 
				{
					$ordOrpLink[$v['orp_ord_id']][]=$v['orp_id'];
				}
				// $ordOrpLink=array_column($proRes['data'], 'orp_ord_id','orp_id');
				$refundArr=[];
				if(count($orpArr))
				{
					//退款记录
					$refundData = $this->get('or_refund_pact',['rep_money','rep_freight_money','rep_orp_id','rep_status','rep_ord_id'],sprintf(' and rep_orp_id in (%s) and rep_ord_id in (%s) order by rep_apply_time asc',implode(',',$orpArr),implode(',',$nowOrderArr)));

                    $refundArrs = [];
					if(!empty($refundData['data'])){
					    $refundArrs = array_column($refundData['data'],'rep_status','rep_ord_id');
                    }
					// print_r($refundData);
					$refunLastArr=[];
					//计算已经退款的金额
					if(count($refundData['data']))
					{
						foreach ($refundData['data'] as $info) 
						{
							$refunLastArr[$info['rep_ord_id']][]=$info['rep_orp_id'];
							$refundArr[$info['rep_orp_id']]['viewHistory']=0;//查看退款历史
							if(in_array($info['rep_status'], ['refunded','closed']))
							{
								$refundArr[$info['rep_orp_id']]['viewHistory']=1;
								//关闭和完成的订单，需判断是否退款完全
								$refundArr[$info['rep_orp_id']]['countMoney']+=($info['rep_money']-$info['rep_freight_money']);//已经退还金额
								$refundArr[$info['rep_ord_id']]['frtMoney']+=$info['rep_freight_money'];//已经退的运费
							}
						}
					}
				}
				// print_r($refundArr);
				// print_r($refunLastArr);
				foreach ($proRes['data'] as $k => $v) 
				{
					$orderProductArr[$v['orp_ord_id']][$v['orp_id']]=$v;
				}
				// print_r($orderProductArr);
				$sendArr=[];
				$refundFreArr=[];
				foreach($orderProductArr as $k=> $v)
				{
					$sendNum=0;
					foreach ($v as $i=> $pro) 
					{
						if($pro['orp_evaluate']<1)
						{
							$orderProductArr[$k][$i]['notEvalate']+=1;
							$evaluateNum+=1;
						}
						// $refundMoneyArr=$this->getRefundMoney($pro['orp_id']);
						$orderProductArr[$k][$i]['viewHistory']=!empty($refundArr[$pro['orp_id']]['viewHistory'])?1:0;
						if($pro['orp_ext_id']) $sendNum+=1;
						$orderProductArr[$k][$i]['succssTotal']=isset($refundArr[$pro['orp_id']]['succssTotal'])?:0;
						$orderProductArr[$k][$i]['isRefund']=isset($refundArr[$pro['orp_id']]['count'])?:0;
						$moneyArr = ['maxMoney'=>0.00, 'proMoney'=>0.00, 'freightMoney'=>0.00];
						//可退运费						
						$moneyArr['freightMoney'] = $refundOrderArr[$pro['orp_ord_id']]['ord_freight_money'];
						//配件可退金额
						$moneyArr['proMoney'] = $pro['orp_money'];
						$moneyArr['freightMoney']-=$refundArr[$pro['orp_ord_id']]['frtMoney'];
						$moneyArr['proMoney']-=$refundArr[$pro['orp_id']]['countMoney'];
						// $orderProductArr[$k][$i]['allowRefund']=0;
						$orderProductArr[$k][$i]['allowRefund']=in_array($pro['orp_status'], ['paied','send','completed'])&&(empty($pro['orp_refund_status'])||($moneyArr['proMoney']+$moneyArr['freightMoney'])>0)?1:0;
					}
					$sendArr[$k]=$sendNum;
				}
                $tempCount = count($refundArrs);
				//var_dump($res);exit();
				foreach ($res['data'] as $k => $v) 
				{
					$res['data'][$k]['is_send']=$sendArr[$v['ord_id']]==count($orderProductArr[$v['ord_id']])?1:0;
					$res['data'][$k]['proArr']=$orderProductArr[$v['ord_id']];
					$res['data'][$k]['shop_domain']=$shopInfo['data'][$v['ord_shop_id']]['shop_domain'];
					$res['data'][$k]['shop_top_domain']=$shopInfo['data'][$v['ord_shop_id']]['shop_top_domain'];
					$res['data'][$k]['shopUser']=$shopInfo['data'][$v['ord_shop_id']]['ub_username'];
					$res['data'][$k]['shopUserId']=$shopInfo['data'][$v['ord_shop_id']]['shop_uid'];
					$res['data'][$k]['userName']=$userInfo[$v['ord_uid']]['ub_username'];
					$res['data'][$k]['shopName']=$shopInfo['data'][$v['ord_shop_id']]['shop_name'];
					$res['data'][$k]['shop_main_name']=$shopInfo['data'][$v['ord_shop_id']]['shop_main_name'];
					$res['data'][$k]['shop_main_tel']=$shopInfo['data'][$v['ord_shop_id']]['shop_main_tel'];
					$res['data'][$k]['total']=$total;

					//var_dump($refundArr[$v['ord_id']]);
					//添加订单取消有退款的操作
                    if($tempCount > 0 && isset($refundArrs[$v['ord_id']]) && $refundArrs[$v['ord_id']] != 'close') {
                        $res['data'][$k]['is_refund'] = 1;
                    }else{
                        $res['data'][$k]['is_refund'] = 0;
                    }
				}
			}
			return $res;
		}
		return LibFc::ReturnData(false,'getOrderList参数错误',"");
	}
	/**
	 * @method    获取某订单下的配件
	 * @param     [string]      $where [条件]
	 * @return    [arr]             [array([0]=>array('orp_id'=>1,'orp_ord_id'=>4564)....)]
	 * @author 卢
	 * @copyright 2017-08-08
	 */
	public function getOrderPro($where)
	{
		if(!empty($where))
		{
			$data=array();
			$res=$this->Get('or_order_product',['*'],$where);
			$res['data'] = array_column($res['data'],null, 'orp_id');
			$evaluateNum=0;
			$proArr=array_column($res['data'], 'orp_pro_id');
			$B2cProduct= new B2cProduct();
			//获取配件图片
			$picData=$B2cProduct->getProductPic($proArr);
			foreach ($res['data'] as $k => $v) 
			{
				// print_r($picData['data']);
				$data[$k]=isset($picData['data'][$v['orp_pro_id']][0])?array_merge($v,$picData['data'][$v['orp_pro_id']][0]):$v;
			}
			return LibFc::ReturnData(true,$data,"");
		}
		return LibFc::ReturnData(false,'getOrderPro参数错误',"");
	}
	/**
	 * @method    获取订单详细信息
	 * @param     [int]         $orderId [订单ID]
	 * @param     [int]         $id      [用户ID||店铺ID]
	 * @param     boolean        $isUser  [是否为用户,默认为false(卖家)]
	 * @return    [arr]                  [array([data] => Array([ord_id] => 100016 [ord_uid] => 164043 [ord_shop_id] => 1 [ord_status] => creat [ord_total_money] => 713.57 [ord_freight_money] =>0,....[proArr]=array([0] => Array([orp_id] => 31 [orp_ord_id] => 100016 [orp_pro_id]=>100031))]
	 * @author 卢
	 * @copyright 2017-08-08
	 */
	public function getOrderDetail($orderId,$id,$isUser=false)
	{
		if(LibFc::Int($orderId)&&LibFc::Int($id))
		{
			if($isUser)
			{
				//为buyer
				$where=sprintf(' and ord_id=%d and ord_uid=%d',$orderId,$id);
			}
			else
			{
				//seller
				$where=sprintf(' and ord_id=%d and ord_shop_id=%d',$orderId,$id);
			}
			$orderRes=$this->Get('or_order',['*'],$where,true);
			if(count($orderRes['data'])>0)
			{
				$proRes=$this->getOrderPro('and orp_ord_id='.$orderId.' order by orp_pro_id desc');
				$orderRes['data']['proArr']=$proRes['data'];
				$orpArr=array_column($proRes['data'], 'orp_id');
				$shopInfo=$this->get('sh_shop left join us_user_base on shop_uid=ub_uid',['shop_name','ub_username','shop_id'],sprintf(' and shop_id=%d',$orderRes['data']['ord_shop_id']),true);
				$userInfo=$this->get('us_user_base',['ub_username'],sprintf(' and ub_uid=%d',$orderRes['data']['ord_uid']),true);
				$orderRes['data']['shopUser']=$shopInfo['data']['ub_username'];
				$orderRes['data']['userName']=$userInfo['data']['ub_username'];
				// $shopInfo=$this->get('sh_shop',['shop_name'],sprintf(' and shop_id=%d',$orderRes['data']['ord_shop_id']),true);
				$orderRes['data']['shopName']=$shopInfo['data']['shop_name'];
				//退款记录
				$refundData=$this->get('or_refund_pact',['rep_money','rep_freight_money','rep_orp_id','rep_status','rep_ord_id'],sprintf(' and rep_orp_id in (%s) and rep_ord_id =%d order by rep_apply_time asc',implode(',',$orpArr),$orderId));
				// print_r($refundData);
				// die;
				//计算已经退款的金额
				if(count($refundData['data']))
				{
					foreach ($refundData['data'] as $info) 
					{
						$refundArr[$info['rep_orp_id']]['viewHistory']=0;//查看退款历史
						if(in_array($info['rep_status'], ['refunded','closed']))
						{
							$refundArr[$info['rep_orp_id']]['viewHistory']=1;
							//关闭和完成的订单，需判断是否退款完全
							$refundArr[$info['rep_orp_id']]['countMoney']+=($info['rep_money']-$info['rep_freight_money']);//已经退还金额
							$refundArr[$info['rep_ord_id']]['frtMoney']+=$info['rep_freight_money'];//已经退的运费
						}
					}
					foreach ($orderRes['data']['proArr'] as $k=>$v) 
					{
						$moneyArr = ['maxMoney'=>0.00, 'proMoney'=>0.00, 'freightMoney'=>0.00];
						//可退运费						
						$moneyArr['freightMoney'] = $orderRes['data']['ord_freight_money'];
						//配件可退金额
						$moneyArr['proMoney'] = $v['orp_money'];
						$moneyArr['freightMoney']-=$refundArr[$v['orp_ord_id']]['frtMoney'];
						$moneyArr['proMoney']-=$refundArr[$v['orp_id']]['countMoney'];
						$orderRes['data']['proArr'][$k]['allowRefund']=in_array($v['orp_status'], ['paied','send','completed'])&&(empty($v['orp_refund_status'])||($moneyArr['proMoney']+$moneyArr['freightMoney'])>0)?1:0;
					}
					// print_r($orderRes);
				}
				return $orderRes;
			}
			return LibFc::ReturnData(false,'订单不存在',"");
		}
		return LibFc::ReturnData(false,'getOrderDetail参数错误',"");
	}
	/**
	 * @method    删除订单
	 * @param     [int|arr]     $orderId [订单ID]
	 * @param     [int]     $id      [用户ID|店铺ID]
	 * @param     boolean    $isUser  [是否为用户]
	 * @return    [bool]              [array('status'=>true,'data'=>true)]
	 * @author 卢
	 * @copyright 2017-08-10
	 */
	public function delOrder($orderId,$id,$isUser=false,$realDel=false)
	{
		if(!empty($orderId)&&LibFc::Int($id))
		{
			$B2cLog = new B2cLog();
			$orderArr=is_array($orderId) ? $orderId : [(int)$orderId];
			$status=$realDel?2:1;
			if($isUser)
			{
				//buyer
				$where=sprintf(' and ord_id in (%s) and ord_uid=%d',implode(',',$orderArr),$id);
				$target=array('ord_user_delete'=>$status);
			}
			else
			{
				//seller
				$where=sprintf(' and ord_id in (%s) and ord_shop_id=%d',implode(',',$orderArr),$id);
				$target=array('ord_seller_delete'=>$status);
				//日志
				$logArr=['log_shop_id'=>$id,'log_category'=>10,'log_txt'=>"删除订单ID：".implode(',',$orderArr)];
				$logArr['log_dataid']=$orderArr;				
			}
			$proWhere=sprintf(' and orp_ord_id in (%s)',implode(',',$orderArr));
			// print_r($target);
			// die;
			$this->B2CDb->Begin();
			$this->set('or_order',$target,$where);
			//日志
			if(isset($logArr))
			{
				$B2cLog->addFastLog($logArr);
			}
			//放进回收站
			if($realDel==false)
			{
				//删除订单，减销量，加库存(拍下减库存的配件)
				$this->updateOrdSaleNum($orderArr,'','',false);
				$this->closeOrderPay($orderArr);//关闭订单支付码
			}
			$this->B2CDb->End();
			return LibFc::ReturnData(true,true,"");
		}
		return LibFc::ReturnData(false,'delOrder参数错误',"");
	}
	/**
	 * @method    更新订单状态为取消 cancel
	 * @param     [int]            $orderId [订单ID]
	 * @param     [int]            $id      [用户ID|卖家ID]
	 * @param     [array]            $field   [状态字段array(['ord_status']=>'cancel')]
	 * @param     boolean           $isUser  [是否为用户 默认为false(卖家)]
	 * @return    [bool]                     [array('status'=>true,'data'=>true)]
	 * @author 卢
	 * @copyright 2017-08-10
	 */
	public function updateOrderStatus($orderId,$id,$field,$isUser=false)
	{
		if(!empty($orderId)&&LibFc::Int($id)&&is_array($field)&&in_array('cancel', $field)&&count($field)>0)
		{
			$B2cLog = new B2cLog();
			$orderArr=is_array($orderId) ? $orderId : [(int)$orderId];
			if($isUser)
			{
				//buyer
				$where=sprintf(' and ord_id in (%s) and ord_uid=%d',implode(',',$orderArr),$id);
			}
			else
			{
				//seller
				$where=sprintf(' and ord_id in (%s) and ord_shop_id=%d',implode(',',$orderArr),$id);
				//日志
				$logArr=['log_shop_id'=>$id,'log_category'=>10,'log_txt'=>'修改订单ID：'.implode(',',$orderArr).'状态'];
				$logArr['log_dataid']=$orderArr;
				
			}
			$proWhere=sprintf(' and orp_ord_id in (%s)',implode(',',$orderArr));
			$this->B2CDb->Begin();
			if(isset($logArr))
			{
				$B2cLog->addFastLog($logArr);
			}
			//取消订单，加库存
			if(in_array('cancel', $field))
			{
				$this->updateOrdSaleNum($orderId,'','',false);
				$this->closeOrderPay($orderArr);
			}
			$this->Set('or_order',$field,$where);
			$this->Set('or_order_product',['orp_status'=>$field['ord_status']],$proWhere);
			$this->B2CDb->End();
			return LibFc::ReturnData(true,true,"");
		}
		return LibFc::ReturnData(false,'updateOrderStatus参数错误',"");
	}
	/**
	 * @method    admin取消订单
	 * @param     [int|arr]           $orderId [订单ID]
	 * @return    [arr]                    [['status'=>true,'data'=>true]]
	 * @author 卢
	 * @copyright 2018-01-08
	 */
	public function adminCancelOrder($orderId)
	{
		if(!empty($orderId))
		{
			$B2cLog=new B2cLog();
			$orderArr=is_array($orderId) ? $orderId : [(int)$orderId];
			//获取店铺ID
			$res=$this->get('or_order',['ord_shop_id','ord_id','ord_status'],sprintf(' and ord_id in (%s)',implode(',',$orderArr)));
			$this->B2CDb->Begin();
			foreach ($res['data'] as $v) 
			{
				if($v['ord_status']!='cancel')
				{
					$logArr['log_uid'] = mvc::$cfg['LOGUSER']['uid'];
					$logArr['log_uname'] = mvc::$cfg['LOGUSER']['urname'];
					$logArr['log_category']=10;
					$logArr['log_shop_id']=$v['ord_shop_id'];
					$logArr['log_dataid']=$v['ord_id'];
					$logArr['log_txt']='订单ID：'.$v['ord_id'].' 取消';
					$B2cLog->addLog($logArr);
					$this->Set('or_order',['ord_status'=>'cancel'],sprintf(' and ord_id =%d',$v['ord_id']));
					$this->Set('or_order_product',['orp_status'=>'cancel'],sprintf(' and orp_ord_id =%d',$v['ord_id']));
					//取消订单，减销量，加库存
					$this->updateOrdSaleNum($v['ord_id'],'','');
				}
			}
			$this->B2CDb->End();
			return LibFc::ReturnData(true,true);
		}
		return LibFc::ReturnData(false,'adminCancelOrder参数错误',"");
	}
	/**
	 * @method    卖家订单发货
	 * @param     [int]      $shopId   [店铺ID]
	 * @param     [int]      $orderId  [订单ID]
	 * @param     [int|arr]      $orderPro [该订单下的要发货的配件ID]
	 * @param     [string]      $expNum   [运单号]
	 * @param     [int]      $express  [快递代码]
	 * @param     [int]      $addrSendId   [发货地址ID]
	 * @param     [int]      $addrRefundId   [退货地址ID]
	 * @param     [str]      $remark   [卖家备注]
	 * @return    [bool]                [array('status'=>true,'data'=>true)]
	 * @author 卢
	 * @copyright 2017-08-15
	 */
	public function sendExpress($shopId,$expressName,$orderId,$orpId,$expNum,$express,$addrSendId,$addrRefundId,$remark)
	{
		if(LibFc::Int($orderId)&&!empty($orpId)&&!empty($expNum)&&!empty($expressName)&&LibFc::Int($addrSendId)&&LibFc::Int($addrRefundId))
		{
			$res=$this->get('or_order',['ord_status'],sprintf(' and ord_id=%d',$orderId),true);
			if(!in_array($res['data']['ord_status'], ['send','paied']))
				return LibFc::ReturnData(false, '该订单暂不可发货');
			$B2cProduct=new B2cProduct();
			$B2cLog = new B2cLog();
			$orpIdArr=is_array($orpId)?$orpId : [$orpId];
			//发货地址
			$addr=$this->get('sh_address',['*'],sprintf(' and addr_shop_id=%d and addr_id in (%s)',$shopId,($addrSendId.','.$addrRefundId)));
			foreach ($addr['data'] as $k => $v) 
			{
				if($v['addr_id']==$addrSendId)
				{
					$sendAddr=json_encode($v,JSON_UNESCAPED_UNICODE);
				}
				if($v['addr_id']==$addrRefundId)
				{
					$refundAddr=json_encode($v,JSON_UNESCAPED_UNICODE);
				}
			}
			//宜配物流API
			$dataArr = [
				'ext_exp_code'=>$express,
				'ext_number'=>$expNum,
				'ext_from'=>'B2C'
			];
			$LibYpApi = new LibYpApi();
			$resArr = $LibYpApi->Get('express/getTrack', $dataArr);
			$target=array(
				'ext_name'=>$expressName,
				'ext_exp_code'=>$express,
				'ext_exp_number'=>$expNum,
				'ext_add_time'=>time(),
				'ext_set_time'=>time(),
				'ext_send_addr'=>$sendAddr,
				'ext_ext_id'=>($resArr['data']['ext_id']?$resArr['data']['ext_id']:0),
				'ext_track_tatus'=>($resArr['data']['ext_status']?$resArr['data']['ext_status']:0),
				'ext_track'=>$resArr['data']['ext_track'],
				'ext_refund_addr'=>$refundAddr,
				'ext_remark'=>$remark
				);
			$logArr=['log_shop_id'=>$shopId,'log_category'=>1,'log_txt'=>'订单ID：'.$orderId.' 发货'];
			$logArr['log_dataid']=$orderId;
			if(count($orpIdArr))
			{
				$B2cNotice=new B2cNotice();
				//获取发货配件信息
				$res=$this->get('or_order_product left join or_order on ord_id=orp_ord_id',['*'],sprintf(' and orp_id in (%s)',implode(',',$orpIdArr)));
				$uidArr=array_column($res['data'], 'ord_uid');
				$uArr=[];
				foreach ($res['data'] as $v) 
				{
					$uArr[$v['ord_uid']][]=$v;
				}
				$this->B2CDb->Begin();
				//物流消息
				foreach ($uArr as $uid => $v) 
				{
					$orderArr=[];
					foreach ($v as $orpArr) 
					{
						$orderArr[$orpArr['orp_ord_id']][]= $orpArr;
					}
					foreach ($orderArr as $ordId => $ordPro) 
					{
						$noticeArr['not_send_uid']=mvc::$cfg['LOGUSER']['uid'];
						$noticeArr['not_type']='track';
						$noticeArr['not_title']='订单ID：'.$ordId.'发货';
						$noticeArr['not_txt']=json_encode($ordPro,JSON_UNESCAPED_UNICODE);
						$noticeArr['not_all_user']=0;
						$noticeArr['not_end_time']=((7*24*60*60)+time());
						$B2cNotice->addNotice($noticeArr, [$uid]);
					}
				}
				$autoExpress = $this->add('or_express_track',$target,['ext_track']);
				$this->set('or_order',['ord_status'=>'send','ord_send_time'=>time()],sprintf(' and ord_id=%d',$orderId));
				$this->set('or_order_product',['orp_status'=>'send','orp_send_time'=>time(),'orp_ext_id'=>$autoExpress['data']],sprintf(' and orp_id in (%s) and orp_ord_id=%d',implode(',',$orpIdArr),$orderId));
				$B2cLog->addFastLog($logArr);
				$this->B2CDb->End();
			}
			return LibFc::ReturnData(true,true);
		}
		return LibFc::ReturnData(false, '参数错误');
	}
	/**
	 * @method    修改订单价格
	 * @param     [int]           $sellerId [卖家ID]
	 * @param     [arr]           $discount [折扣]
	 * @param     [arr]           $price    [优惠价格]
	 * @param     [float]           $frtPrice [运费]
	 * @param     [int]           $orderId  [订单ID]
	 * @return    [bool]                     [status=>true,data=>true]
	 * @author 卢
	 * @copyright 2017-08-28
	 */
	public function editorOrderPrice($sellerId,$discount,$price,$frtPrice,$orderId)
	{
		if(LibFc::Int($sellerId)&&is_array($discount)&&is_array($price)&&LibFc::Int($orderId))
		{
			$B2cLog = new B2cLog();
			//订单信息
			$proInfo=$this->get('or_order ORD left join or_order_product A on orp_ord_id=ord_id',['A.*,ORD.*'],sprintf(' and orp_ord_id=%d and ord_shop_id=%d',$orderId,$sellerId));
			$status=current($proInfo['data'])['ord_status'];
			if($status!='creat')
				return LibFc::ReturnData(false,'该订单暂不可修改价格');
			$productPrice=0;
			foreach ($proInfo['data'] as $k => $v)
			{
				$productPrice+=$v['orp_sale_price']*$v['orp_count'];
			}
			foreach ($proInfo['data'] as $k => $v) 
			{
				$data[$v['orp_id']]=$v;
				// $data[$v['orp_id']]['proCutMoney']=($v['orp_price']*$v['orp_count'])-$v['orp_money'];//当前配件满减的价格
				$order['proTotal']+=$v['orp_sale_price']*$v['orp_count'];//优惠前配件总价
				$data[$v['orp_id']]['proCutMoney']=round(($v['orp_sale_price']*$v['orp_count']/($productPrice))*$v['ord_product_discount'],2);//当前配件满减的价格
			}
			$discountPrice=0;//优惠总价
			$proTotal=0;
			//日志
			$logArr=['log_shop_id'=>$sellerId,'log_category'=>11,'log_txt'=>'修改订单ID：'.$orderId.' 价格'];
			$logArr['log_dataid']=$orderId;
			//更新订单配件信息
			$brforeCut=0;//前n个的满减
			$index=1;
			$total=count($discount);
			$ordPayMoney=0;
			$this->B2CDb->Begin();
			foreach ($discount as $k => $v) 
			{
				
				if(is_numeric($price[$k]))
				{			
					// echo $data[$k]['proCutMoney'];		
					$discountPrice+=$price[$k];
					$remark=$v>=10?'无优惠':sprintf('%.2f',$v).'折';
					$proTarget=[
						'orp_price'=>($data[$k]['orp_sale_price']+($price[$k]/$data[$k]['orp_count'])),//VIP后单价
						'orp_discount'=>$remark,//优惠说明
						'orp_discount_val'=>(!empty($v)?$v:10),//折扣值
						'orp_discount_money'=>abs($price[$k]),//vip优惠价格
						'orp_money'=>round(($data[$k]['orp_sale_price']+($price[$k]/$data[$k]['orp_count']))*$data[$k]['orp_count']-$data[$k]['proCutMoney'],2)//该配件实际金额（包括vip后和满减后）
					];
					//最后一个
					if($index==$total)
					{
						$proTarget['orp_money']=round(($data[$k]['orp_sale_price']+($price[$k]/$data[$k]['orp_count']))*$data[$k]['orp_count']+$brforeCut-$data[$k]['ord_product_discount'],2);
						$proTarget['orp_money']=$proTarget['orp_money']<=0?0.01:$proTarget['orp_money'];
					}
					$brforeCut+=$data[$k]['proCutMoney'];
					$ordPayMoney+=$proTarget['orp_money'];
					$index++;
					$this->set('or_order_product',$proTarget,sprintf(' and orp_id=%d and orp_ord_id=%d',$k,$orderId));
				}else
				{
					return LibFc::ReturnData(false,'折扣或价格信息错误');
				}
			}
			//更新订单基本信息
			$orderTarget=[
			'ord_total_money'=>round($order['proTotal']+$discountPrice+$frtPrice-$proInfo['data'][0]['ord_product_discount'],2),
			'ord_freight_money'=>$frtPrice,
			'ord_product_money'=>$order['proTotal']+$discountPrice,//vip后总价
			'ord_pay_money'=>round($ordPayMoney+$frtPrice,2)
			];
			$B2cLog->addFastLog($logArr);
			$this->set('or_order',$orderTarget,sprintf(' and ord_id=%d and ord_shop_id=%d',$orderId,$sellerId));
			//订单支付码
			$orderId=is_array($orderId)?$orderId:[$orderId];
			$this->closeOrderPay($orderId);
			$this->B2CDb->End();
			return LibFc::ReturnData(true,true);
		}
		return LibFc::ReturnData(false,'参数错误');
	}
	/**
	 * @method    修改配件销量
	 * @param     [arr]      $dataArr [[proId=>num],['proId'=>num]]
	 * @param     string      $type    [add 表示加销量 '' 表示减销量  默认为加]
	 * @author 卢
	 * @copyright 2018-03-29
	 */
	public function setProSaleNum($dataArr,$type='add')
	{
		if(is_array($dataArr))
		{
			$proArr=array_keys($dataArr);
			$proArr=array_filter($proArr,'LibFc::Int');
			if(count($proArr))
			{
				$proData=$this->get('bc_product',['pro_count','pro_id','pro_status','pro_shop_id','pro_sold_count'],sprintf(' and pro_id in (%s)',implode(',',$proArr)));
				$proInfo=array_column($proData['data'],null, 'pro_id');
				//获取总销量
				$shopArr=array_column($proData['data'], 'pro_shop_id');
				if(count($shopArr))
				{
					$shopInfo=$this->get('sh_shop',['shop_sold_count','shop_id'],sprintf(' and shop_id in (%s)',implode(',',$shopArr)));
					$shopCount=array_column($shopInfo,nll ,'shop_id');
				}
				if(count($proArr)&&count($proInfo))
				{
					$this->B2CDb->Begin();
					foreach ($proArr as $proId) 
					{
						if($type=='add')
						{
							$target['pro_sold_count']='#@pro_sold_count+'.$dataArr[$proId];//加销量
							//加总销量
							$totalArr['shop_sold_count']='#@shop_sold_count+'.$dataArr[$proId];
						}
						else
						{
							//判断是否超过总销量
							if($proInfo[$proId]['pro_sold_count']<$dataArr[$proId])
							{
								$target['pro_sold_count']=0;
							}
							else
							{
								$target['pro_sold_count']='#@pro_sold_count-'.$dataArr[$proId];//减销量
							}
							if(!isset($shopCount[$proInfo[$proId]['pro_shop_id']])&&$shopCount[$proInfo[$proId]['pro_shop_id']]['pro_sold_count']<$dataArr[$proId])
							{
								$totalArr['shop_sold_count']=0;
							}
							else
							{
								//减总销量
								$totalArr['shop_sold_count']='#@shop_sold_count-'.$dataArr[$proId];
							}
						}
						if(!empty($target))
							$this->set('bc_product',$target,sprintf('and pro_id=%d',$proId));
						if(!empty($totalArr))
							$this->set('sh_shop',$totalArr,sprintf(' and shop_id=%d',$proInfo[$proId]['pro_shop_id']));
					}
					$this->B2CDb->End();
					return LibFc::ReturnData(true,true);
				}
				// print_r($proArr);
			}
		}
		return LibFc::ReturnData(false,'setProSaleNum 参数错误');
	}
	/**
	 * @method    修改配件库存
	 * @param     [arr]      $dataArr [[proId=>num],['proId'=>num]]
	 * @param     string      $type    [add 表示加库存 '' 表示减库存  默认为加]
	 * @author 卢
	 * @copyright 2018-03-29
	 */
	public function setProCount($dataArr,$type='add')
	{
		if(is_array($dataArr))
		{
			$proArr=array_keys($dataArr);
			$proArr=array_filter($proArr,'LibFc::Int');
			if(count($proArr))
			{
				$proData=$this->get('bc_product',['pro_count','pro_id','pro_status','pro_shop_id','pro_sold_count'],sprintf(' and pro_id in (%s)',implode(',',$proArr)));
				$proInfo=array_column($proData['data'],null, 'pro_id');
				if(count($proInfo))
				{
					$this->B2CDb->Begin();
					foreach($proArr as $proId)
					{
						if($type=='add')
						{
							$target['pro_count']='#@pro_count+'.$dataArr[$proId];//加库存
						}
						else
						{
							//判读剩下库存是小于0，为0则下架
							if(($proInfo[$proId]['pro_count']-$dataArr[$proId])<=0)
							{
								$target['pro_status']=0;
								$target['pro_count']=0;
							}
							else
							{
								$target['pro_status']=$proInfo[$proId]['pro_status'];
								//判断购买数量是否多于库存
								$target['pro_count']='#@pro_count-'.$dataArr[$proId];//减库存
							}
						}
						if(!empty($target))
							$this->set('bc_product',$target,sprintf('and pro_id=%d',$proId));
					}
					$this->B2CDb->End();
					return LibFc::ReturnData(true,true);
				}
			}
		}
		return LibFc::ReturnData(false,'setProSaleNum 参数错误');
	}
	/**
	 * @method    修改订单库存和销量
	 * @param     [int]           $orderId [订单ID]
	 * @param     string           $type    [add|''   add代表加销量减库存   ''则相反]
	 * @param     string           $method  [pay|'' pay代表支付减库存 ''代表拍下减库存 all表示所有]
	 * @param     [bool]           [是否更新销量]  true 是 false 否 默认为更新销量
	 * @return    [arr]                    ['status'=>true,'data'=>true]
	 * @author 卢
	 * @copyright 2017-09-08
	 */
	public function updateOrdSaleNum($orderId,$type='',$method='',$updateSold=true)
	{
		if(!empty($orderId))
		{
			$orderId=is_array($orderId)?$orderId:[(int)$orderId];
			if($method=='all')
			{
				$inventery='all';
			}
			else
			{
				$inventery=$method=='pay'?0:1;
			}
			// $inventery=$method=='pay'?0:1;
			$where=sprintf('and orp_ord_id in (%s)',implode(',',$orderId));
			//获取订单店铺
			$shopData=$this->get('or_order',['ord_shop_id','ord_id'],sprintf(' and ord_id in (%s)',implode(',',$orderId)));
			$shopData['data']=array_column($shopData['data'],null ,'ord_id');
			$res=$this->get('or_order_product',['*'],$where);
			$dataArr=[];
			// print_r($res);
			// die;
			foreach ($res['data'] as $v) 
			{
				if($inventery=='all'&&$v['orp_status']!=='cancel')
				{
					$dataArr[$v['orp_pro_id']]+=$v['orp_count'];
				}
				else if($v['orp_set_inventory']==$inventery&&$v['orp_status']!=='cancel')
				{
					$dataArr[$v['orp_pro_id']]+=$v['orp_count'];
				}
			}
			$this->B2CDb->Begin();
			if($updateSold&&count($dataArr))
			{
				//更改销量
				$this->setProSaleNum($dataArr,$type);
			}
			if(count($dataArr))
			{
				//更改库存
				$type=$type=='add'?'':'add';
				$this->setProCount($dataArr,$type);
			}
			$this->B2CDb->End();
			return LibFc::ReturnData(true,true,"");
		}
		return LibFc::ReturnData(false,'参数错误',"");
	}
	/**
	 * @method    删除的订单还原
	 * @param     [int|arr]             $orderId [订单ID]
	 * @param     [int]             $id      [用户ID|店铺ID]
	 * @param     boolean            $isUser  [是否为用户默认为false]
	 * @return    [bool]                      ['status'=>true,'data'=>true]
	 * @author 卢
	 * @copyright 2017-09-11
	 */
	public function restoreDeleteOrder($orderId,$id,$isUser=false)
	{
		if(LibFc::Int($id)&&!empty($orderId))
		{
			$B2cLog = new B2cLog();
			$orderArr=is_array($orderId)?$orderId:[(int)$orderId];
			$where=$isUser?sprintf(' and ord_id in (%s) and ord_uid=%d',implode(',',$orderArr),$id):sprintf(' and ord_id in (%s) and ord_shop_id=%d',implode(',',$orderArr),$id);
			$target=['ord_user_delete'=>0,'ord_seller_delete'=>0];
			$this->B2CDb->Begin();
			$res=$this->set('or_order',$target,$where);
			//恢复删除订单，加销量，减库存(拍下减库存的配件)
			// foreach ($orderArr as $k => $v) 
			// {
			// }
			$this->updateOrdSaleNum($orderArr,'add','',false);
			if($isUser==false)
			{
				$logArr=['log_shop_id'=>$id,'log_category'=>10,'log_txt'=>'还原订单ID：'.implode(',',$orderArr)];
				$logArr['log_dataid']=$orderArr;
				$B2cLog->addFastLog($logArr);
			}
			$this->B2CDb->End();
			return LibFc::ReturnData(true,true,"");
		}
		return LibFc::ReturnData(false,'参数错误',"");
	}
	/**
	 * @method    根据套餐ID获取套餐信息
	 * @param     [int|array]         $packId [套餐ID]
	 * @param     [int]         $userId [用户ID]
	 * @return    [arrar]        ['shop'=>905,'pro'=>['10083'=>['pro_id'=>1231233,'pro_name'=>xxxx]]] 该套餐的配件信息(满减，会员优惠等)
	 * @author 卢
	 * @copyright 2017-10-19
	 */
	public function getPackProInfo($packId,$userId)
	{
		if(!empty($packId)&&LibFc::Int($userId))
		{
			$B2cUserFavourable= new B2cUserFavourable();
			$B2cProduct=new B2cProduct();
			$packArr=is_array($packId)?$packId:[(int)$packId];
			$packData=$this->get('bc_product_pack left join bc_product_pack_link on prpa_id=prpl_prpa_id',['*'],sprintf(' and  prpa_id in (%s) and prpa_btime<=%d and prpa_etime>=%d',implode(',',$packArr),time(),time()));
			// $packData['data']=array_column($packData['data'], null,'prpa_id');
			$packRes=[];
			if(count($packData['data']))
			{
				$data=[];
				foreach ($packData['data'] as $k => $v) 
				{
					$data[$v['prpa_id']][]=$v;
				}
				foreach($data as $packId =>$proArr)
				{
					$proIdArr=array_column($proArr, 'prpl_pro_id');//配件ID
					$discount=array_column($proArr, 'prpa_user_discount');//会员打折
					$shopId=array_column($proArr, 'prpa_shop_id');
					$shopId=$shopId[0];
					$discount=$discount[0];
					$discount='N';
					$manjian=array_column($proArr, 'prpa_manjian');//是否套餐可以满减
					$manjian=$manjian[0];
					$packPrice=array_column($proArr, 'prpa_price');//套餐价格
					$packPrice=$packPrice[0];
					$frtTpl=array_column($proArr, 'prpa_frt_id');//套餐运费模板
					$frtTpl=$frtTpl[0];
					$packName=array_column($proArr, 'prpa_name');//套餐名称
					$packName=$packName[0];
					//取配件
					$fieldArr=[
						'pro_id',
						'pro_name',
						'pro_shop_id',
						'pro_sale_price',
						'pro_promotion_price',
						'pro_count',
						'pro_user_discount',
						'pro_promotion_btime',
						'pro_promotion_etime',
						'pro_manjian',
						'pri_set_inventory',
						'pro_prh_id'
					];
					$proData=$B2cProduct->getProduct($fieldArr, sprintf(' and pro_id in (%s)',implode(',',$proIdArr)));
					$picData=$B2cProduct-> getProductPic($proIdArr);
					$result=[];
					$proSalePrice=array_column($proData['data'], 'pro_sale_price');//配件价格
					$proSaleTotal=array_sum($proSalePrice);//配件总价
					// print_r($proSaleTotal);
					// echo '</br>';
					$disPackPrice=$proSaleTotal-$packPrice;//套餐优惠总价，未算上会员折扣和满减
					// print_r($disPackPrice);
					// echo '</br>';
					//是否会员,取折扣
					$disData=$B2cUserFavourable->getMemMsgByUid($userId,$shopId,['mem_discount','mel_name','mel_id','meml_mem_id','men_manjian']);
					$disNum=10;
					$manJianMoney=0;//参与满减的配件总额，会员折扣后
					$cutMoney=0;
					$tag=true;//会员能否满减
					$shopData=$this->get('sh_shop',['shop_name','shop_domain'],' and shop_id='.$shopId,true);		
					//配件判断会员和满减
					$disPrice=$disPackPrice;//总共优惠的价格
					$packRes[$packId]['totalPackPrice']=0;
					$index=1;
					$proNum=count($proData['data']);//套餐配件总数
					$notLast=0;//除了最后一个配件的总价格
					foreach ($proData['data'] as $k => $pro) 
					{				
						$result[$pro['pro_id']]=$pro;
						$result[$pro['pro_id']]['packPrice']=$packPrice;
						$result[$pro['pro_id']]['packName']=$packName;
						$result[$pro['pro_id']]['byNum']=1;
						$result[$pro['pro_id']]['discount']=$disNum;
						$result[$pro['pro_id']]=isset($picData['data'][$pro['pro_id']])?array_merge($result[$pro['pro_id']],$picData['data'][$pro['pro_id']][0]):$result[$pro['pro_id']];
						$result[$pro['pro_id']]['shopName']=$shopData['data']['shop_name'];
						$result[$pro['pro_id']]['shopUrl']=$shopData['data']['shop_domain'];
						//为了防止小数不准确，到最后一个配件时用配件总价减去前面的配件总价
						if($index==$proNum)
						{
							$proRealPrice=round($proSaleTotal-$disPrice-$notLast,2);//最后一件的价格
						}
						else
						{
							$proRealPrice=$pro['pro_sale_price']-round(($pro['pro_sale_price']/$proSaleTotal)*$disPrice,2);
							$notLast+=$proRealPrice;
						}
						$result[$pro['pro_id']]['pri_frt_id']=$frtTpl;
						$result[$pro['pro_id']]['is_member']=isset($disData['data'][$shopId]['mel_name'])?isset($disData['data'][$shopId]['mel_name']):'会员';
						$result[$pro['pro_id']]['is_manJian']=$manjian=='Y'?1:0;
						$result[$pro['pro_id']]['realPrice']['packPrice']=$proRealPrice;//套餐中每个配件优惠后价格
						$result[$pro['pro_id']]['totalPrice']['salePrice']=$proRealPrice;//套餐中每个配件优惠后价格
						$result[$pro['pro_id']]['disMoney']=$pro['pro_sale_price']-$proRealPrice;//单个配件减的价格
						$result[$pro['pro_id']]['level']=isset($disData['data'][$shopId]['mel_id'])?$disData['data'][$shopId]['mel_id']:0;
						$result[$pro['pro_id']]['pro_user_discount']=$pro['pro_user_discount'];
						$packRes[$packId]['totalPackPrice']+=$proRealPrice;
						$result[$pro['pro_id']]['packId']=$packId;
						$packRes[$packId]['pro']=$result;
						$index++;
					}
					$packRes[$packId]['shopId']=$shopId;
					$packRes[$packId]['packId']=$packId;

				}
				// print_r($packRes);
				// die;
				return LibFc::ReturnData(true, $packRes);
			}
			return LibFc::ReturnData(true, $packRes);
		}
		return LibFc::ReturnData(false, 'getPackProInfo参数错误');
	}




	/**
	  * @method 获取退款详情
	  * @param  $repId
	  * @author xu
	  * @copyright 2017/10/30
	  * @return [["status"]=> bool(true) ["data"]=> [''=>[''] ["code"]=> int(0) ]
	  */
	public function getRefundkMsg($repId)
	{
		if(!LibFc::Int($repId))
		{
			return LibFc::ReturnData(false,'参数错误');
		}
		$res = $this->get('or_refund_pact left join or_order_product on rep_orp_id=orp_id left join or_order on rep_ord_id=ord_id ',['*'],sprintf(" and rep_id=%d ",$repId), true);
		$repArr = $res['data'];
		if(empty($repArr)) return LibFc::ReturnData(false,'退款记录不存在！');


		// 获取当前退款申请对应的所有操作日志
		$res = $this->get('or_refund_pact left join or_refund_log on rel_rep_id=rep_id ',['rel_rep_id','rel_txt','rep_uid','rel_atime','rel_utype'],sprintf(" and rep_orp_id=%d and rep_id=%d order by rel_atime desc ",$repArr['orp_id'],$repId));
		$repArr['repLog'] = $res['data'];
		//配件图片
		$B2cProduct = new B2cProduct;
		$res = $B2cProduct->getProductPic([$repArr['orp_pro_id']]);
		$repArr['proPicArr'] = isset($res['data'][$repArr['orp_pro_id']])?current($res['data'][$repArr['orp_pro_id']]):[];
		
		//卖家信息
		$B2cShop = new B2cShop();
		$res = $B2cShop->getShopInfo($repArr['ord_shop_id']);
		$repArr['shopInfo'] = $res['data'];


		// 获取买家头像
		$YpwUser = new YpwUser();
		$res = $YpwUser->Get('yp_user', array('u_logo',), ' and u_id='.$repArr['ord_uid'], true);
		$userInfo['logo'] = $res['data']['u_logo'];
		// 获取买家名称
		$res = $this->get('us_user_base',['ub_username'],sprintf(" and ub_uid=%d ",$repArr['ord_uid']),true);
		$userInfo['username'] = $res['data']['ub_username'];

		$repArr['userInof'] = $userInfo;

		// 获取所有退款原因、
		$res = $this->getRefundReason('all');
		$repArr['allRefundReason'] = $res['data'];

		return LibFc::ReturnData(true, $repArr);
	}


	/**
	 * @method   关闭配件订单售后服务
	 * @param     [int|arr] $orpId [配件订单ID]
	 * @param     [int|arr] $orderId [订单ID]
	 * @return    [bool] ['status'=>true,'data'=>true]
	 * @author 	xu
	 * @copyright 2017-11-02
	 */
	public function closeServiceApply($orpId,$orderId,$optionUserType,$optDes)
	{
		if(!LibFc::Int($orpId) || !LibFc::Int($orderId))
		{
			return LibFc::ReturnData(false,'参数错误');
		}
		$optionUserType = (int)$optionUserType==1?1:0;
		// 校验当前的配件订单状态不能使refunded cancle creat
		$res = $this->get('or_order_product left join or_order on ord_id=orp_ord_id ',['ord_status'],sprintf(" and ord_id=%d and orp_id=%d and orp_status not in ('refunded','cancle','creat') ",$orderId,$orpId),true);
		if(empty($res['data']))
		{
			return LibFc::ReturnData(false,'参数错误！');
		}
		$thisOrderStatus = $res['data']['ord_status'];
		$res = $this->get('or_refund_pact',['rep_id'],sprintf(" and rep_orp_id=%d and rep_ord_id=%d ",$orpId,$orderId),true);
		if(empty($res['data']))
		{
			return LibFc::ReturnData(false,'退款记录不存在！');
		}
		$repId = $res['data']['rep_id'];
		// 开启事务
		$this->B2CDb->Begin();
		// 更新退款申请表状态
		$res = $this->set('or_refund_pact',array('rep_status'=>'close','rep_close_time'=>time(),'rep_etime'=>time()),sprintf(" and rep_orp_id=%d and rep_ord_id=%d ",$orpId,$orderId));
		// 新增日志信息
		$logArr = [
			'rel_rep_id'=>$repId,
			'rel_txt'=>$optDes,
			'rel_utype'=>$optionUserType
		];
		$this->addRefundLog($logArr);
		// 提交事务
		$this->B2CDb->End();
		return LibFc::ReturnData(true,true);
	}

	/**
	  * @method 返回倒计时长
	  * @param  $repArr
	  * @author xu
	  * @copyright 2017/11/07
	  * @return [["status"]=> bool(true) ["data"]=> ['time'=>123213] ["code"]=> int(0) ]
	  */
	public function getRemaintime($repArr)
	{
		$remainTime = 0;
		// 买家申请仅退款
		if(!$repArr['rep_type'])
		{
			// 卖家期限内同意否则自动退还金额
			if($repArr['rep_status']=='wait')
			{
				// 未发货(与申请时间对比)
				if($repArr['orp_status']=='paied')
				{
					$remainTime =mvc::$cfg['ORDER']['notSendRefundConfirm']*24*60*60 + $repArr['rep_apply_time'] - time();
				}
				// 已发货(与申请时间对比)
				if($repArr['orp_status']=='completed' || $repArr['orp_status']=='completed' || $repArr['orp_status']=='send')
				{
					$remainTime =mvc::$cfg['ORDER']['sendRefundConfirm']*24*60*60 + $repArr['rep_apply_time'] - time();
				}
			}
			// 卖家拒绝买家需要期限内同意否则订单自动关闭(与拒绝时间对比)
			if($repArr['rep_status']=='refuse')
			{
				$remainTime =mvc::$cfg['ORDER']['RefuseBuyerApply']*24*60*60 + $repArr['rep_refuse_time'] - time();
			}
		}

		// 买家申请退货退款
		if($repArr['rep_type']==1)
		{	
			// 等待卖家同意（与申请时间对比）
			if($repArr['rep_status']=='wait')
			{
				$remainTime =mvc::$cfg['ORDER']['sendRefundConfirm']*24*60*60 + $repArr['rep_apply_time'] - time();
			}
			// 卖家同意之后，买家期限内寄回，否则退款关闭
			if($repArr['rep_status']=='confirm')
			{
				$remainTime =mvc::$cfg['ORDER']['waitRefundPro']*24*60*60 + $repArr['rep_confirm_time'] - time();
			}
			// 买家寄出去物品之后，卖家期限内不处理则完成退款申请
			if($repArr['rep_status']=='refundpro')
			{
				$remainTime =mvc::$cfg['ORDER']['waitRefundProConfirm']*24*60*60 + $repArr['rep_confirm_time'] - time();
			}
			// 卖家拒绝退货退款申请后，买家期限内处理否则关闭订单
			if($repArr['rep_status']=='refuse')
			{
				$remainTime =mvc::$cfg['ORDER']['RefuseBuyerApply']*24*60*60 + $repArr['rep_refuse_time'] - time();
			}
		}

		// 买家申请退货退款
		if($repArr['rep_type']==2)
		{	
			// 等待卖家同意（与申请时间对比）
			if($repArr['rep_status']=='wait')
			{
				$remainTime =mvc::$cfg['ORDER']['sendRefundConfirm']*24*60*60 + $repArr['rep_apply_time'] - time();
			}
			// 卖家同意之后，卖家买家期限内同意收货
			if($repArr['rep_status']=='confirm')
			{
				$remainTime =mvc::$cfg['ORDER']['waitRefundProConfirm']*24*60*60 + $repArr['rep_confirm_time'] - time();
			}
			// 卖家拒绝退货退款申请后，买家期限内处理否则关闭订单
			if($repArr['rep_status']=='refuse')
			{
				$remainTime =mvc::$cfg['ORDER']['RefuseBuyerApply']*24*60*60 + $repArr['rep_refuse_time'] - time();
			}
		}

		return LibFc::ReturnData(true, $remainTime);
	}
	/**
	 * @method    修改运单
	 * @param     [type]      $shopId  [description]
	 * @param     [type]      $orderId [description]
	 * @param     [type]      $expNum  [运单号]
	 * @param     [type]      $express [物流代码]
	 * @param     [type]      $trackId [物流记录ID]
	 * @param     [type]      $remark  [description]
	 * @return    [type]               [description]
	 * @author 卢
	 * @copyright 2018-03-15
	 */
	public function editExpress($shopId,$expressName,$orderId,$expNum,$express,$trackId,$addrArr,$remark)
	{
		if(LibFc::Int($orderId)&&!empty($expNum)&&!empty($expressName)&&!empty($trackId)&&count($addrArr))
		{
			$res=$this->get('or_order',['ord_status'],sprintf(' and ord_id=%d',$orderId),true);
			if(!in_array($res['data']['ord_status'], ['send','paied']))
				return LibFc::ReturnData(false, '该订单暂不可修改');
			$B2cProduct=new B2cProduct();
			$B2cLog = new B2cLog();
			//发货地址
			$addr=$this->get('sh_address',['*'],sprintf(' and addr_shop_id=%d and addr_id in (%s)',$shopId,implode(',',$addrArr)));
			foreach ($addr['data'] as $k => $v) 
			{
				if($v['addr_id']==$addrArr['sendAddr'])
				{
					$sendAddr=json_encode($v,JSON_UNESCAPED_UNICODE);
				}
				if($v['addr_id']==$addrArr['refundAddr'])
				{
					$refundAddr=json_encode($v,JSON_UNESCAPED_UNICODE);
				}
			}
			//宜配物流API
			$dataArr = [
				'ext_exp_code'=>$express,
				'ext_number'=>$expNum,
				'ext_from'=>'B2C'
			];
			$LibYpApi = new LibYpApi();
			$resArr = $LibYpApi->Get('express/getTrack', $dataArr);
			//字段value
			$target=array(
				'ext_name'=>$expressName,
				'ext_exp_code'=>$express,
				'ext_exp_number'=>$expNum,
				'ext_set_time'=>time(),
				'ext_ext_id'=>($resArr['data']['ext_id']?$resArr['data']['ext_id']:0),
				'ext_track_tatus'=>(!empty($resArr['data']['ext_status'])?$resArr['data']['ext_status']:0),
				'ext_track'=>$resArr['data']['ext_track'],
				'ext_remark'=>$remark,
				'ext_send_addr'=>$sendAddr,
				'ext_refund_addr'=>$refundAddr
				);
			$logArr=['log_shop_id'=>$shopId,'log_category'=>1,'log_txt'=>'修改订单ID：'.$orderId.'运单'];
			$logArr['log_dataid']=$orderId;
			$this->B2CDb->Begin();
			$this->set('or_express_track',$target,sprintf(' and ext_id=%d',$trackId),['ext_track']);
			$B2cLog->addFastLog($logArr);
			$this->B2CDb->End();
			return LibFc::ReturnData(true,true,"");
		}
		return LibFc::ReturnData(false,'参数错误',"");
	}
	/**
	 * @method    addPackOrder
	 * @param     [int]       $userId  [用户ID]
	 * @param     [int]       $orderId [订单ID]
	 * @param     [int]       $shopId  [店铺ID]
	 * @param     [arr]       $pack    [套餐数组  ['packId'=>packNum]]
	 * @return    [arr]                ['data'=>['packTotal'=>套餐总价(已算上套餐数量),'buyNum'=>套餐数量(套),'proTotal'=>套餐配件数量]]
	 * @author 卢
	 * @copyright 2018-02-03
	 */
	public function addPackOrder($userId,$orderId,$shopId,$pack)
	{
		if((int)$userId&&(int)$orderId&&(int)$shopId&&is_array($pack))
		{
			$packArr=array_keys($pack);//套餐id
			if(count($packArr))
			{
				$packProInfo=$this->getPackProInfo($packArr,$userId);//获取套餐信息，会员后，满减后
				if(count($packProInfo['data']))
				{
					$B2cProduct=new B2cProduct();
					$this->B2CDb->Begin();
					foreach ($packProInfo['data'] as $packId => $value) 
					{
						$packNum=isset($pack[$packId])?$pack[$packId]:1;
						$packTotal=round($packNum*$value['totalPackPrice'],2);//套餐总价
						$totalNum=0;//配件总数，用于更新店铺销售量
						foreach ($value['pro'] as $proId => $pro) 
						{
							$targetPro=array(
								'orp_ord_id'=>$orderId,
								'orp_pro_id'=>$pro['pro_id'],
								'orp_pro_name'=>$pro['pro_name'],
								'orp_status'=>'creat',
								'orp_count'=>$pro['byNum']*$packNum,
								'orp_price'=>$pro['realPrice']['packPrice'],//优惠后的单价
								'orp_sale_price'=>$pro['pro_sale_price'],//下单时配件销售价
								'orp_discount'=>$pro['packName'].'套餐',//优惠说明
								'orp_set_inventory'=>$pro['pri_set_inventory'],//库存计数： 0付款减  1拍下减
								'orp_evaluate'=>0,//配件评分： 0 未评分 1已评分
								'orp_discount_val'=>$pro['discount'],//折扣0.01-10之间
								'orp_promotion_price'=>$pro['pro_promotion_price'],//下单时配件促销价
								'orp_discount_money'=>$pro['disMoney']*$pro['byNum'],//优惠总额
								'orp_money'=>$pro['realPrice']['packPrice']*$pro['byNum']*$packNum,
								'orp_prh_id'=>$pro['pro_prh_id'],//版本ID
								'orp_prpa_id'=>$packId
								);
							//更新版本信息
							$prhData=$B2cProduct->addProductHistory($pro['pro_id'],$shopId);
							if($prhData['status']&&$prhData['data'])
							{
								$targetPro['orp_prh_id']=$prhData['data'];
							}
							$proData= $this->Add('or_order_product',$targetPro);					
							if($pro['pri_set_inventory']>0)
							{
								//拍下减库存和销量，如果库存为0则下架
								$totalNum+=$pro['byNum']*$packNum;
								$proCount=($pro['pro_count']-$pro['byNum'])>0?$pro['pro_count']-$pro['byNum']:0;
								$editArr=['pro_count'=>($pro['pro_count']-$pro['byNum']),'pro_sold_count'=>'#@pro_sold_count+'.$pro['byNum']];
								if($proCount<1) 
									$editArr['pro_status']=0; 
								$this->Set('bc_product',$editArr,' and pro_id='.$pro['pro_id']);
							}
						}
						$res[$packId]=['packTotal'=>$packTotal,'buyNum'=>$packNum,'proTotal'=>$totalNum];
					}
					$this->B2CDb->End();
					return LibFc::ReturnData(true,$res);
				}
			}
		}
		return LibFc::ReturnData(false,'addPackOrder参数错误');
	}
	/**
	 * @method    订单入库
	 * @param     [arr]     $dataArr []
	 * @param     [int]     $userId  [用户ID]
	 * @param     [int]     $addrId  [地址ID]
	 * @param     [int]     $public  [是否匿名]
	 * @author 卢
	 * @copyright 2018-04-16
	 */
	public function addOrder($dataArr,$userId,$addrId,$public,$from='paojd')
	{
		if(is_array($dataArr)&&LibFc::Int($userId)&&LibFc::Int($addrId))
		{
			$shippPriceArr=$dataArr['shippPriceArr'];
			$cutMoney=$dataArr['cutMoney'];
			$shopAllTotal=$dataArr['shopAllTotal'];
			$remark=$dataArr['remark'];
			$shipping=$dataArr['shipping'];
			$YpwAddr= new YpwAddr();
			$B2cUser = new B2cUser();
			$B2cShop= new B2cShop();
			$B2cProduct=new B2cProduct();
			$addrData=$this->get('us_address',['*'],sprintf(' and add_id=%d and add_uid=%d',$addrId,$userId),true);
			$pathData=$YpwAddr->getAddrByIds($addrData['data']['add_pct_ids']);
			$areaPath=implode('',$pathData['data']);
			$orderIdArr=[];
			$this->B2CDb->Begin();
			foreach ($dataArr['proArr'] as $shop => $v) 
			{
				$totalNum=0;
				$cutMoney=!empty($cutMoney[$shop])?$cutMoney[$shop]:0;
	
				if(empty($v['norProArr']) && empty($v['packProArr'])) return LibFc::ReturnData(false, 'addOrder参数错误');
				
				foreach ($v['norProArr'] as $tp=>$pro) 
				{
					if($pro['orp_price'] < 0.01) return LibFc::ReturnData(false, $pro['orp_pro_name'].'价格异常，请联系店主');
					$v['norProArr'][$tp]['targetPro'] = array(
						'orp_pro_id'=>$pro['orp_pro_id'],
						'orp_pro_name'=>$pro['orp_pro_name'],
						'orp_status'=>'creat',
						'orp_count'=>$pro['orp_count'],
						'orp_price'=>$pro['orp_price'],//优惠后的单价
						'orp_sale_price'=>$pro['orp_sale_price'],//下单时配件销售价
						'orp_discount'=>$pro['orp_discount'],//优惠说明
						'orp_set_inventory'=>$pro['orp_set_inventory'],//库存计数： 0付款减  1拍下减
						'orp_evaluate'=>0,//配件评分： 0 未评分 1已评分
						'orp_discount_val'=>$pro['orp_discount_val'],//折扣0.01-10之间
						'orp_promotion_price'=>$pro['orp_promotion_price'],//下单时配件促销价
						'orp_discount_money'=>($pro['orp_discount_money']*$pro['orp_count']),//优惠总额
						'orp_money'=>$pro['orp_money'],
						'orp_prh_id'=>$pro['orp_prh_id']
						);
				}
		
				$targetBase=array(
					'ord_uid'=>$userId,
					'ord_shop_id'=>$shop,
					'ord_status'=>'creat',
					'ord_total_money'=>$shopAllTotal[$shop]-$cutMoney+$shippPriceArr[$shop],//订单总金额（商品总金额-券抵扣金额-商品优惠金额+运费）
					'ord_freight_money'=>($shippPriceArr[$shop]<0)?0:$shippPriceArr[$shop],//运费
					'ord_product_money'=>$shopAllTotal[$shop],//满减前总额
					'ord_product_discount'=>$cutMoney,//商品满减金额（例如满减）满减5000-500
					'ord_pay_money'=>$shopAllTotal[$shop]-$cutMoney+$shippPriceArr[$shop],//实际支付金额（不包括积分金额）
					'ord_add_time'=>time(),
					'ord_shop_remark'=>$remark[$shop],
					'ord_add_name'=>$addrData['data']['add_name'],
					'ord_add_pct_ids'=>$addrData['data']['add_pct_ids'],
					'ord_add_pct'=>$areaPath,
					'ord_add_address'=>$addrData['data']['add_address'],
					'ord_add_tel'=>$addrData['data']['add_tel'],
					'ord_add_mobile'=>$addrData['data']['add_mobile'],
					'ord_add_zip'=>$addrData['data']['add_zip'],
					'ord_incognito'=>$public,
					'ord_shipping_method'=>(in_array($shipping, [0,1]))?$shipping:0,
					'ord_evaluate'=>0,
					'ord_from'=>$from
					);
				$orderData = $this->Add('or_order',$targetBase);
				$orderIdArr[] = $orderData['data'];
				$mdProArr = [];
				foreach ($v['norProArr'] as $tp=>$pro) 
				{
					$targetPro = $pro['targetPro'];
					$targetPro['orp_ord_id'] = $orderData['data'];

					//更新版本信息
					$prhData=$B2cProduct->addProductHistory($pro['orp_pro_id'],$shop);
					if($prhData['status']&&$prhData['data'])
					{
						$targetPro['orp_prh_id']=$prhData['data'];
					}
					$this->add('or_order_product',$targetPro);
					if($pro['orp_set_inventory']>0)
					{
						//拍下减库存和销量，如果库存为0则下架
						$totalNum+=$pro['orp_count'];
						$proCount=($pro['pro_count']-$pro['orp_count'])>0?$pro['pro_count']-$pro['orp_count']:0;
						$editArr=['pro_count'=>($pro['pro_count']-$pro['orp_count']),'pro_sold_count'=>'#@pro_sold_count+'.$pro['orp_count']];
						if($proCount<1) $editArr['pro_status']=0; 
						$this->set('bc_product',$editArr,' and pro_id='.$pro['orp_pro_id']);
					}
					//明达erp需要的库存
					$mdProArr[] = [
						'wareamount'=>$targetPro['orp_count'],
						'pro_id'=>$targetPro['orp_pro_id'],
						'price'=>$targetPro['orp_sale_price']
					];
				}

				if(in_array($shop,[732634,965832,250162]))
				{
					$dataArr = [
						'address'=>[
							'telephone'=>$addrData['data']['add_mobile']?:$addrData['data']['add_tel'],
							'linkman'=>$addrData['data']['add_name'],
							'receiveaddress'=>$areaPath.$addrData['data']['add_address']
						],
						'proId'=>$mdProArr,
						'orderId'=>$orderData['data'],
						'remark'=>$remark[$shop]
					];
					if($shop==732634)
					{
						$B2cCustom = new B2cCustom();
						$B2cCustom->createOrderByDy($userId,$dataArr);
					}
					if($shop==965832)
					{
						$B2cBDCustom = new B2cBDCustom();
						$B2cBDCustom->createOrderByDy($userId,$dataArr);
					}
					if($shop==250162)
					{
						$B2cTylCustom = new B2cTylCustom();
						$B2cTylCustom->createOrderByDy($userId,$dataArr);
					}
					
				}
				
				if(!empty($v['packProArr']))
				{
					$packRes=$this->addPackOrder($userId,$orderData['data'],$shop,$v['packProArr']);
					if($packRes['status'])
					{
						foreach ($packRes['data'] as $packId => $v) 
						{
							$totalNum+=$v['proTotal'];
						}
					}
				}

				if($totalNum>0)
				{
					$B2cShop->updateShopSoldCount($shop,$totalNum);
				}
			}
			$this->B2CDb->End();
			return LibFc::ReturnData(true,$orderIdArr,"");
		}
		return LibFc::ReturnData(false,'addOrder参数错误',"");
	}





	/**
	  * @method 获取订单所有变动日志
	  * @param  $orderId [int]
	  * @author xu
	  * @copyright 2018/04/26
	  * @return [["status"]=> bool(true) ["data"]=>['user','key','time','des']  ["code"]=> int(0) ]
	  */
	public function getOrderLog($orderId)
	{
		if(!LibFc::Int($orderId))
			return LibFc::ReturnData(false,'getOrderLog参数错误');

		// 系统日志
		$sysLog = array();
		// 售后详情
		$refundLog = array();


		// 订单状态枚举
		$statusDes = [
			'creat'=>'订单创建-待支付',
			'paied'=>'支付完成-待发货',
			'send'=>'已发货-待确认收货',
			'cancel'=>'订单已取消',
			'completed'=>'订单完成'
		];
		// 操作人枚举
		$actionUser  = [
			0 => '卖家',
			1 => '买家',
			2 => '系统'
		];

		// 获取订单日志
		$res = $this->get('or_order_log',['*'],sprintf(" and orl_ord_id=%d",$orderId));
		if(!empty($res['data']))
		{
			foreach ($res['data'] as $k => $v) {
				$sysLog[] = [
					'user' => $v['orl_by_uname'],
					'key' => $v['orl_ord_id'],
					'time' => $v['orl_atime'],
					'des' => $v['orl_text'].'，订单状态：'.$statusDes[$v['orl_old_status']].'更改为'.$statusDes[$v['orl_new_status']],
				];
			}
			// 排序
			$key_arrays = array();
			foreach ($sysLog as $kk => $vv)
			{
				$key_arrays[] = $vv['time'];
			}
			array_multisort($key_arrays,SORT_DESC,$sysLog);
		}

		// 售后详情
		$table = 'or_order_product left join or_refund_pact on rep_orp_id=orp_id';
		$res = $this->get($table,['rep_id','orp_pro_name'],sprintf("and rep_ord_id=%d",$orderId));
		if(!empty($res['data']))
		{
			$repIds = array_column($res['data'], 'rep_id');
			$repIdToProName = array_column($res['data'], 'orp_pro_name' ,'rep_id');
			// 获取所有日志
			$table = 'or_refund_log left join or_refund_pact on rep_id=rel_rep_id left join or_order_product on orp_id=rep_orp_id';
			$res = $this->get($table,['or_refund_log.*','orp_status'],sprintf("and rel_rep_id in (%s)",implode(',', $repIds)));
			foreach ($res['data'] as $k => $v) {
				if($v['rel_utype']==2) {
					$v['rel_by_uname'] = $actionUser[$v['rel_utype']];
				}
				$refundLog[] = [
					'user' => $v['rel_by_uname'],
					'key' => $v['rel_by_uid'],
					'time' => $v['rel_atime'],
					'des' => '配件：'.LibFc::CutStr($repIdToProName[$v['rel_rep_id']],16).'，描述：'.$v['rel_txt'],
					'utype' => $v['rel_utype'],
				];
			}
			// 排序
			$key_arrays = array();
			foreach ($refundLog as $kk => $vv)
			{
				$key_arrays[] = $vv['time'];
			}
			array_multisort($key_arrays,SORT_DESC,$refundLog);
		}
		
		return LibFc::ReturnData(true,['sysLog'=>$sysLog,'refundLog'=>$refundLog]);
	}



	/**
	  * @method 获取订单内所有物流信息
	  * @param  $orderId [int]
	  * @author xu
	  * @copyright 2018/05/02
	  * @return [["status"]=> bool(true) ["data"]=>['']  ["code"]=> int(0) ]
	  */
	public function getOrderExpressInfo($orderId)
	{
		if(!LibFc::Int($orderId))
			return LibFc::ReturnData(false,'getOrderExpressInfo 参数错误！');

		// 获取所有配件订单物流
		$table = "or_order_product left join or_express_track on orp_ext_id=ext_id";
		$res = $this->get($table,['*'],sprintf("and orp_ord_id=%d",$orderId));
		if(empty($res['data'])) return LibFc::ReturnData(true,true);

		// 发货收货信息处理
		$express = $res['data'];
		foreach ($express as $k => $v) {
			$express[$k]['ext_send_addr'] = json_decode($v['ext_send_addr'],true);
			$express[$k]['ext_refund_addr'] = json_decode($v['ext_refund_addr'],true);
		}

		// 拼接API查询参数-订单号
		$extInfo = array();
		foreach ($express as $k => $v)
		{
			if(!empty($v['ext_exp_code']) && !empty($v['ext_exp_number']))
			{
				$extInfo[$k]['ext_exp_code'] = $v['ext_exp_code'];
				$extInfo[$k]['ext_number'] = $v['ext_exp_number'];
				$extInfo[$k]['ext_from'] = 'B2C';
			}
		}
		if(empty($extInfo)) return LibFc::ReturnData(true,$express);

		$LibYpApi = new LibYpApi();
		$api = array();
		foreach ($extInfo as $k => $v)
		{
			$res = $LibYpApi->Get('express/getTrack',$v);
			$extTrack = [];
			if(!empty($res['data']['ext_track']))
			{
				$temp = json_decode($res['data']['ext_track'],true);
				// 按日期分组
				foreach ($temp as $kk => $vv) {
					$extTrack[date("Y-m-d",$vv['time'])][] = $vv;
				}
			}
			$api[$v['ext_number']] = $extTrack;
		}

		// 拼接返回
		foreach ($express as $key => $value) {
			$express[$key]['ext_info'] = $api[$value['ext_exp_number']];
		}
		
		return LibFc::ReturnData(true,$express);
	}
	/**
	 * @method    检查是否达到满减要求
	 * @param     [int]       $userId   [用户id]
	 * @param     array        $dataArr  [['proArr'=>[],'nPrefer'=>[]]] 配件数组和优惠方式数组，以店铺ID为键
	 * @param     array        $packData [] 套餐数组，以店铺ID为键
	 * @param     array        $manArr   [当前选中的优惠方式],以店铺ID为键  可选
	 * @return    [type]                 [description]
	 * @author 卢
	 * @copyright 2018-07-04
	 */
	function checkManJian($userId,$dataArr=[],$packData=[],$manArr=[])
	{
		if(empty($dataArr)&&empty($packData))
		{
			return LibFc::ReturnData(true,[]); 
		}
		$dataProArr=$dataArr['proArr'];
		$datanPrefer=$dataArr['nPrefer'];
		$data=[];
		$manJianTotal=[];
		$allTotal=[];
		$shopArr=[];
		if(!empty($dataProArr)&&!empty($datanPrefer))
		{
			$proArr=[];
			foreach ($dataProArr as $shop => $v) 
			{
				$proArr=array_merge($proArr,array_keys($v));
				$shopArr[]=$shop;
			}
			$res=$this->getProductRealInfo($proArr,$userId,$shopArr,$dataProArr);
			// print_r($res);
			// die;
			if(count($res['data']))
			{
				foreach ($res['data'] as $shop => $v) 
				{
					// $manJianTotal[$shop]=0;
					foreach ($v as $pro) 
					{
						if($pro['is_manJian'])
						{
							switch ($datanPrefer[$shop][$pro['pro_id']]) 
							{
								case '1':
									$manJianTotal[$shop]+=($pro['realPrice']['promPrice']*$pro['byNum']);
									break;
								case '2':
									$manJianTotal[$shop]+=($pro['realPrice']['vipPrice']*$pro['byNum']);
									break;
								case '3':
									$manJianTotal[$shop]+=($pro['realPrice']['comPrice']*$pro['byNum']);
									break;
								default:
									$manJianTotal[$shop]+=($pro['pro_sale_price']*$pro['byNum']);
									break;
							}
						}
						switch ($datanPrefer[$shop][$pro['pro_id']]) 
						{
							case '1':
								$allTotal[$shop]+=($pro['realPrice']['promPrice']*$pro['byNum']);
								break;
							case '2':
								$allTotal[$shop]+=($pro['realPrice']['vipPrice']*$pro['byNum']);
								break;
							case '3':
								$allTotal[$shop]+=($pro['realPrice']['comPrice']*$pro['byNum']);
								break;
							default:
								$allTotal[$shop]+=($pro['pro_sale_price']*$pro['byNum']);
								break;
						}
					}
				}
			}
			// print_r($allTotal);
			// die;
			
		}
		if(!empty($packData))
		{
			$packArr=[];
			foreach ($_POST['packArr'] as $shop => $pack) 
			{
				$shopArr[]=$shop;
				$packArr=array_merge($packArr,array_keys($pack));
			}
			$res=$this->getPackProInfo($packArr,$userId);
			if($res['data'])
			{
				foreach ($res['data'] as $packId=>$v) 
				{
					$allTotal[$v['shopId']]+=($v['totalPackPrice']*$_POST['packArr'][$shop][$packId]);
					if(current($v['pro'])['is_manJian'])
					{
						$manJianTotal[$v['shopId']]+=$v['totalPackPrice']*$_POST['packArr'][$shop][$packId];
					}
				}
			}
		}
		$shopArr=array_unique($shopArr);
		if(count($shopArr))
		{
			foreach ($shopArr as $shopId) 
			{
				$data[$shopId]['orTotal']=$allTotal[$shopId];
				$data[$shopId]['total']=$allTotal[$shopId];
				$data[$shopId]['seleTotal']=$allTotal[$shopId];
				$data[$shopId]['manjian']=[];
			}
		}
		if(count($manJianTotal))
		{
			foreach ($manJianTotal as $shop => $total) 
			{
				$res=$this->get('sh_manjian',['man_id','man_full_money','man_cut_money','man_shop_id'],sprintf(' and man_full_money<=%f and man_shop_id=%d and man_btime<=%d and man_etime>=%d order by man_cut_money desc',$total,$shop,time(),time()));
				
				if($res['data'])
				{
					foreach ($res['data'] as $k => $v) 
					{
						$res['data'][$k]['man_full_money']=sprintf('%.2f',$v['man_full_money']);
						$res['data'][$k]['man_cut_money']=sprintf('%.2f',$v['man_cut_money']);
						if(!empty($manArr[$shop])&&$manArr[$shop]==$v['man_id'])
						{
							$money=$v['man_cut_money'];
						}
					}
					if(!empty($manArr[$shop])){
						$data[$shop]['seleTotal']=$allTotal[$shop]-$money;//当前选择的满减方式总价
					}elseif($manArr[$shop]==='0'){
						$data[$shop]['seleTotal']=$allTotal[$shop];//选中无优惠
					}else{
						$data[$shop]['seleTotal']=$allTotal[$shop]-$res['data'][0]['man_cut_money'];//默认最优的满减总价
					}
					$data[$shop]['total']=$allTotal[$shop]-$res['data'][0]['man_cut_money'];//最优的满减总价
				}
				$data[$shop]['manjian']=$res['data'];
			}
		}
		return LibFc::ReturnData(true,$data);
	}

}