<?php
/**
  * @method 跑街令 订单操作
  * @author soul
  * @copyright 2018/7/23
  */
class PjlOrder extends PjlBase
{
	public function __construct()
	{
		parent::__construct();
		LibFc::useMainDb();
	}

	/**
	  * @method 添加订单
	  * @param  $dataArr 基本信息['ord_pu_uid'=>下单人, 'ord_shop_id'=>店铺ID, 'ord_pur_id'=>采购单ID, 'ord_po_id'=>报价单ID.....]
	  * @param  $addrArr 收货人信息[name: tel: addr:]
	  * @param  $proArr 配件信息[['odp_pup_id'=>, 'odp_quality'=>'原厂']]
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=> $ordId, "code"=>""]
	  */
	public function addOrder($dataArr, $addrArr, $proArr)
	{
		$must = ['ord_pu_uid', 'ord_shop_id', 'ord_pur_id', 'ord_po_id'];
		foreach($must as $filed)
		{
			if(!isset($dataArr[$filed]) || empty($dataArr[$filed]) || $dataArr[$filed] < 1)
				return LibFc::ReturnData(false, '添加订单的'.$filed.'参数不能空！');
			$dataArr[$filed] = (int) $dataArr[$filed];
		}

		//查看是否已经下订单
		$res = $this->get('pl_order',['count(*) count'], sprintf("and ord_pur_id=%d and ord_po_id =%d and ord_status!='cancel'",$dataArr['ord_pur_id'],$dataArr['ord_po_id']),true);
		if($res['data']['count'] > 0)
			return LibFc::ReturnData(false, '订单已存在!');
		
		if(empty($addrArr) || !is_array($addrArr))
			return LibFc::ReturnData(false, '收货人信息不完整！');
		if(empty($addrArr['name']))
			return LibFc::ReturnData(false, '收货人姓名不能为空！');
		if(empty($addrArr['tel']) || !preg_match('/\d{6,}/', $addrArr['tel']))
			return LibFc::ReturnData(false, '收货人电话不正确！');
		if(empty($addrArr['addr']) || strlen($addrArr['addr']) < 10)
			return LibFc::ReturnData(false, '收货人地址不正确！');

		$dataArr['ord_addr'] = json_encode($addrArr,JSON_UNESCAPED_UNICODE);
		
		$dataArr['ord_status'] = 'creat';
		$dataArr['ord_money'] = 0.00;
		$dataArr['ord_pro_money'] = 0.00;
		$dataArr['ord_freight_money'] = 0.00;
		$dataArr['ord_atime'] = time();
		unset($dataArr['ord_id']);
		unset($dataArr['ord_pay_time']);
		unset($dataArr['ord_orp_id']);
		unset($dataArr['ord_send_time']);
		unset($dataArr['ord_send_info']);
		unset($dataArr['ord_coplete_time']);
		unset($dataArr['ord_eva_time']);

		//下单人、采购单、店铺、报价单是否一致
		$table = 'pl_purchase JOIN pl_purchase_offer ON pur_id=po_pur_id';
		$where = sprintf(" and pur_pu_id=%d and pur_id=%d and po_id=%d and po_shop_id=%d",
			$dataArr['ord_pu_uid'], $dataArr['ord_pur_id'], $dataArr['ord_po_id'], $dataArr['ord_shop_id']);
		$res = $this->get($table, ['*'], $where, true);
		if(empty($res['data']))
			return LibFc::ReturnData(false, 'addOrder提供的采购单ID、报价单ID数据有误！');
		$purArr = $res['data'];

		if($purArr['po_status'] != 1)
			return LibFc::ReturnData(false, '报价单已关闭，禁止下单！');
		
		$dataArr['ord_model_info'] = [
			'mod3_id'=>$purArr['pur_mod3_id'], 
			'brand_id'=>$purArr['pur_mod3_id'], 
			'model'=>$purArr['pur_model']
		];
		$dataArr['ord_model_info'] = json_encode($dataArr['ord_model_info'],JSON_UNESCAPED_UNICODE);
		$dataArr['ord_pur_imgs'] = $purArr['pur_imgs'];


		$table = 'pl_purchase_product JOIN pl_purchase_offer_price ON pup_id=pop_pup_id';
		$res = $this->get($table, ['*'], sprintf(" and pup_pur_id=%d and pop_po_id=%d", $dataArr['ord_pur_id'], $dataArr['ord_po_id']));
		$offProArr = array_column($res['data'], null, 'pup_id');
		
		foreach($proArr as $key=>$pro)
		{
			if(empty($offProArr[$pro['odp_pup_id']]))
				return LibFc::ReturnData(false, 'addOrder提供的odp_pup_id数据有误！');
			$tArr = $offProArr[$pro['odp_pup_id']];
			
			//根据品质确认价格
			$price = 0.00;
			$tArr['pop_price'] = json_decode($tArr['pop_price'], true);
			foreach($tArr['pop_price'] as $qprice)
			{
				if($qprice['quality'] == $pro['odp_quality'])
				{
					$price = sprintf("%.2f", $qprice['price']);
				}
			}
			//此品质的报价不存在
			if($price <= 0)
				return LibFc::ReturnData(false, 'addOrder提供的odp_quality数据有误！');
			
			$proArr[$key]['odp_pup_id'] = $tArr['pup_id'];
			$proArr[$key]['odp_pop_id'] = $tArr['pop_id'];
			$proArr[$key]['odp_count'] = $tArr['pup_count'];
			$proArr[$key]['odp_price'] = $price;
			$proArr[$key]['odp_money'] = sprintf("%.2f", $tArr['pup_count']*$price);
			$proArr[$key]['odp_pup_name'] = $tArr['pup_name'];
			$proArr[$key]['odp_pup_number'] = $tArr['pup_number'];
			$dataArr['ord_pro_money'] += $proArr[$key]['odp_money'];
		}

		//入库
		$this->PjlDb->Begin();
		$dataArr['ord_money'] = $dataArr['ord_pro_money'];
		$res = $this->add('pl_order', $dataArr);
		$ordId = $res['data'];
		foreach($proArr as $pro)
		{
			unset($pro['odp_id']);
			$pro['odp_ord_id'] = $ordId;
			$pro['odp_atime'] = time();
			$pro['odp_etime'] = $pro['odp_atime'];
			$this->add('pl_order_product', $pro);
		}
		$this->PjlDb->End();
		return LibFc::ReturnData(true, $ordId);
	}

	
	/**
	  * @method 修改订单
	  * @param  $addrArr 收货人信息[name: tel: addr:]
	  * @param  $priceArr 配件单价与数量[odp_id=>['count'=>'', 'price'=>'']...]
	  * @param  $freigh 运费[可选]
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=> $ordId, "code"=>""]
	  */
	public function setOrder($ordId, $addrArr=[], $priceArr = [], $freigh = null)
	{
		$ordId = (int) $ordId;
		if($ordId > 0)
		{
			$res = $this->get('pl_order', ['*'], sprintf(" and ord_id=%d", $ordId), true);
			if(empty($res['data']))
				return LibFc::ReturnData(false, 'setOrder提供的ordId不存在！');
			$ordArr = $res['data'];
			if($ordArr['ord_status'] !== 'creat')
				return LibFc::ReturnData(false, '此订单状态不允许修改订单信息！');
			
			$setArr = ['ord_pro_money'=>$ordArr['ord_pro_money'], 'ord_freight_money'=>$ordArr['ord_freight_money']];
			if(!empty($addrArr))
			{
				$ordArr['ord_addr'] = json_decode($ordArr['ord_addr'], true);
				if(!empty($addrArr['name']))
					$ordArr['ord_addr']['name'] = $addrArr['name'];
				if(!empty($addrArr['tel']) && preg_match('/\d{6,}/', $addrArr['tel']))
					$ordArr['ord_addr']['tel'] = $addrArr['tel'];
				if(!empty($addrArr['addr']) && strlen($addrArr['addr']) >= 10)
					$ordArr['ord_addr']['addr'] = $addrArr['addr'];
				$setArr['ord_addr'] = json_encode($ordArr['ord_addr']);
			}

			$this->PjlDb->Begin();
			if(!empty($priceArr))
			{
				$res = $this->get('pl_order_product', ['odp_id', 'odp_price', 'odp_count'], sprintf(" and odp_ord_id=%d", $ordId));
				$ordProArr = array_column($res['data'], null, 'odp_id');
				foreach($priceArr as $id=>$val)
				{
					if(empty($val['count']) && empty($val['price'])) continue;
					
					if(empty($ordProArr[$id]))
						return LibFc::ReturnData(false, 'setOrder提供的配件信息不存在！');
					if(isset($val['count']) && $val['count'] > 0)
						$ordProArr[$id]['odp_count'] = (int) $val['count'];
					if(isset($val['price']) && $val['price'] > 0)
						$ordProArr[$id]['odp_price'] = sprintf('%.2f', $val['price']);
					$ordProArr[$id]['odp_money'] = $ordProArr[$id]['odp_count']*$ordProArr[$id]['odp_price'];
					$tempSet = [
						'odp_count'=>$ordProArr[$id]['odp_count'],
						'odp_price'=>$ordProArr[$id]['odp_price'],
						'odp_money'=>$ordProArr[$id]['odp_money'],
						'odp_etime'=>time()
					];
					$this->set('pl_order_product', $tempSet, sprintf(" and odp_id=%d", $id));
				}

				$setArr['ord_pro_money'] = 0.00;
				foreach($ordProArr as $k=>$v)
				{
					$setArr['ord_pro_money'] += $v['odp_money'];
				}
			}
			if(!empty($freigh) && $freigh > 0)
				$setArr['ord_freight_money'] = sprintf('%.2f', $freigh);
			$setArr['ord_money'] = $setArr['ord_pro_money']+ $setArr['ord_freight_money'];
			$this->set('pl_order', $setArr, sprintf(' and ord_id=%d'), $ordId);
			
			//总额有变动，取消此订单的待支付码
			if($ordArr['ord_money'] != $setArr['ord_money'])
			{
				$this->closePay($ordId);
			}
			$this->PjlDb->End();
			return LibFc::ReturnData(true);
		}
		return LibFc::ReturnData(false, 'setOrder提供的参数有误！');
	}


