<?php
class B2cMoney extends B2cBase
{
	/**
	  * @method 买家资金流
	   * @param  $dataArr  [
							'mol_uid'=>'用户ID',
							'mol_ord_ids'=>'订单ID，多个逗号分隔',
							'mol_type'=>'0付款  1退款',
							'mol_money'=>'金额',
							'mol_des'=>'描述'
						]
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	public function addUserMoney($dataArr)
	{
		//参数校验
		if(!LibFc::Int($dataArr['mol_uid']) || !in_array($dataArr['mol_type'], [0,1]) || empty($dataArr['mol_money']))
		{
			return LibFc::ReturnData(false, 'addUserMoney提供的参数有误');
		}
		
		$dataArr['mol_opl_id'] = (int) $dataArr['mol_opl_id'];
		$dataArr['mol_atime'] = time();
		//操作人，系统自动读取
		$dataArr['mol_by_uid'] = mvc::$cfg['LOGUSER']['uid'];
		$dataArr['mol_by_uname'] = mvc::$cfg['LOGUSER']['urname'];
		$dataArr['mol_money'] = sprintf("%.2f", $dataArr['mol_money']);
		return $this->add('us_money_list', $dataArr);
	}

	/**
	  * @method 卖家余额
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> ['money'=>总余额, 'money_unav'=>冻结金额, 'money_av'=>可用余额, 'commission'=>佣金率] ["code"]=> int(0) ]
	  */
	public function getShopMoney($shopId)
	{
		$moneyArr = ['money'=>0.00, 'money_unav'=>0.00, 'money_av'=>0.00, 'commission'=>0.00];
		$shopId = (int) $shopId;
		if($shopId > 0)
		{
			$res = $this->get('sh_shop', ['shop_money', 'shop_commission'], sprintf(" and shop_id=%d", $shopId), true);
			if(!empty($res['data']))
			{
				$moneyArr['money'] = $res['data']['shop_money'];
				$moneyArr['commission'] = $res['data']['shop_commission'];
				
				//冻结资金：提现中、退款转账中
				$res = $this->get('sh_money_unav', ['sum(mou_money) mou_money'], sprintf(" and mou_shop_id=%d and mou_status=0", $shopId), true);
				$moneyArr['money_unav'] = $res['data']['mou_money'];

				$moneyArr['money_av'] = $moneyArr['money'] - $moneyArr['money_unav'];
				return LibFc::ReturnData(true, $moneyArr);
			}
		}
		return LibFc::ReturnData(false, 'getShopMoney 店铺ID不存在');
	}
	
	
	/**
	  * @method 卖家资金变化记录
	  * @param  $dataArr  [
							'mon_shop_id'=>'店铺ID',
							'mon_stype'=>'0收入  1退款  2提现  3佣金',
							'mon_pay_by'=>'0微信  1余额',
							'mon_money'=>'金额',
							'mon_title'=>'标题'
						]
	  * @param  $mouId 冻结资金ID【可选】
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>["code"]=> int(0) ]
	  */
	public function addShopMoney($dataArr, $mouId = 0)
	{
		//参数校验
		if(!LibFc::Int($dataArr['mon_shop_id']) || !in_array($dataArr['mon_stype'], [0,1,2,3]) || empty($dataArr['mon_money']))
		{
			return LibFc::ReturnData(false, 'addShopMoney提供的参数有误');
		}
		
		$dataArr['mon_shop_id'] = (int) $dataArr['mon_shop_id'];
		$dataArr['mon_dataid'] = (int) $dataArr['mon_dataid'];
		$dataArr['mon_por_id'] = (int) $dataArr['mon_por_id'];
		$dataArr['mon_pmc_id'] = (int) $dataArr['mon_pmc_id'];
		$dataArr['mon_pre_id'] = (int) $dataArr['mon_pre_id'];
		//操作人，系统自动读取
		$dataArr['mon_by_uid'] = mvc::$cfg['LOGUSER']['uid'];
		$dataArr['mon_by_uname'] = mvc::$cfg['LOGUSER']['urname'];
		$res = $this->getShopMoney($dataArr['mon_shop_id']);
		$shopMoney = $res['data'];
		
		$dataArr['mon_money'] = sprintf("%.2f", $dataArr['mon_money']);
		
		//提供冻结记录
		$mouMoney = 0.00;
		$mouId = (int) $mouId;
		if($mouId > 0)
		{
			$res = $this->get('sh_money_unav', ['mou_money'], sprintf(" and mou_status=0 and mou_id=%d and mou_shop_id =%d", $mouId, $dataArr['mon_shop_id']), true);
			if(empty($res['data'])) return LibFc::ReturnData(false, 'addShopMoney mouId参数异常');
			$mouMoney = $res['data']['mou_money'];
		}
		
		//如果是支出，是否够支付  可用金额+某冻结资金-支出金额 
		if($dataArr['mon_money'] < 0 && ($shopMoney['money_av'] + $mouMoney) < $dataArr['mon_money'])
		{
			return LibFc::ReturnData(false, 'addShopMoney 店铺可用余额不足');
		}
		$this->B2CDb->Begin();
		
		//根据金额判断支出还是收入
		$dataArr['mon_tyle'] = $dataArr['mon_money'] > 0? 0: 1;
		$dataArr['mon_money_old'] = $shopMoney['money'];
		$dataArr['mon_money_new'] = $shopMoney['money'] + $dataArr['mon_money'];
		$dataArr['mon_atime'] = time();
		$res = $this->add('sh_money', $dataArr);
		$mon_id = $res['data'];

		//店铺账面余额更新
		$this->set('sh_shop', ['shop_money'=>$dataArr['mon_money_new']], sprintf(" and shop_id=%d", $dataArr['mon_shop_id']));
		$this->B2CDb->End();
		return LibFc::ReturnData(true, $mon_id);
	}


