/**
  * 发布需求 规则::(以下数值均可调整)
  * 1 5分钟内商家报价达到10 或者 用户选择商户,停止推送,(达到10家报价 不从未保价消失,只提示已超过10家商户报价)
  * 2 5分钟后,没有达到10家报价,推送半径增加2km,且剔除已推送过的商家。如范围内没有商家,立即叠加2km (最多5次,即范围13km后不在推送)
  * 3 5分钟为一次循环点,每次增加2km,直到报价到达10家,或者用户选择商家 或者总半径范围达到13km
  * 4    报价个数只增不减,即使商家撤销了报价。
  */
 public function demand_push()
 {
     set_time_limit(0);
     //初始公里数
     $initKm = C('PUSH_RANGE_KM');
     $initBindingNUm = C('PUSH_MAX_BINDING_NUM');
     $initRangeKm = C('PUSH_MAX_RANGE_KM');
     $initPerKm = C('PUSH_PER_KM');
     $time = time();
     //筛选出哪些是应该推送的 报价小于{}、未选定商家、范围小于{}、未过期需求[未删除]
     // range_km 不等于0 ;等于0为只推送一次,无需再次扩充范围
     $map = array('is_bidding' => array('lt', $initBindingNUm), 'merchant_id' => 0, 'range_km' => array(array('lt', $initRangeKm), array('neq', 0)), 'status' => 0, 'expire_time' => array('gt', $time));
     $demandDb = M('MemberDemand');
     $data = $demandDb->where($map)->field('id,range_km,longitude,latitude')->select();
     // 		echo $demandDb->getlastSql();
     // dump($data);die();
     $log = M('RunLog');
     $merchantDb = M('Merchant');
     $merchantEnable = M('DemandMerchantEnable');
     // 		dump($data);die();
     if (!empty($data)) {
         foreach ($data as $key => $row) {
             //再次确认是否需要推送
             $mapCheck = $map;
             $mapCheck['id'] = $row['id'];
             $mapCheck['expire_time'] = array('gt', time());
             $check = $demandDb->where($mapCheck)->find('id');
             if ($check !== false) {
                 $current = $row['range_km'];
                 do {
                     $loop = false;
                     $current += $initPerKm;
                     // dump($current);
                     //范围不超过最大值
                     if ($current > $initRangeKm) {
                         break;
                     }
                     //获取最大最小经纬度
                     $ll_arr = rangekm($current, $row['longitude'], $row['latitude']);
                     $maxLng = $ll_arr['maxLng'];
                     $minLng = $ll_arr['minLng'];
                     $maxLat = $ll_arr['maxLat'];
                     $minLat = $ll_arr['minLat'];
                     //获取范围内商家
                     $merchantList = array();
                     $sql = "select a.id,b.id as jid,a.business_time from " . C('DB_PREFIX') . "merchant as a\r\n\t\t\t\t\tleft join " . C('DB_PREFIX') . "system_user as b on (a.id = b.sub_id and b.type =2)\r\n\t\t\t\t\twhere a.longitude <={$maxLng} and a.longitude>={$minLng} and a.latitude <={$maxLat} and a.latitude>={$minLat} and (a.status = 0 or a.status =1) ";
                     $merchantList = M('')->query($sql);
                     $merchantListCount = count($merchantList);
                     // dump($merchantListCount);
                     //剔除已推送的商家
                     $merchantEnableList = $merchantEnable->where(array('demand_id' => $row['id']))->field('merchant_id')->select();
                     $merchantEnableListCount = count($merchantEnableList);
                     // dump($merchantEnableListCount);
                     //如果有商家的话
                     if ($merchantListCount > $merchantEnableListCount) {
                         $MerchantLeft = array();
                         foreach ($merchantList as $ke => $ro) {
                             foreach ($merchantEnableList as $k => $r) {
                                 $enable = 0;
                                 if ($ro['id'] == $r['merchant_id']) {
                                     $enable = 1;
                                     break;
                                 }
                             }
                             if ($enable == 0) {
                                 $MerchantLeft[] = $ro;
                             }
                         }
                         //对剩余商家进行推送
                         // $MerchantLeft = array(array('id'=>105,'jid'=>18));
                         $jid = array();
                         foreach ($MerchantLeft as $mk => $mr) {
                             $addAll[$mk]['id'] = null;
                             $addAll[$mk]['merchant_id'] = $mr['id'];
                             $addAll[$mk]['demand_id'] = $row['id'];
                             if (timeCompare($mr['business_time'])) {
                                 $jid[] = $mr['jid'];
                             }
                         }
                         $addMerchant = $merchantEnable->addAll($addAll);
                         // $log->add(array('position'=>'cronPush','msg'=>json_encode($addAll),'addtime'=>date('Y-m-d H:i:s',time()),'status'=>1));
                         if (!$addMerchant) {
                             $log->add(array('position' => 'cronPush', 'msg' => '执行id为' . $row['id'] . '的定时任务add数据库(DemandMerchantEnable)失败', 'addtime' => date('Y-m-d H:i:s', time()), 'status' => 1));
                         }
                         if ($addMerchant === false) {
                             $log->add(array('position' => 'cronPush', 'msg' => '执行id为' . $row['id'] . '的需求时,周围' . $current . 'km无商家', 'addtime' => date('Y-m-d H:i:s', time()), 'status' => 1));
                         }
                         //云推送
                         $push['demand_id'] = $row['id'];
                         // dump($push);
                         $jpush = new \App\Model\JpushModel();
                         $jpush->user = 2;
                         $jpush->push(1, $jid, $push);
                         $xmpp = new \App\Model\XmppApiModel();
                         $xmpp->requestPush(1, $jid, $push);
                     } else {
                         $loop = true;
                     }
                     //更新已推送的公里数
                     $saveRange = $demandDb->where(array('id' => $row['id']))->save(array('range_km' => $current));
                 } while ($loop);
             }
         }
     }
     $log->add(array('position' => 'cronPush', 'msg' => '定时任务更新数据库(MemberDemand)成功', 'addtime' => date('Y-m-d H:i:s', time()), 'status' => 0));
 }
 /**
  * 用户发布需求
  */
 public function add_demand()
 {
     $publish = isset($_POST['publish']) ? (int) htmlspecialchars($_POST['publish']) : '0';
     // 发布需求方式默认0,0 项目发布需求 1保养发布需求
     $cart_id = isset($_POST['cart_id']) ? (int) htmlspecialchars($_POST['cart_id']) : '';
     $reach_time = isset($_POST['reach_time']) ? htmlspecialchars($_POST['reach_time']) : '';
     $desc = isset($_POST['desc']) ? htmlspecialchars($_POST['desc']) : '';
     // 		$range_km = isset ( $_POST ['range_km'] ) ? htmlspecialchars ( $_POST ['range_km'] ) : '';
     $category_ids = isset($_POST['category_ids']) ? htmlspecialchars($_POST['category_ids']) : '';
     $member_session_id = $_POST['member_session_id'];
     $member_id = $this->session_handle->getsession_userid($member_session_id);
     $longitude = $_POST['longitude'];
     $latitude = $_POST['latitude'];
     if (empty($longitude) || empty($latitude)) {
         $this->jsonUtils->echo_json_msg(4, '经度或者纬度为空...');
         exit;
     }
     // 		Log::write($cart_id,'ERR');
     if (empty($cart_id)) {
         $this->jsonUtils->echo_json_msg(4, '车辆为空...');
         exit;
     }
     if (empty($reach_time)) {
         $this->jsonUtils->echo_json_msg(4, '预约时间为空');
         exit;
     }
     $arr_ids = explode(",", $category_ids);
     $count = count($arr_ids);
     $name = $this->getDemandName($arr_ids, $publish);
     if (!$name) {
         $this->jsonUtils->echo_json_msg(4, '发布需求的项目存在错误');
         exit;
     }
     $reach_time = strtotime($reach_time);
     if ($reach_time < time()) {
         $this->jsonUtils->echo_json_msg(4, '发布到店时间要大于当前时间');
         exit;
     }
     $auth = $this->auth_add_demand($member_id);
     $ll_arr = rangekm(C('PUSH_RANGE_KM'), $longitude, $latitude);
     //获取最大最小经纬度
     $maxLng = $ll_arr['maxLng'];
     $minLng = $ll_arr['minLng'];
     $maxLat = $ll_arr['maxLat'];
     $minLat = $ll_arr['minLat'];
     $data['publish'] = $publish;
     if ($publish == 1) {
         $km = isset($_POST['km']) ? htmlspecialchars($_POST['km']) : '';
         if (empty($km)) {
             $this->jsonUtils->echo_json_msg(4, '用户公里数为空');
             exit;
         }
         $param = array('km' => $km, 'category_ids' => $category_ids);
         $data['param'] = json_encode($param);
     }
     $data['member_id'] = $member_id;
     $data['cart_id'] = $cart_id;
     $data['cart_data'] = $this->getcart($cart_id);
     $data['title'] = $name;
     // $data['city_id']=$area['city'];
     // $data['area_id']=$area_id;
     $data['reach_time'] = $reach_time;
     $data['description'] = $desc;
     $data['addtime'] = time();
     $data['expire_time'] = time() + 24 * 60 * 60;
     $data['range_km'] = C('PUSH_RANGE_KM');
     $data['longitude'] = $longitude;
     $data['latitude'] = $latitude;
     $data['pics'] = json_encode(array());
     if ($_FILES) {
         $f_arr = mul_upload('/Demand/', 1);
         if ($f_arr) {
             $data['pics'] = json_encode($f_arr);
             // 把多张图片数组格式转json保存数据库
         }
     }
     $result = $this->dao->add($data);
     if ($result) {
         $data['demand_id'] = $result;
         $subitems = M("member_demand_subitems");
         if (!empty($category_ids)) {
             $data1["member_id"] = $member_id;
             // 会员ID
             $data1["demand_id"] = $result;
             // 需求id
             foreach ($arr_ids as $key => $value) {
                 $data1['category_id'] = $value;
                 // 子项目ID
                 $subitems->add($data1);
             }
         }
         //查询出范围内的商家,给其调整需求配置
         $sql = "select a.business_time,a.id,b.id as jid from " . C('DB_PREFIX') . "merchant as a \r\n\t\t\tleft join " . C('DB_PREFIX') . "system_user as b on (a.id = b.sub_id and b.type =2)\r\n\t\t\twhere a.longitude <={$maxLng} and a.longitude>={$minLng} and a.latitude <={$maxLat} and a.latitude>={$minLat} and ( a.status = 0 or a.status = 1)";
         $ids = M('')->query($sql);
         //echo M('')->getLastSql();
         if ($ids) {
             foreach ($ids as $key => $row) {
                 $addAll[$key]['id'] = null;
                 $addAll[$key]['merchant_id'] = $row['id'];
                 $addAll[$key]['demand_id'] = $result;
                 if (timeCompare($row['business_time'])) {
                     $jid[] = $row['jid'];
                 }
             }
             M('DemandMerchantEnable')->addAll($addAll);
             $jpush = new \App\Model\JpushModel();
             $jpush->user = 2;
             $jpush->push(1, $jid, $data);
             $xmpp = new \App\Model\XmppApiModel();
             $xmpp->requestPush(1, $jid, $data);
             //云推送
         }
         $this->jsonUtils->echo_json_msg(0, '发布需求成功!');
         exit;
     } else {
         $this->jsonUtils->echo_json_msg(1, 'failed');
         exit;
     }
 }