	/**
	  * @method 订单付款完成
	  * @param  $ordId 订单ID
	  * @param  $orpId 支付ID
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=>, "code"=>""]
	  */
	public function payOrderOk($ordId, $orpId)
	{
		$ordId = (int) $ordId;
		$orpId = (int) $orpId;
		if($ordId > 0 && $orpId > 0)
		{
			$res = $this->get('pl_order_pay join pl_order on orp_ord_id=ord_id', ['ord_status', 'ord_money', 'orp_status', 'orp_money', 'orp_por_id'], sprintf(" and ord_id=%d and orp_id=%d", $ordId, $orpId), true);
			if(empty($res['data'])) return LibFc::ReturnData(false, 'payOrderOk提供的orpId有误！');
			$orpArr = $res['data'];
			//订单状态
			if($orpArr['ord_status'] == 'paied')
				return LibFc::ReturnData(true);
			if($orpArr['ord_status'] != 'creat')
				return LibFc::ReturnData(false, '订单状态异常，支付失败！');

			//支付状态
			if($orpArr['orp_status'] == 'close')
				return LibFc::ReturnData(false, '此支付交易orpId已关闭！');

			if($orpArr['ord_money'] != $orpArr['orp_money'])
				return LibFc::ReturnData(false, '付款金额与订单金额不一致！');

			//调取支付平台的支付信息
			$LibYpApi = new LibYpApi();
			$res = $LibYpApi->get('order/checkPay', [], ['por_id'=>$orpArr['orp_por_id']]);
			$payArr = $res['data'];
			if($payArr['por_status'] == 1 && $payArr['por_money'] == $orpArr['ord_money'])
			{
				if($payArr['por_money'] != $orpArr['ord_money'])
					return LibFc::ReturnData(false, '付款金额与订单金额不一致！');
			}
			else
			{
				return LibFc::ReturnData(false, '此交易尚未支付成功！');
			}

			$this->PjlDb->Begin();

			//支付明细状态
			$setArr = [
				'orp_status'=>'paied',
				'orp_pay_time'=>$payArr['por_pay_time']
			];
			$this->set('pl_order_pay', $setArr, sprintf(" and orp_id=%d", $orpId));
		
			//订单状态
			$setArr = [
				'ord_status'=>'paied',
				'ord_pay_time'=>$payArr['por_pay_time'],
				'ord_orp_id'=>$orpId
			];
			$this->set('pl_order', $setArr, sprintf(" and ord_id=%d", $ordId));

			$this->PjlDb->End();
			return LibFc::ReturnData(true);
		}
		return LibFc::ReturnData(false, 'payOrderOk提供的参数有误！');
	}


	/**
	  * @method 订单发货
	  * @param  $ordId 订单ID
	  * @param  $sendArr [name:快递公司 number:快递单号 code:快递代码]
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=>, "code"=>""]
	  */
	public function sendOrder($ordId, $sendArr)
	{
		$ordId = (int) $ordId;
		if($ordId > 0 && !empty($sendArr['name']) && !empty($sendArr['number']))
		{
			$res = $this->get('pl_order', ['ord_status'], sprintf(" and ord_id=%d", $ordId), true);
			if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在或者已被删除');
			$ordArr = $res['data'];
			if($orpArr['ord_status'] == 'send')
				return LibFc::ReturnData(true);
			if($orpArr['ord_status'] != 'paied')
				return LibFc::ReturnData(false, '订单状态异常，发货失败！');
			
			$setArr = [
				'ord_status'=>'send',
				'ord_send_info'=>json_encode($sendArr),
				'ord_send_time'=>time()
			];
			$this->set('pl_order', $setArr, sprintf(" and ord_id=%d", $ordId));
			return LibFc::ReturnData(true);
		}
		return LibFc::ReturnData(false, 'sendOrder提供的参数有误！');
	}


	/**
	  * @method 确认收货
	  * @param  $ordId 订单ID
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=>, "code"=>""]
	  */
	public function completedOrder($ordId)
	{
		$ordId = (int) $ordId;
		if($ordId > 0)
		{
			$res = $this->get('pl_order join pl_shop on shop_id=ord_shop_id', ['ord_id','shop_id', 'shop_pu_id', 'ord_money', 'ord_status', 'shop_commission'], sprintf(" and ord_id=%d", $ordId), true);
			if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在或者已被删除');
			$ordArr = $res['data'];
			if($ordArr['ord_status'] == 'completed')
				return LibFc::ReturnData(true);
			if($ordArr['ord_status'] != 'send')
				return LibFc::ReturnData(false, '订单状态异常，订单确认完成失败！');
			$this->PjlDb->Begin();

			$PjlUser = new PjlUser();
			$moneyLog = [
				'mon_pu_uid'=>$ordArr['shop_pu_id'],
				'mon_style'=>1,
				'mon_money'=>$ordArr['ord_money'],
				'mon_des'=>'订单ID:'.$ordArr['ord_id'].'确认收货'
			];
			$PjlUser->changeUserMoney($moneyLog);
			//是否要扣除佣金
			$yj = sprintf("%.2f", $ordArr['ord_money']*$ordArr['shop_commission']);
			if($yj > 0)
			{
				$moneyLog = [
					'mon_pu_uid'=>$ordArr['shop_pu_id'],
					'mon_style'=>3,
					'mon_money'=>$yj,
					'mon_des'=>'订单ID:'.$ordArr['ord_id'].'佣金扣除'
				];
				$PjlUser->changeUserMoney($moneyLog);
			}
			$this->set('pl_order', ['ord_status'=>'completed', 'ord_coplete_time'=>time()], sprintf(" and ord_id=%d", $ordId));
			//更改user 完成数
			$this->set('pl_user',['pu_complete_count'=>'#@pu_complete_count+1'], sprintf('and pu_uid =%d',$ordArr['shop_pu_id']));
			//更改shop 完成数
			$this->set('pl_shop',['shop_complete_count'=>'#@shop_complete_count+1'], sprintf('and shop_id =%d',$ordArr['shop_id']));
			$this->PjlDb->End();
			return LibFc::ReturnData(true);
		}
		return LibFc::ReturnData(false, 'completedOrder提供的参数有误！');
	}