	/**
	  * @method 卖家提现
	  * @param  $dataArr array ['mow_shop_id'=>'', 'mow_total_money'=>'', 'mow_acc_id'=>'',...]
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>["code"]=> int(0) ]
	  */
	public function addShopMoneyWithdrawals($dataArr)
	{
		if(!LibFc::Int($dataArr['mow_shop_id']) || empty($dataArr['mow_total_money']) || !LibFc::Int($dataArr['mow_acc_id']))
		{
			return LibFc::ReturnData(false, 'addTiXian 提供的参数不正确');
		}

		$dataArr['mow_by_uid'] = mvc::$cfg['LOGUSER']['uid'];
		$dataArr['mow_by_uname'] = mvc::$cfg['LOGUSER']['urname'];
		$dataArr['mow_acc_id'] = (int) $dataArr['mow_acc_id'];
		$dataArr['mow_shop_id'] = (int) $dataArr['mow_shop_id'];
		$dataArr['mow_total_money'] = sprintf("%.2f", $dataArr['mow_total_money']);
		
		//检查余额是否充足
		$res = $this->getShopMoney($dataArr['mow_shop_id']);
		$shopMoney = $res['data'];
		if($shopMoney['money_av'] < $dataArr['mow_total_money'])
		{
			return LibFc::ReturnData(false, '店铺可用余额不足');
		}

		if(empty($shopMoney['commission']) || $shopMoney['commission'] > 20)
		{
			return LibFc::ReturnData(false, '店铺佣金设置异常');
		}
		
		$res = $this->get('sh_shop', ['shop_uid'], sprintf(" and shop_id=%d", $dataArr['mow_shop_id']), true);
		$shopMoney = array_merge($shopMoney, $res['data']);

		//佣金
		$dataArr['mow_comm_money'] = sprintf("%.2f", $dataArr['mow_total_money']*$shopMoney['commission']/100);
		//到账金额
		$dataArr['mow_real_money'] = $dataArr['mow_total_money'] - $dataArr['mow_comm_money'];
		$dataArr['mow_shop_commission'] = $shopMoney['commission'];
		

		if($dataArr['mow_real_money'] < 1)
		{
			return LibFc::ReturnData(false, '实际到账金额低于1元，不允许提现');
		}

		//收款人信息
		$res = $this->get('sh_account join sh_account_bind on acc_acb_id = acb_id', ['*'], sprintf(" and acc_shop_id=%d and acc_id=%d", $dataArr['mow_shop_id'], $dataArr['mow_acc_id']), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '提现收款账号不存在');
		$accArr = $res['data'];
		//$dataArr['mow_acc_type'] = $accArr['acc_type'];
		$dataArr['mow_acc_data'] = json_encode($accArr);

		$this->B2CDb->Begin();

		//先创建提现记录及资金流水再调用微信转账接口，防止接口异常重复转账
		$time = time();
		$dataArr['mow_status'] = 0;
		//提现记录
		$dataArr['mow_pmc_guid'] = LibFc::guid();
		$dataArr['mow_atime'] = $time;
		$res = $this->add('sh_money_withdrawals', $dataArr);
		$dataArr['mow_id'] = $res['data']; 

		//冻结资金
		$unvData = [
			'mou_shop_id'=>	$dataArr['mow_shop_id'],
			'mou_status'=>	0,
			'mou_title'=> '余额提现，提现ID：'.$dataArr['mow_id'],
			'mou_money'=> $dataArr['mow_total_money'],
			'mou_atime'=> $time
		];
		$res = $this->add('sh_money_unav', $unvData);
		$unvData['mou_id'] = $res['data'];
		$this->set('sh_money_withdrawals', ['mow_mou_id'=>$unvData['mou_id']], sprintf(" and mow_id=%d", $dataArr['mow_id']));

		$this->B2CDb->End();
		if(in_array($accArr['acc_type'], [0,1]))
		{
			$by = $accArr['acc_type'] == 0 ? 'weixin': 'alipay';
			$openid = $accArr['acc_type'] == 0 ? $accArr['acc_weixin_oppenid']: $accArr['acc_alipay_account'];
			//发起企业转账
			$apiDataArr = [
				'pmc_u_id'=>$shopMoney['shop_uid'],
				'pmc_guid'=>$dataArr['mow_pmc_guid'],
				'pmc_from'=>'PJD',
				'pmc_to_openid'=>$openid,
				'pmc_to_name'=>$accArr['acb_name'],
				'pmc_to_idcard'=>$accArr['acb_idcard'],
				'pmc_pay_by'=>$by,
				'pmc_money'=>$dataArr['mow_real_money'],
				'pmc_des'=>'提现ID：'.$dataArr['mow_id']
			];
			$LibYpApi = new LibYpApi();
			$res = $LibYpApi->get('order/mchPay', [], $apiDataArr);
			$mchArr = $res['data'];
			if(!empty($mchArr['pmc_id']))
			{
				$this->set('sh_money_withdrawals', ['mow_pmc_id'=>$mchArr['pmc_id']], 'and mow_id='.$dataArr['mow_id']);
			}
		}
		return LibFc::ReturnData(true, $dataArr['mow_id']);
	}