	/**
	  * @method 关闭订单（待支付才允许）
	  * @param  $ordId 订单ID
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=>, "code"=>""]
	  */
	public function closeOrder($ordId)
	{
		$ordId = (int) $ordId;
		if($ordId > 0)
		{
			$res = $this->get('pl_order', ['ord_status', 'ord_money'], sprintf(" and ord_id=%d", $ordId), true);
			if(empty($res['data'])) return LibFc::ReturnData(false, '订单不存在或者已被删除');
			$ordArr = $res['data'];
			if($ordArr['ord_status'] == 'cancel')
				return LibFc::ReturnData(true);
			if($ordArr['ord_status'] != 'creat')
				return LibFc::ReturnData(false, '订单状态异常，订单关闭失败！');
			$this->set('pl_order', ['ord_status'=>'cancel', 'ord_close_time'=>time()], sprintf(" and ord_id=%d", $ordId));
			return LibFc::ReturnData(true);
		}
		return LibFc::ReturnData(false, 'closeOrder提供的参数有误！');
	}


	/**
	  * @method 关闭待支付码
	  * @param  $ordId 订单ID
	  * @param  $orpIdArr 具体的支付ID 为空则关闭所有待支付码
	  * @author soul
	  * @copyright 2018/7/23
	  * @return ["status"=> bool(true), "data"=>, "code"=>""]
	  */
	public function closePay($ordId, $orpIdArr = [])
	{
		$ordId = (int) $ordId;
		if($ordId > 0)
		{
			$where = sprintf(" and orp_ord_id=%d and orp_status='wait' and orp_por_id > 0", $ordId);
			$orpIdArr = array_filter($orpIdArr, 'LibFc::Int');
			if(!empty($orpIdArr))
				$where .= sprintf(" and orp_id in(%s)", implode(',', $orpIdArr));
			$res = $this->get('pl_order_pay', ['orp_por_id'], $where);
			if(!empty($res['data']))
			{
				$porIdArr = array_column($res['data'], 'orp_por_id');
				$LibYpApi = new LibYpApi();
				$res = $LibYpApi->get('order/closePay', [], ['por_id'=>$porIdArr]);
				
				$hasClose = [];
				foreach($res['data'] as $porId=>$status)
				{
					if($status == -1)
						$hasClose[] = $porId;
				}
				if(!empty($hasClose))
				{
					$setArr = [
						'orp_status'=>'close',
						'orp_close_time'=>time()
					];
					$this->set('pl_order_pay', $setArr, sprintf(" and orp_por_id in (%s)", implode(',', $hasClose)));
				}
			}
			return LibFc::ReturnData(true);
		}
		return LibFc::ReturnData(false, 'closePay提供的参数有误！');
	}

	/**
	 * @method    获取 去结算的订单详情 
	 * @param     [array]       $dataArr  ['userid', 'purid', 'offid', 'shopid']
	 * @param     [array]       $proArr  [['pup_id'=>xxx,'qualit'=>xxx]]
	 * @author    liao
	 * @copyright 2018-08-10
	 * @return    ["status"=> bool(true), "data"=>['pro'=[],'shop'=>['shop_id'=>xxx]]]
	 */
	public function getOrderInfo($dataArr,$proArr)
	{
		$must = ['userid', 'purid', 'offid', 'shopid'];
		foreach($must as $filed)
		{
			if(!isset($dataArr[$filed]) || empty($dataArr[$filed]) || $dataArr[$filed] < 1)
				return LibFc::ReturnData(false, 'getOrderInfo 的'.$filed.'参数不正确！');
			$dataArr[$filed] = (int) $dataArr[$filed];
		}
		//查看订单是否已完成
		$res = $this->get('pl_order',['count(*) count'],sprintf("and ord_po_id = %d and ord_status!='cancel'",$dataArr['offid']),true);
		if ($res['data']['count'] > 0)
			return LibFc::ReturnData(false, '订单已存在！');

		$returnData = [];
		//下单人、采购单、店铺、报价单是否一致
		$table = 'pl_purchase JOIN pl_purchase_offer ON pur_id=po_pur_id';
		$where = sprintf(" and pur_pu_id=%d and pur_id=%d and po_id=%d and po_shop_id=%d and pur_status>-1 and po_status>-1",
			$dataArr['userid'], $dataArr['purid'], $dataArr['offid'], $dataArr['shopid']);
		$purArr = $this->get($table, ['*'], $where, true);
		if(empty($purArr['data']))
			return LibFc::ReturnData(false, 'getOrderInfo 提供的采购单ID、报价单ID数据有误！');

		$purArr = $purArr['data'];
		//图片取第一张
		$purArr['img'] =  !empty($purArr['pur_imgs']) ? mvc::$cfg['FILE_CENTER']['pjl']['url_get'].'&c=purchase&f='.explode(',', $purArr['pur_imgs'])[0].mvc::$cfg['FILE_CENTER']['pjl']['get_uri'] : '';

		$arr = explode(' ', $purArr['pur_model']);
		$purArr['brand'] = $arr[0];
		unset($arr[0]);
		$purArr['model'] = implode(' ', $arr);
		$purArr['vin'] = !empty($purArr['data']['pur_vin']) ? $purArr['data']['pur_vin'] : '-';
		$returnData = array_merge($returnData,$purArr);
		//获取店铺信息
		$shopArr = $this->get('pl_shop',['shop_id','shop_name','shop_logo'],sprintf('and shop_id=%d',$dataArr['shopid']),true);
		$shopArr = $shopArr['data'];
		$returnData['shop'] = $shopArr;
		//获取订单配件信息
		$table = 'pl_purchase_product JOIN pl_purchase_offer_price ON pup_id=pop_pup_id';
		$res = $this->get($table, ['*'], sprintf(" and pup_pur_id=%d and pop_po_id=%d", $dataArr['purid'], $dataArr['offid']));
		$offProArr = array_column($res['data'], null, 'pup_id');
		foreach ($proArr as $key=>$pro) 
		{
			if(empty($offProArr[$pro['pup_id']]))
				return LibFc::ReturnData(false, 'getOrderInfo 提供的 pup_id 数据有误！');
			$tArr = $offProArr[$pro['pup_id']];
			
			//根据品质确认价格
			$price = 0.00;
			$tArr['pop_price'] = json_decode($tArr['pop_price'], true);
			foreach($tArr['pop_price'] as $qprice)
			{
				if($qprice['quality'] == $pro['qualit'])
				{
					$price = sprintf("%.2f", $qprice['price']);
				}
			}
			//此品质的报价不存在
			if($price <= 0)
				return LibFc::ReturnData(false, 'addOrder提供的odp_quality数据有误！');

			$proArr[$key]['count'] = $tArr['pup_count'];
			$proArr[$key]['price'] = $price;
			$proArr[$key]['number'] = $tArr['pup_number'];
			$proArr[$key]['name'] = $tArr['pup_name'];
			$proArr[$key]['number'] = $tArr['pup_number'];
			$returnData['count_money'] += $price*$tArr['pup_count'];
		}
		$returnData['pro'] = $proArr;
		//获取用户信息
		$userArr = $this->get('pl_user_addr',['ua_id','ua_name','ua_tel','ua_pct_ids','ua_addr'],sprintf('and ua_pu_uid = %d order by ua_default desc,ua_id asc limit 1',$dataArr['userid']),true);

		$arr = [
			'name' => $userArr['data']['ua_name'],
			'tel' => $userArr['data']['ua_tel'],
		];
		if(!empty($userArr))
		{
			$PjlUser = new PjlUser();
			$res = $PjlUser->getAddrByIds($userArr['data']['ua_pct_ids']);
			$arr['addr'] = implode('',$res['data']).$userArr['data']['ua_addr'];
		}
		$returnData['user'] = $arr;
		return LibFc::ReturnData(true, $returnData);
	}

	/**
	 * @method    根据订单id 获取订单信息
	 * @param     [int]       $uid    '用户id'
	 * @param     [int]       $ordid  '订单id'
	 * @param     [str]       $where  '限制条件'
	 * @param     [int]       $nowPage  '当前页'
	 * @param     [int]       $perPage  '每页条数'
	 * @author    liao
	 * @copyright 2018-08-10
	 * @return    ["status"=> bool(true), "data"=>['pro'=[],'shop'=>['shop_id'=>xxx]]]
	 */
	public function getOrderInfoList($ordid='',$where='',$nowPage=1,$perPage=5,$order='')
	{
		if (!empty($where))
		{
			$ordid = (int) $ordid;
			$nowPage = (int) $nowPage;
			$perPage = (int) $perPage;
			$nowPage = $nowPage > 0 ? $nowPage : 1;
			$perPage = $perPage > 0 ? $perPage : 5;
			if ($ordid > 0)
			{
				$where = sprintf('%s and ord_id = %d %s',$basewhere,$ordid,$where);
			}
			else
			{
				$where = sprintf('%s %s limit %s,%s',$basewhere,$where,($nowPage-1)*$perPage,$perPage);
			}

			$res = $this->get('pl_order a left join pl_purchase b on ord_pur_id = pur_id',['a.*','b.pur_vin','b.pur_imgs'],$where);
			if (!empty($res['data']))
			{
				$LibYpApi = new LibYpApi();
				if ($ordid > 0 && $res['data'][0]['ord_status'] == 'creat')
				{
					//获取数据之前检测一下订单状态
					$checkPay = $this->get('pl_order_pay', ['orp_id, orp_por_guid'], sprintf(" and orp_ord_id =%d and orp_style=0 and orp_status != 'close' and orp_por_guid != ''", $ordid));
					foreach($checkPay['data'] as $v)
					{
						$checkData = $LibYpApi->get('order/checkPay', [], ['por_guid'=>$v['orp_por_guid']]);
						$payArr = $checkData['data'];
						if($payArr['por_status'] == 1)
						{
							//变更状态
							$this->payOrderOk($ordid, $v['orp_id']);
							$res['data'][0]['ord_status'] = 'paied';
						}
					}
				}

				//店铺id
				//获取订单id
				$ordidArr = array_column($res['data'], 'ord_id');

				if ($order == 'shop')
				{
					$useridArr = array_unique(array_column($res['data'], 'ord_pu_uid'));
					$post = [
						'filed'=>['u_id','u_name', 'u_nickname', 'u_logo'],
						'where'=>sprintf(" and u_id in (%s)", implode(',', $useridArr)),
						'oneRow'=>false
					];
					$infoArr = $LibYpApi->Get('user/getUser',[], $post);
					$infoArr = array_column($infoArr['data'], null,'u_id');
				}else
				{
					$shopidArr = array_unique(array_column($res['data'], 'ord_shop_id'));
					//获取店铺信息
					$infoArr = $this->get('pl_shop',['shop_id','shop_name','shop_logo'],sprintf('and shop_id in (%s)',implode(',', $shopidArr)));
					foreach ($infoArr['data'] as $key => $value) 
					{
						$infoArr['data'][$key]['shop_logo'] = mvc::$cfg['FILE_CENTER']['pjl']['url_get'].'&c=shop&f='.$value['shop_logo'].mvc::$cfg['FILE_CENTER']['pjl']['get_uri'];
					}
					$infoArr = array_column($infoArr['data'], null,'shop_id');
				}

				//获取订单配件信息
				$proArr = $this->get('pl_order_product',['*'],sprintf("and odp_ord_id in (%s)", implode(',', $ordidArr)));
				$ordPro = [];
				foreach ($proArr['data'] as$value) 
				{
					$ordPro[$value['odp_ord_id']][] = [
						'price' => $value['odp_price'],
						'count' => $value['odp_count'],
						'name' => $value['odp_pup_name'],
						'number' => $value['odp_pup_number']
					];
				}

				//获取订单售后信息
				$refundArr = $this->get('pl_refund_pact',['rep_ord_id','rep_status','rep_id'],sprintf("and rep_ord_id in (%s)", implode(',', $ordidArr)));
				$refundid = array_column($refundArr['data'], 'rep_id', 'rep_ord_id');
				$refundArr = array_column($refundArr['data'], 'rep_status', 'rep_ord_id');
				// print_r($res);
				//整合数据
				foreach ($res['data'] as $key => $value) 
				{
					$arr = json_decode($value['ord_model_info'],true);
					$arr = explode(' ', $arr['model']);
					$brand = $arr[0];
					unset($arr[0]);

					if ($order=='shop'){
						$res['data'][$key]['user'] = $infoArr[$value['ord_pu_uid']];
					}
					else{
						$res['data'][$key]['shop'] = $infoArr[$value['ord_shop_id']];
					}
					$res['data'][$key]['format_add_time']=!empty($value['ord_atime'])?date('Y-m-d H:i:s',$value['ord_atime']):'';
					$res['data'][$key]['format_pay_time']=!empty($value['ord_pay_time'])?date('Y-m-d H:i:s',$value['ord_pay_time']):'';
					$res['data'][$key]['format_send_time']=!empty($value['ord_send_time'])?date('Y-m-d H:i:s',$value['ord_send_time']):'';
					$res['data'][$key]['format_coplete_time']=!empty($value['ord_coplete_time'])?date('Y-m-d H:i:s',$value['ord_coplete_time']):'';
					$res['data'][$key]['format_close_time']=!empty($value['ord_close_time'])?date('Y-m-d H:i:s',$value['ord_close_time']):'';
					$res['data'][$key]['format_eva_time']=!empty($value['ord_eva_time'])?date('Y-m-d H:i:s',$value['ord_eva_time']):'';

					$img = current(array_filter(explode(',', $value['pur_imgs'])));
					$res['data'][$key]['pro'] = $ordPro[$value['ord_id']];
					$res['data'][$key]['time'] = LibFc::formatTime($value['ord_atime']);
					$res['data'][$key]['lessTime'] = $value['ord_atime'] + 24*60*60 -time();
					$res['data'][$key]['vin'] = !empty($value['pur_vin']) ? $value['pur_vin'] : '-';
					$res['data'][$key]['img'] = !empty($img) ? mvc::$cfg['FILE_CENTER']['pjl']['url_get'].'&c=purchase&f='.$img.mvc::$cfg['FILE_CENTER']['pjl']['get_uri'] : '';
					$res['data'][$key]['brand'] = $brand;
					$res['data'][$key]['model'] = implode(' ', $arr);
					$res['data'][$key]['status'] = $value['ord_status'];
					// if ($res['data'][$key]['lessTime'] < 0 && $res['data'][$key]['ord_status'] =='creat')
					// 	$res['data'][$key]['status'] = 'outtime';
					$res['data'][$key]['count_money'] = $value['ord_money'];
					if(!empty($refundArr[$value['ord_id']]))
					{
						$res['data'][$key]['refund'] = $refundArr[$value['ord_id']];
						$res['data'][$key]['refundid'] = $refundid[$value['ord_id']];
						if($refundArr[$value['ord_id']]!='close' && $refundArr[$value['ord_id']]!='refunded')
						{
							$res['data'][$key]['status'] = 'refund';
						}
					}else
					{
						$res['data'][$key]['refund'] = '';
					}

					if (!empty($value['ord_send_time']))
						$res['data'][$key]['send_time'] = LibFc::formatTime($value['ord_send_time']);
					
				}

				if ($ordid > 0)
				{
					$res['data'] = $res['data'][0];
				}
			}
			return LibFc::ReturnData(true, $res['data']);
		}
		return LibFc::ReturnData(false, 'getOrderInfoList 提供的参数有误！');
	}
	/**
	  * @method 退款原因
	  * @param  $type all 1仅退款  2退货退款   3换货   4卖家拒绝退款申请理由
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> [0=>['', ''], ....] ["code"]=> int(0) ]
	  */
	public function getRefundReason($type = 'all')
	{
		$arr = [
			1=>['不喜欢/不想要', '空包裹', '快递物流一直未送到', '快递/物流无跟踪记录', '货物破损已拒签'],	
			2=>['外观/型号/参数等与商品描述不符', '功能/效果不符', '性能故障', '少件/漏发', '包装/商品破损', '其他'],	
			3=>['质量问题', '尺寸/规格不符', '卖家发错货', '假冒品牌', '收到商品少件/破损/污渍等', '其他'],
			4=>['商品已经影响二次销售', '申请时间已超售后服务时限', '请承担发货运费，商品发出时完好']
		];
		$data = $type == 'all'? $arr: $arr[$type];
		return LibFc::ReturnData(true, $data);
	}
	/**
	  * @method 订单配件ID可退款金额
	  * @param  $ordId 订单ID
	  * @param  $repId 退款ID  优先
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> ['maxMoney'=>最高可退, 'proMoney'=>配件可退, 'freightMoney'=>运费可退] ["code"]=> int(0) ]
	  */
	public function getRefundMoney($ordId = 0, $repId = 0)
	{
		$ordId = (int) $ordId;
		$repId = (int) $repId;
		$moneyArr = ['maxMoney'=>0.00, 'proMoney'=>0.00, 'freightMoney'=>0.00];

		if($repId > 0)
		{
			$res = $this->get('pl_refund_pact', ['rep_id'], sprintf(" and rep_id=%d", $repId), true);
			if(empty($res['data']))
				return LibFc::ReturnData(false, '退款记录不存在');
		}
		$res = $this->get('pl_order', ['ord_id', 'ord_freight_money','ord_status','ord_pro_money','ord_coplete_time'], sprintf(" and ord_id=%d", $ordId), true);
		if(empty($res['data']))
			return LibFc::ReturnData(false, '订单不存在');
		$orderArr = $res['data'];

		//只有已支付、已发货、已完成的配件才可以申请退款
		if(!in_array($orderArr['ord_status'], ['paied', 'send', 'completed', 'refund']))
		{
			return LibFc::ReturnData(false, '此状态不允许申请退款');
		}

		if(empty($repId))
		{
			if($orderArr['ord_status'] == 'completed'&&!empty($orderArr['ord_coplete_time']) && time() > ($orderArr['ord_coplete_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('pl_refund_pact', ['sum(rep_freight_money) rep_freight_money'], sprintf(" and rep_id!=%d and rep_status !='close' and rep_ord_id=%d", $repId, $ordId), true);
			// print_r($res);
			// die;
			$moneyArr['freightMoney'] -= $res['data']['rep_freight_money'];
		}
		// print_r($orderArr);
		//此订单配件已退金额(已退或者退款中)，不含运费
		$moneyArr['proMoney'] = $orderArr['ord_pro_money'];
		$res = $this->get('pl_refund_pact',  ['sum(rep_money-rep_freight_money) rep_pro_money'], sprintf(" and rep_status ='refunded' and rep_ord_id=%d", $ordId), 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'=>1仅退款  2退货退款   3换货,
							'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_pu_uid'] = (int) $dataArr['rep_pu_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($repType[$dataArr['rep_type']]))
			return LibFc::ReturnData(false, '退款类型参数rep_type有误');
		if(!isset($dataArr['rep_money']) || !isset($dataArr['rep_reason']) || $dataArr['rep_pu_uid'] < 1)
			return LibFc::ReturnData(false, '退款申请参数有误');

		$dataArr['rep_money'] = sprintf('%.2f', $dataArr['rep_money']);

		$res = $this->get('pl_order', ['ord_id','ord_status','ord_shop_id','ord_pur_id','ord_coplete_time'], sprintf(" and ord_id=%d and ord_pu_uid=%d", $dataArr['rep_ord_id'], $dataArr['rep_pu_uid']), true);
		if(empty($res['data']))
			return LibFc::ReturnData(false, '订单记录不存在');
		$ordArr = $res['data'];

		$res = $this->get('pl_refund_pact', ['rep_id'], sprintf(" and rep_status not in ('close', 'refunded') and rep_ord_id=%d", $dataArr['rep_ord_id']), true);
		if(!empty($res['data']))
			return LibFc::ReturnData(false, '此订单已申请售后，且尚未处理完毕，请勿重复申请');

		//获取可退款金额
		$res = $this->getRefundMoney($dataArr['rep_ord_id']);
		$moneyArr = $res['data'];
	
		if($dataArr['rep_money'] > $moneyArr['maxMoney'])
			return LibFc::ReturnData(false, '您最多可以申请退款'.$moneyArr['maxMoney'].'元');
		
		$this->PjlDb->Begin();
		$dataArr['rep_status'] = 'wait';
		$dataArr['rep_apply_time'] = time();
		$dataArr['rep_atime'] = time();
		$dataArr['rep_pjl_guid'] = LibFc::guid();
		$dataArr['rep_pre_guid'] = $dataArr['rep_pjl_guid'];
		$dataArr['rep_ord_id'] = $ordArr['ord_id'];
		$dataArr['rep_shop_id'] = $ordArr['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;
		$res=$this->add('pl_refund_pact', $dataArr);
		$repId=$res['data'];

		$res = $this->getEnum('rep_pro_status');
		$rep_status = $res['data'];

		if($dataArr['rep_instructions']!="")
		{
			//退款日志
			$logArr = [
				'rel_rep_id'=>$repId,
				'rel_txt'=>'发起了'.$repType[$dataArr['rep_type']].'申请，货物状态：'.$rep_status[$dataArr['rep_pro_status']].'，原因：'.$dataArr['rep_reason'].'，金额：'.$dataArr['rep_money'].'元，说明：'.$dataArr['rep_instructions'].'。',
				'rel_utype'=>1
			];
		}
		else
		{
			//退款日志
			$logArr = [
				'rel_rep_id'=>$repId,
				'rel_txt'=>'发起了'.$repType[$dataArr['rep_type']].'申请，货物状态：'.$rep_status[$dataArr['rep_pro_status']].'，原因：'.$dataArr['rep_reason'].'，金额：'.$dataArr['rep_money'].'元。',
				'rel_utype'=>1
			];
		}
		$this->addRefundLog($logArr,$dataArr['rep_pu_uid']);

		$this->PjlDb->End();
		return LibFc::ReturnData(true, $repId);
	}
	/**
	  * @method 枚举列表
	  * @param  $filedName 字段名 
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function getEnum($filedName)
	{
		$arr = [
			'rep_type'=>[
				1=>'仅退款',
				2=>'退货退款',
				3=>'换货'
			],
			'rep_pro_status'=>[
				0=>'未收到',
				1=>'已收到'
			],
		];
		return LibFc::ReturnData(true, $arr[$filedName]);
	}
	/**
	  * @method 添加退款日志
	  * @param  $dataArr
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function addRefundLog($dataArr,$uid=0)
	{
		if(empty($dataArr['rel_rep_id']) || empty($dataArr['rel_txt']))
			return LibFc::ReturnData(false, 'addRefundLog参数有误');
		if(!empty($uid))
		{
			$LibYpApi = new LibYpApi();
			$post = [
				'filed'=>['u_name', 'u_nickname', 'u_real_name'],
				'where'=>sprintf(" and u_id=%d", $uid),
				'oneRow'=>true
			];
			$res = $LibYpApi->Get('user/getUser',[], $post);
			$uName=(!empty($res['data']['u_nickname'])?$res['data']['u_nickname']:$res['data']['u_real_name']);
		}
		$this->PjlDb->Begin();
		$dataArr['rel_rep_id'] = (int) $dataArr['rel_rep_id'];
		$dataArr['rel_by_uid'] = $uid;
		$dataArr['rel_by_uname'] = (!empty($uName)?$uName:'系统');
		$dataArr['rel_atime'] = time();
		$this->add('pl_refund_log', $dataArr);
		$this->PjlDb->End();
		return LibFc::ReturnData(true);
	}
	/**
	  * @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']);
		if($dataArr['rep_instructions']&&strlen($dataArr['rep_instructions'])>200)
		{
			$dataArr['rep_instructions'] = mb_substr($dataArr['rep_instructions'], 0,200);
		}

		$repId = (int) $repId;
		$dataArr['rep_pu_uid'] = (int) $dataArr['rep_pu_uid'];
		$res = $this->get('pl_refund_pact', ['*'], sprintf(" and rep_status in ('wait','refuse') and rep_id=%d and rep_pu_uid=%d", $repId, $dataArr['rep_pu_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_ord_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->PjlDb->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';
		// print_r($dataArr);
		$this->set('pl_refund_pact', $dataArr, sprintf(" and rep_id=%d", $repArr['rep_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,$dataArr['rep_pu_uid']);

		$this->PjlDb->End();
		return LibFc::ReturnData(true, $repId);
	}
	/**
	  * @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('pl_refund_pact', ['rep_id', 'rep_status', 'rep_ord_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->PjlDb->Begin();
		$this->set('pl_refund_pact', ['rep_status'=>'close','rep_etime'=>time(),'rep_close_time'=>time()], sprintf(" and rep_id=%d", $repArr['rep_id']));
		$this->PjlDb->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 refundCompleted($repId)
	{
		$repId = (int) $repId;
		$res = $this->get('pl_refund_pact left join pl_order on ord_id=rep_ord_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->PjlDb->Begin();

		
		//需要退钱
		if($repArr['rep_money'] > 0)
		{
			$LibYpApi = new LibYpApi();
			
			// print_r($res);die;
			$res = $this->getRefundMoney($repArr['rep_ord_id'], $repId);
			$moneyArr = $res['data'];

			if($repArr['rep_money'] > $moneyArr['maxMoney'])
				return LibFc::ReturnData(false, '最多可以退款'.$moneyArr['maxMoney'].'元');
			if($repArr['ord_status'] == 'completed')
			{
				//已经确认收货,减少店铺余额
				//查找店铺店主ID余额
				$res=$this->get('pl_shop join pl_user on pu_uid=shop_pu_id',['pu_money','pu_uid'],sprintf(' and shop_id=%d',$repArr['rep_shop_id']),true);
				if(empty($res['data']))
				{
					return LibFc::ReturnData(false, '用户不存在');
				}
				$shopMoney=$res['data'];
				//余额判断
				if($shopMoney['pu_money']<$repArr['rep_money'])
				{
					return LibFc::ReturnData(false, '店铺余额不足,退款失败');
				}
				//减余额
				// $this->set('pl_user',['pu_money'=>($shopMoney['pu_money']-$repArr['rep_money'])],sprintf(' and pu_uid=%d',$shopMoney['pu_uid']));

			}
			//接口退款，原路返回
			//查找原订单支付流水ID
			$res = $this->get('pl_order_pay', ['orp_por_id'], sprintf(" and orp_ord_id=%d and orp_status = 'paied'", $repArr['rep_ord_id']), true);
			$payData = $res['data'];
			if(empty($repArr['rep_pre_guid'])) 
					return LibFc::ReturnData(false, 'rep_pre_guid为空，退款失败');


			$apiDataArr = [
				'pre_por_id'=>$payData['orp_por_id'],
				'pre_guid'=>$repArr['rep_pre_guid'],
				'pre_refund_money'=>$repArr['rep_money'],
				'pre_des'=>'订单ID：'.$repArr['rep_ord_id'].'确认退款，退款ID：'.$repArr['rep_id'],
			];
			// $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_end'=>1
				];
				//余额更新
				if($repArr['ord_status'] == 'completed'&&$repArr['rep_money']>0)
				{
					$PjlUser=new PjlUser();
					$upMoneyArr=[
						'mon_pu_uid'=>$shopMoney['pu_uid'],
						'mon_money'=>(-$repArr['rep_money']),
						'mon_style'=>1,
						'mon_des'=>$apiDataArr['pre_des'],
						'mon_opl_id'=>$setArr['rep_pre_id']
					];
					$PjlUser->changeUserMoney($upMoneyArr);
				}
				
			}else{
				return LibFc::ReturnData(false, '退款异常，请稍后重试。');
			}
			//待处理
		}
		else
		{
			$setArr = ['rep_status'=>'refunded', 'rep_end'=>1];                                                                                                                                   
		}
		
		if($refundOk || $repArr['rep_money'] <= 0)
		{
			$setArr['rep_refunded_time'] = time();
			$this->set('pl_refund_pact', $setArr, sprintf(" and rep_id=%d", $repArr['rep_id']));
			$this->set('pl_order', ['ord_status'=>'cancel'], sprintf(" and ord_id=%d", $repArr['rep_ord_id']));

			$this->PjlDb->End();
			return LibFc::ReturnData(true);
		}
		else
		{
			return LibFc::ReturnData(false, '退款异常，请稍后重试。');
		}
	}
	/**
	  * @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('pl_refund_pact 
		join pl_order on ord_id=rep_ord_id',['*'],sprintf(" and rep_id=%d", $repId),true);
		$repArr = $res['data'];
		// print_r($repArr);
		if(empty($repArr)) return LibFc::ReturnData(true);
		$nowTime = time();
		$this->PjlDb->Begin();
	
		switch($repArr['rep_status'])
		{
			//等待卖家确认协议
			case 'wait':
				$lastTime = $repArr['ord_status'] == 'paied' ? $repArr['rep_apply_time']+mvc::$cfg['ORDER']['notSendRefundConfirm']*3600*24 : $lastTime = $repArr['rep_apply_time']+mvc::$cfg['ORDER']['sendRefundConfirm']*3600*24;
				// print_r()
				//系统自动确认协议
				if($lastTime > 0 && $nowTime >= $lastTime)
				{	
					//申请的仅退款=》自动完成退款
					if($repArr['rep_type'] == 1)
					{
						$this->refundCompleted($repId);
						$logArr = [
							'rel_rep_id'=>$repId,
							'rel_txt'=>'由于商家超时未响应，系统自动确认退款。',
							'rel_utype'=>2
						];
						$this->addRefundLog($logArr);
					}
					else
					{
						$this->set('pl_refund_pact', ['rep_status'=>'confirm', 'rep_confirm_time'=>$nowTime, 'rep_etime'=>$nowTime], sprintf(" and rep_id=%d", $repId));
						//退款日志
						$logArr = [
							'rel_rep_id'=>$repId,
							'rel_txt'=>'由于商家超时未响应，默认达成了本次售后服务申请。',
							'rel_utype'=>2
						];
						$this->addRefundLog($logArr);
					}
				}
			break;
			//卖家同意退款，等待买家退换货
			case 'confirm':
				if($repArr['rep_type'] == 2)
				{
					//退货退款 同意退款协议后，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'] == 3)
				{
					//卖家同意换货后，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;	
						}
					}*/
					
					/**待提供接口[2018.8.31]
					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->PjlDb->End();
		return LibFc::ReturnData(true);
	}
	/**
	  * @method 返回倒计时长
	  * @param  $repArr
	  * @author lu
	  * @copyright 2017/11/07
	  * @return [["status"]=> bool(true) ["data"]=> ['time'=>123213] ["code"]=> int(0) ]
	  */
	public function getRemaintime($repArr)
	{
		$remainTime = 0;
		// 买家申请仅退款
		if($repArr['rep_type']==1)
		{
			// 卖家期限内同意否则自动退还金额
			if($repArr['rep_status']=='wait')
			{
				// 未发货(与申请时间对比)
				if($repArr['ord_status']=='paied')
				{
					$remainTime =mvc::$cfg['ORDER']['notSendRefundConfirm']*24*60*60 + $repArr['rep_apply_time'] - time();
				}
				// 已发货(与申请时间对比)
				if($repArr['ord_status']=='completed' || $repArr['ord_status']=='completed' || $repArr['ord_status']=='send')
				{
					$remainTime =mvc::$cfg['ORDER']['sendRefundConfirm']*24*60*60 + $repArr['rep_apply_time'] - time();
				}
			}
			// print_r(mvc::$cfg['ORDER']);
			// 卖家拒绝买家需要期限内同意否则订单自动关闭(与拒绝时间对比)
			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']['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']==3)
		{	
			// 等待卖家同意（与申请时间对比）
			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     [str]       $where    []
	 * @param     array        $fieldArr [取的字段]
	 * @param     string       $join     [连表]
	 * @return    [type]                 [description]
	 * @author 卢
	 * @copyright 2018-09-12
	 */
	function getShopOrder($where,$fieldArr=[],$join='')
	{
		if(!empty($where))
		{
			$data=[];
			$fieldArr=array_merge($fieldArr,['pl_order.*','pur_vin']);
			$table=sprintf('pl_order left join pl_purchase on pur_id=ord_pur_id %s',$join);
			$res=$this->get($table,$fieldArr,$where);
			$orderArr=$res['data'];
			if(!empty($orderArr))
			{
				$data=array_merge($data,$orderArr);
				$ordIdArr=array_column($orderArr, 'ord_id');
				$res=$this->get('pl_order_product',['*'],sprintf(' and odp_ord_id in(%s)',implode(',',$ordIdArr)));
				if(!empty($res['data']))
				{
					foreach ($res['data'] as $v) 
					{
						$proArr[$v['odp_ord_id']][]=$v;
					}
				}
				foreach ($data as $k => $v) 
				{
					//时间格式化
					$data[$k]['format_ord_atime']=date('Y-m-d H:i',$v['ord_atime']);
					$data[$k]['format_ord_pay_time']=!empty($v['ord_pay_time'])?date('Y-m-d H:i',$v['ord_pay_time']):'';
					$data[$k]['format_ord_send_time']=!empty($v['ord_send_time'])?date('Y-m-d H:i',$v['ord_send_time']):'';
					$data[$k]['format_ord_coplete_time']=!empty($v['ord_coplete_time'])?date('Y-m-d H:i',$v['ord_coplete_time']):'';
					$data[$k]['format_ord_eva_time']=!empty($v['ord_eva_time'])?date('Y-m-d H:i',$v['ord_eva_time']):'';
					//图片处理
					if(!empty($v['ord_pur_imgs']))
					{
						$imgArr=explode(',', $v['ord_pur_imgs']);
						foreach ($imgArr as $img) 
						{
							if(!empty($img))
							{
								$data[$k]['imgArr'][]=mvc::$cfg['FILE_CENTER']['pjl']['url_get'].'&c=purchase&f='.$img.mvc::$cfg['FILE_CENTER']['b2c']['get_uri'];
							}
						}
					}
					//订单产品处理
					if(!empty($proArr[$v['ord_id']]))
					{
						$data[$k]['pro']=$proArr[$v['ord_id']];
					}
				}
			}
			return LibFc::ReturnData(true, $data);
		}
		return LibFc::ReturnData(false, 'getShopOrder 参数错误');
	}
	/**
	 * @method    getLogisDetail 获取物流详情
	 * @param     [str]          $where [限制条件]
	 * @param     [str]         $order  [order: 来自订单 | refund :来自售后]
	 * @author    liao
	 * @copyright 2018-09-13
	 * @return
	 */
	public function getLogisDetail($where,$order)
	{
		if(in_array($order, ['order','refund']) && !empty($where))
		{
			switch ($order) 
			{
				case 'order':
					$table = 'pl_order';
					$filed = 'ord_send_info';
					break;
				case 'refund':
					$table = 'pl_refund_pact';
					$filed = 'rep_express_des';
					break;
			}
			$res = $this->get($table,[$filed.' expJson'], $where,true);
			if (!empty($res['data']['expJson']))
			{
				$arr = json_decode($res['data']['expJson'],true);
				if(!empty($arr))
				{
					$postArr = [];
					switch ($order) 
					{
						case 'order':
							$postArr['name'] = $arr['name'];
							$postArr['number'] = $arr['number'];
							$postArr['code'] = $arr['code'];
							break;
						case 'refund':
							$postArr['name'] = $arr['company'];
							$postArr['number'] = $arr['number'];
							$postArr['code'] = $arr['expcode'];
							break;
					}
					$dataArr = [
						'ext_exp_code' => $postArr['code'],
						'ext_number' => $postArr['number'],
						'ext_from' => mvc::$cfg['FROM']
					];
					$MainExpress = new MainExpress();
					$res = $MainExpress->getTrack($dataArr);

					if (!empty($res['data']['ext_track']))
					{
						$arr = json_decode($res['data']['ext_track'],true);
						$data = [];
						foreach ($arr as $key => $value) 
						{
							if (date('Y',time()) == date('Y',$value['time']))
								$time = date('m-d',$value['time']);
							else
								$time = date('Y-m-d',$value['time']);
							$value['time'] = date('H:i',$value['time']);
							$data[$time][] = $value;
						}
						$res['data']['ext_track'] = $data;
					}
					return LibFc::ReturnData(true, $res['data']);
				}
			}
			return LibFc::ReturnData(true, []);
		}
		return LibFc::ReturnData(false, 'getLogisDetail 参数错误');
	}
	/**
	 * @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))
		{
			//获取数据
			$res = $this->get('pl_order',['ord_id','ord_pur_id','ord_po_id','ord_status','ord_pu_uid','ord_shop_id','ord_money','ord_atime','ord_remark'],sprintf('%s order by %s limit %s,%s', $where , $order, ($nowPage-1)*$perPage, $perPage));
			if (!empty($res['data']))
			{
				$shopIdArr = array_unique(array_column($res['data'], 'ord_shop_id'));
				$uidArr = array_unique(array_merge(array_column($res['data'], 'ord_pu_uid'), $shopIdArr));
				$orderIdArr = array_column($res['data'], 'ord_id');

				// 店铺信息
				$shopInfo = $this->get('pl_shop',['shop_id','shop_name','shop_pu_id','shop_name','shop_tel'],sprintf(' and shop_id in (%s)',implode(',',$shopIdArr)));
				$shopInfo = array_column($shopInfo['data'], null,'shop_id');

				//用户信息
				$YpwUser = new YpwUser();
				$userInfo = $YpwUser->GetUser(['u_id','u_name','u_real_name','u_mobile'],sprintf(" and u_id in (%s) ", implode(',', $uidArr)));
				if (!empty($userInfo['data']))
					$userInfo = array_column($userInfo['data'], null, 'u_id');
				else
					$userInfo = [];

				// 合并店铺信息 包括店铺用户
				foreach ($shopInfo as $key => $value) 
				{
					$shopInfo[$key]['shopUserName'] = $userInfo[$value['shop_pu_id']]['u_name'];
					$shopInfo[$key]['shopUserRealName'] = $userInfo[$value['shop_pu_id']]['u_real_name'];
					$shopInfo[$key]['shop_main_tel'] = $userInfo[$value['shop_pu_id']]['u_mobile'];
				}

				//订单配件信息
				$orderProArr = $this->get('pl_order_product',['odp_id','odp_ord_id','odp_pup_name','odp_price','odp_count'], sprintf('and odp_ord_id in (%s)', implode(',', $orderIdArr)));
				$orderProductArr = [];
				foreach ($orderProArr['data'] as $key => $value) 
				{
					$orderProductArr[$value['odp_ord_id']][] = $value;
				}

				//查看是否在售后中
				$refundInfo = $this->get('pl_refund_pact',['rep_id','rep_ord_id','rep_status'], sprintf("and rep_ord_id in (%s) and rep_status is not null and rep_status !='close' and rep_status !='refunded'", implode(',', $orderIdArr)));
				$refundId = array_column($refundInfo['data'], 'rep_id', 'rep_ord_id');
				$refundStatus = array_column($refundInfo['data'], 'rep_status', 'rep_ord_id');
				foreach ($res['data'] as $key => $value) 
				{
					$value['proArr'] = $orderProductArr[$value['ord_id']];
					if (!empty($userInfo[$value['ord_pu_uid']]))
						$value = array_merge($value, $userInfo[$value['ord_pu_uid']]);

					$res['data'][$key] = array_merge($value, $shopInfo[$value['ord_shop_id']] ? $shopInfo[$value['ord_shop_id']] : []);

					if (!empty($refundId[$value['ord_id']]))
						$res['data'][$key]['ord_status'] = 'refund';
					if (!empty($refundStatus[$value['ord_id']]))
						$res['data'][$key]['refund_status'] = $refundStatus[$value['ord_id']];
				}
			}
			return $res;
		}
		return LibFc::ReturnData(false,'getOrderList参数错误',"");
	}

	/**
	 * @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))
		{
			$PjlLog = new PjlLog();
			$orderArr=is_array($orderId) ? $orderId : [(int)$orderId];
			//订单未付款才可以取消
			$res = $this->get('pl_order',['ord_id','ord_shop_id','ord_status'],sprintf("and ord_id in (%s) and ord_status='creat'",implode(',',$orderArr)));
			if (!empty($res['data']))
			{
				$this->PjlDb->Begin();
				foreach ($res['data'] as $v) 
				{
					$logArr['log_pu_uid'] = mvc::$cfg['LOGUSER']['uid'];
					$logArr['log_username'] = mvc::$cfg['LOGUSER']['urname'];
					$logArr['log_shop_id'] = $v['ord_shop_id'];
					$logArr['log_ip'] = mvc::$cfg['LOGUSER']['ip'];
					$logArr['log_txt'] = '后台管理员'.mvc::$cfg['LOGUSER']['urname'].'取消订单ID：'.$v['ord_id'];
					//添加日志
					$PjlLog->addLog($logArr);
					//改变状态
					$this->set('pl_order',['ord_status'=>'cancel'],sprintf(' and ord_id = %d',$v['ord_id']));
				}
				$this->PjlDb->End();
			}
			return LibFc::ReturnData(true,true);
		}
		return LibFc::ReturnData(false,'adminCancelOrder参数错误',"");
	}
	/**
	 * @method    物流状态
	 * @author     廖
	 * @copyright 2017-08-30
	 * @return array('0'=>xxx,'1'=>xxx,...)
	 */
	public function expressStatus()
	{
		$status=array(
			'0'=>'无数据',
			'1'=>'揽件中',
			'2'=>'在途中',
			'3'=>'派件中',
			'4'=>'已签收', 
			'5'=>'已退签',
			'6'=>'退回件',
			'7'=>'疑难件'
			);
		return $status;
	}
	/**
	  * @method 将当前订单状态发送给店铺负责人
	  * @param  $ordIds [int|arr] 订单ID
	  * @author xu
	  * @copyright 2018/09/13
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function sendOrdStatBySms($ordIds,$to)
	{
		if (!in_array($to, ['shop','user']))
			return LibFc::ReturnData(false,'发送对象不正确,必须指定商家或者买家');

		if(!is_array($ordIds)) $ordIds = [(int) $ordIds];
		if(empty($ordIds = array_filter($ordIds,'LibFc::Int')))
		{
			return LibFc::ReturnData(false,'订单ID 为空');
		}

		switch ($to) {
			case 'shop':
				$table = 'pl_order left join pl_shop on ord_shop_id=shop_id';
				$filed = ['ord_id','ord_status','ord_shop_id as uid','shop_tel'];
				break;
			case 'user':
				$table = 'pl_order';
				$filed = ['ord_id','ord_status','ord_pu_uid as uid'];
				break;
		}
		// 获取订单状态 订单取消不发通知
		$where = sprintf("and ord_id in (%s) and ord_status!='cancel'",implode(',', $ordIds));

		$res = $this->get($table,$filed,$where);
		if(empty($res['data']))
			return LibFc::ReturnData(false,'只有待付款、已支付、待发货、售后中、已发货、已完成的订单才能发送短信通知');

		//每个订单绑定一个号码 
		$ordIdPhone = [];
		foreach ($res['data'] as $key => $value) 
		{
			$ordIdPhone[$value['uid']] = $value['shop_tel'];
		}
		$mainPhone = [];
		foreach ($ordIdPhone as $key => $value) 
		{
			$arr = [];
			$arr = explode(',', $value);
			if(!empty($arr))
			{
				foreach ($arr as $k => $v) 
				{
					if(preg_match("/^1\d{10}$/",$v))
					{
						$mainPhone[$key] = $v;
					}
				}
			}
		}
		$nohasPhone = array_diff(array_keys($ordIdPhone),array_keys($mainPhone));

		if(!empty($nohasPhone))
		{
			$YpwUser = new YpwUser();
			$user = $YpwUser->GetUser(['u_id','u_mobile'], sprintf(" and u_id in (%s)", implode(',', $nohasPhone)), false);
			foreach ($user['data'] as $key => $value) 
			{
				$mainPhone[$value['u_id']] = $value['u_mobile'];
			}
		}

		//查看订单是否在售后中
		$refunRes = $this->get('pl_refund_pact',['rep_id','rep_ord_id','rep_status'], sprintf("and rep_ord_id in (%s) and rep_status is not null and (rep_status !='close' or rep_status='refunded')", implode(',', $ordIds)));
		$refunRes = array_column($refunRes['data'], 'rep_status', 'rep_ord_id');

		// 订单状态枚举
		$statusDes = ['creat' => '待付款','paied'=>'已付款','send'=>'已发货','completed'=>'已完成','refund'=>'售后中'];
		foreach ($res['data'] as $key => $value)
		{
			if(!empty($refunRes[$value['ord_id']]))
				$value['ord_status'] = 'refund';
			if(!empty($mainPhone[$value['uid']]))
			{
				$dataArr = [
					'sms_type'=>'紧急',
					'sms_from'=>mvc::$cfg['FROM']?mvc::$cfg['FROM']:'PJL',
					'sms_style'=>'orderStatus',
					'sms_to_mobile'=>$mainPhone[$value['uid']],//负责人电话
					'sms_text'=>'{"ordId":"'.$value['ord_id'].'", "status":"'.$statusDes[$value['ord_status']].'"}'
				];
				$MustArr = ['sms_type', 'sms_from', 'sms_to_mobile', 'sms_text'];
				foreach($MustArr as $V)
				{
					if(empty($dataArr[$V]))
					{
						LibFc::ReturnJson(false, $V.'参数必填');
						exit;
					}
				}
				$MobileArr = [];
				if(preg_match_all('/(1\d{10})\S?/', $dataArr['sms_to_mobile'], $Match))
				{
					$MobileArr = $Match[1];
				}
				if(empty($MobileArr))
				{
					LibFc::ReturnJson(false, '手机号码不正确');
					exit;
				}

				$SendBase = new SendBase();

				$DataArr = [
					'sms_type'=>trim($dataArr['sms_type']),	
					'sms_from'=>trim($dataArr['sms_from']),
					'sms_to_mobile'=>implode(',', $MobileArr),
					'sms_text'=>$dataArr['sms_text'],
					'sms_add_time'=>time(),
					'again'=>$dataArr['again']
				];
				$DataArr['sms_sign'] = empty($dataArr['sms_sign'])? '宜配网': trim($dataArr['sms_sign']);
				if(isset($dataArr['sms_expire_time'])) $DataArr['sms_expire_time'] = (int) $dataArr['sms_expire_time'];
				if(isset($dataArr['sms_style'])) $DataArr['sms_style'] = $dataArr['sms_style'];

				$Res = $SendBase->GetEnum('sc_sms', 'sms_type');
				if(!in_array($DataArr['sms_type'], $Res['data']))
				{
					LibFc::ReturnJson(false, '提供的sms_type参数值不存在');
					exit;
				}
				$SendSms = new SendSms();
				$Res = $SendSms->send($DataArr);
				LibFc::ReturnJson(true, $Res['data']);
			}
		}
		return LibFc::ReturnData(true);
	}
}