	/**
	  * @method 检查卖家提现状态
	  * @param  $mowId 提现ID
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> -1已关闭  0处理中 1完成 ["code"]=> int(0) ]
	  */
	public function autoShopMoneyWithdrawals($mowId)
	{
		$mowId = (int) $mowId;
		$res = $this->get('sh_money_withdrawals', ['*'], sprintf(" and mow_id=%d", $mowId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '提现记录不存在');
		$mowArr = $res['data'];

		if($mowArr['mow_status'] != 0) return LibFc::ReturnData(true, $setArr['mow_status']);
		
		$setArr = [];
		$setArr['mow_status'] = $mowArr['mow_status'];
		//检查微信是否完成转账
		$LibYpApi = new LibYpApi();
		$res = $LibYpApi->get('order/getMchPay', [], ['pmc_id'=>$mowArr['mow_pmc_id']]);
		$mchArr = $res['data'];
		if(!empty($mchArr['pmc_id']))
		{
			$this->B2CDb->Begin();
			if($mchArr['pmc_status'] == -1)
			{
				//转账失败
				$setArr['mow_status'] = -1;
				$setArr['mow_close_time'] = time();
				$this->set('sh_money_withdrawals', $setArr, 'and mow_id='.$mowArr['mow_id']);
				$this->set('sh_money_unav', ['mou_status'=>-1, 'mou_close_time'=>time()], 'and mou_id='.$mowArr['mow_mou_id']);
			}
			else if($mchArr['pmc_status'] == 1)
			{
				//转账成功
				$moneyLogArr = [
					'mon_shop_id'=>$mowArr['mow_shop_id'],
					'mon_stype'=>2,
					'mon_money'=>-$mowArr['mow_real_money'],
					'mon_title'=>'提现'.$mowArr['mow_total_money'].'元实际到账，提现ID：'.$mowArr['mow_id'],
					'mon_tyle'=>1,
					'mon_dataid'=>$mowArr['mow_id'],
					'mon_pmc_id'=>$mowArr['mow_pmc_id']
				];
				$res = $this->addShopMoney($moneyLogArr, $mowArr['mow_mou_id']);
				$setArr['mow_real_mon_id'] = $res['data'];

				$moneyLogArr = [
					'mon_shop_id'=>$mowArr['mow_shop_id'],
					'mon_stype'=>3,
					'mon_money'=>-$mowArr['mow_comm_money'],
					'mon_title'=>'提现'.$mowArr['mow_total_money'].'元佣金结算，提现ID：'.$mowArr['mow_id'],
					'mon_tyle'=>1,
					'mon_to'=>'宜配'
				];
				$res = $this->addShopMoney($moneyLogArr, $mowArr['mow_mou_id']);
				$setArr['mow_comm_mon_id'] = $res['data'];

				$setArr['mow_status'] = 1;
				$setArr['mow_ok_time'] = time();
				$this->set('sh_money_withdrawals', $setArr, 'and mow_id='.$mowArr['mow_id']);
				$this->set('sh_money_unav', ['mou_status'=>1, 'mou_ok_time'=>time()], 'and mou_id='.$mowArr['mow_mou_id']);
			}
			$this->B2CDb->End();
		}
		return LibFc::ReturnData(true, $setArr['mow_status']);
	}


	/**
	  * @method 人工处理提现
	  * @param  $mowId 提现ID
	  * @param  $status -1 关闭  1完成
	  * @param  $dataArr ['mow_remark'=>'备注', 'mow_ok_time'=>....]
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=> -1已关闭  0处理中 1完成 ["code"]=> int(0) ]
	  */
	public function setShopMoneyWithdrawals($mowId, $status, $dataArr)
	{
		$mowId = (int) $mowId;
		$res = $this->get('sh_money_withdrawals', ['*'], sprintf(" and mow_id=%d", $mowId), true);
		if(empty($res['data'])) return LibFc::ReturnData(false, '提现记录不存在');
		$mowArr = $res['data'];

		if($mowArr['mow_status'] != 0) return LibFc::ReturnData(true, $setArr['mow_status']);
		
		$setArr = [
			'mow_by_uid'=>mvc::$cfg['LOGUSER']['uid'],	
			'mow_by_uname'=>mvc::$cfg['LOGUSER']['urname'],
			'mow_remark'=>$dataArr['mow_remark']
		];
		$setArr['mow_status'] = $mowArr['mow_status'];
		$this->B2CDb->Begin();
		if($status == -1)
		{
			//转账失败
			$setArr['mow_status'] = -1;
			$setArr['mow_close_time'] = time();
			$this->set('sh_money_withdrawals', $setArr, 'and mow_id='.$mowArr['mow_id']);
			$this->set('sh_money_unav', ['mou_status'=>-1, 'mou_close_time'=>time()], 'and mou_id='.$mowArr['mow_mou_id']);
		}
		else if($status == 1)
		{
			//转账成功
			$moneyLogArr = [
				'mon_shop_id'=>$mowArr['mow_shop_id'],
				'mon_stype'=>2,
				'mon_money'=>-$mowArr['mow_real_money'],
				'mon_title'=>'提现'.$mowArr['mow_total_money'].'元实际到账，提现ID：'.$mowArr['mow_id'],
				'mon_tyle'=>1,
				'mon_dataid'=>$mowArr['mow_id'],
				'mon_pmc_id'=>$mowArr['mow_pmc_id']
			];
			$res = $this->addShopMoney($moneyLogArr, $mowArr['mow_mou_id']);
			$setArr['mow_real_mon_id'] = $res['data'];

			$moneyLogArr = [
				'mon_shop_id'=>$mowArr['mow_shop_id'],
				'mon_stype'=>3,
				'mon_money'=>-$mowArr['mow_comm_money'],
				'mon_title'=>'提现'.$mowArr['mow_total_money'].'元佣金结算，提现ID：'.$mowArr['mow_id'],
				'mon_tyle'=>1,
				'mon_to'=>'宜配'
			];
			$res = $this->addShopMoney($moneyLogArr, $mowArr['mow_mou_id']);
			$setArr['mow_comm_mon_id'] = $res['data'];

			$setArr['mow_status'] = 1;
			$setArr['mow_ok_time'] = isset($dataArr['mow_ok_time']) ? $dataArr['mow_ok_time'] :time();
			$this->set('sh_money_withdrawals', $setArr, 'and mow_id='.$mowArr['mow_id']);
			$this->set('sh_money_unav', ['mou_status'=>1, 'mou_ok_time'=>time()], 'and mou_id='.$mowArr['mow_mou_id']);
		}
		$this->B2CDb->End();
		return LibFc::ReturnData(true, $setArr['mow_status']);
	}


	/**
	  * @method 银行列表
	  * @author soul
	  * @copyright 2017/6/5
	  * @return [["status"]=> bool(true) ["data"]=>  ["code"]=> int(0) ]
	  */
	function getBank()
	{
		$arr = ['中国工商银行','招商银行','中国建设银行','中国银行','中国农业银行','交通银行','浦发银行','广发银行','中信银行','中国光大银行','兴业银行','平安银行','中国民生银行'];
		$arr0 = ['杭州银行','上海银行','宁波银行','中国邮政储蓄银行','湖北省农村信用合作联社','天津银行','云南红塔银行','攀枝花市商业银行','潍坊银行','长城华西银行','北京农商行','贵阳银行','渤海银行','鄞州银行','泸州市商业银行','梅县客家村镇银行','包商银行','内蒙古农村信用社联合社','枣庄银行','大连银行','深圳农村商业银行','富邦华一银行','江南农村商业银行','兰州银行','烟台银行','华融湘江银行','吉林省农村信用社联合社','湖南省农村信用社','江苏太仓农村商业银行','晋商银行','珠海华润银行','商丘市商业银行','河南省农村信用社','成都银行','外换银行','晋城银行','宁夏银行','营口沿海银行','桂林银行','盛京银行','张家港农村商业银行','山西省农村信用社','齐商银行','贵州省农村信用社联合社','广西北部湾银行','海口联合农商银行','安徽省农村信用社','深圳发展银行','阜新银行','青岛银行','广东华兴银行','西安银行','江苏省农村信用社联合社','上海农商银行','昆山农村商业银行','河北省农村信用社','河北银行','邯郸银行','甘肃省农村信用社','齐鲁银行','鞍山银行','台州银行','海南省农村信用社','九江银行','嘉兴银行','常熟农商银行','赣州银行','营口银行','汉口银行','石嘴山银行','四川省农村信用社联合社','浙江省农村信用社联合社','山东省农村信用社联合社','自贡银行','鄂尔多斯银行','东营银行','德州银行','金华银行','福建海峡银行','广东南粤银行','衡水市商业银行','湖州银行','重庆三峡银行','锦州银行','厦门国际银行','吴江农村商业银行','宜宾市商业银行','成都农商银行','黑龙江省农村信用社联合社','济宁银行','恒丰银行','吉林银行','长安银行','长沙银行','莱商银行','龙江银行','韩亚银行','东亚银行','沧州银行','绍兴银行','朝阳银行','漯河银行','浙江民泰商业银行','浙商银行','焦作中旅银行','韩国企业银行','辽宁省农村信用社','乌鲁木齐银行','邢台银行','威海市商业银行','新疆农村信用社','柳州银行','泰安银行','厦门银行','临商银行','顺德农商银行','大连农村商业银行','联合村镇银行','郑州银行','福建省农村信用社联合社','南海农商银行','宁波通商银行','乌海银行','昆仑银行','徽商银行','哈尔滨银行','南京银行','天津农商银行','宁夏黄河农村商业银行','上饶银行','葫芦岛银行','日照银行','东莞农村商业银行','四川天府银行','中原银行','广东省农村信用社联合社','温州银行','南阳市商业银行','青海省农村信用社','绵阳市商业银行','保定银行','重庆农村商业银行','泉州银行','北京银行','陕西信合','洛阳银行','张家口银行','内蒙古银行','广州农村商业银行','武汉农村商业银行','浙江稠州商业银行','友利银行','江西省农村信用社','东莞银行','青海银行','贵州银行','江苏银行','开封市商业银行','湖商村镇银行','平顶山银行','天津滨海农村商业银行','曲靖市商业银行','江西银行','富滇银行','乐山市商业银行','晋中银行','苏州银行','廊坊银行','无锡农村商业银行','浙江泰隆商业银行','云南省农村信用社','新韩银行','江苏长江商业银行','重庆银行','湖北银行','华夏银行','广西壮族自治区农村信用社联合社','江苏江阴农村商业银行','网商银行','东营莱商村镇银行','银座村镇银行','承德银行','遂宁银行','长春朝阳和润村镇银行','广州银行'];
		sort($arr0);
		foreach($arr0 as $k=>$v)
		{
			$arr0[$k] = iconv('UTF-8', 'GB2312',$v);
		}
		asort($arr0);
		foreach($arr0 as $k=>$v) 
		{
			$arr0[$k] = iconv('GB2312', 'UTF-8', $v);
		}
		$arr = array_merge($arr, $arr0);
		return LibFc::ReturnData(true, $arr);
	
	}
}