<?php



namespace wstmart\admin\model;



use think\Db;



/**



 * ============================================================================



 * 定时业务处理



 */



class CronJobs extends Base{



	/**



	 * 管理员登录触发动作



	 */



	public function autoByAdmin(){



		$this->autoCancelNoPay();



		$this->autoReceive();



		$this->autoAppraise();



		$this->autoSendMsg();



	}



	/**



	 * 取消未支付订单



	 */



	public function autoCancelNoPay(){



		$autoCancelNoPayDays = (int)WSTConf('CONF.autoCancelNoPayDays');


	 	$autoCancelNoPayDays = ($autoCancelNoPayDays>0)?$autoCancelNoPayDays:6;



	 	$lastDay = date("Y-m-d H:i:s",strtotime("-".$autoCancelNoPayDays." hours"));



	 	$orders = Db::name('orders')->alias('o')->join('__SHOPS__ s','o.shopId=s.shopId','left')->where("o.createTime<'".$lastDay."' and o.orderStatus=-2 and o.dataFlag=1 and o.payType=1 and o.isPay=0")->field("o.orderId,o.orderNo,o.userId,o.shopId,o.useScore,s.userId shopUserId,orderCode")->select();



	 	if(!empty($orders)){



	 		$prefix = config('database.prefix');



	 		$orderIds = [];



	 		foreach ($orders as $okey => $order){



	 			$orderIds[] = $order['orderId'];



	 		}



	 		Db::startTrans();



		    try{



		    	//提前锁定订单



		    	Db::name('orders')->where(['orderId'=>['in',$orderIds]])->update(['orderStatus'=>-1]);



                foreach ($orders as $okey => $order){



                	$shopId = $order['shopId'];



                	//未付款状态则直接退回积分



                    if($order['useScore']>0){



                    	$score = [];



						$score['userId'] = $order['userId'];



						$score['score'] = $order['useScore'];



						$score['dataSrc'] = 1;



						$score['dataId'] = $order['orderId'];



						$score['dataRemarks'] = "取消交易订单【".$order['orderNo']."】,退回积分".$order['useScore']."个";



						$score['scoreType'] = 1;



						model('common/UserScores')->add($score);



                    }



                	$goods = Db::name('order_goods')->alias('og')->join('__GOODS__ g','og.goodsId=g.goodsId','inner')



					           ->where('orderId',$order['orderId'])->field('og.*,g.isSpec')->select();



					foreach ($goods as $k => $v){



						//处理虚拟产品



					    if($v['goodsType']==1){



                            $extraJson = json_decode($v['extraJson'],true);



                            foreach ($extraJson as  $ecard) {



                            	Db::name('goods_virtuals')->where('id',$ecard['cardId'])->update(['orderId'=>0,'orderNo'=>'','isUse'=>0]);



                            }



                            $counts = Db::name('goods_virtuals')->where(['dataFlag'=>1,'goodsId'=>$v['goodsId'],'isUse'=>0])->count();



                            Db::name('goods')->where('goodsId',$v['goodsId'])->update(['goodsStock'=>$counts]);



					    }else{



					    	//只有正常下单的才会修改库存的,其他的任何插件都不会修改库存



					    	if($order['orderCode'] == 'order'){



								//修改库存



								if($v['isSpec']>0){



							        Db::name('goods_specs')->where('id',$v['goodsSpecId'])->setInc('specStock',$v['goodsNum']);



								}



								Db::name('goods')->where('goodsId',$v['goodsId'])->setInc('goodsStock',$v['goodsNum']);



								//Db::name('goods')->where('goodsId',$v['goodsId'])->setDec('saleNum',$v['goodsNum']);//减少销量 mark 20180412







					        }



					    }



					}



					//新增订单日志



					$logOrder = [];



					$logOrder['orderId'] = $order['orderId'];



					$logOrder['orderStatus'] = -1;



					$logOrder['logContent'] = "订单长时间未支付,系统自动取消订单";



					$logOrder['logUserId'] = $order['userId'];



					$logOrder['logType'] = 0;



					$logOrder['logTime'] = date('Y-m-d H:i:s');



					Db::name('log_orders')->insert($logOrder);



                    //发送消息



	                $tpl = WSTMsgTemplates('ORDER_USER_PAY_TIMEOUT');



	                if( $tpl['tplContent']!='' && $tpl['status']=='1'){



	                    $find = ['${ORDER_NO}'];



	                    $replace = [$order['orderNo']];



	                    //发送一条用户信息



					    WSTSendMsg($order['userId'],str_replace($find,$replace,$tpl['tplContent']),['from'=>1,'dataId'=>$order['orderId']]);



	                }



                    $tpl = WSTMsgTemplates('ORDER_SHOP_PAY_TIMEOUT');



	                if( $tpl['tplContent']!='' && $tpl['status']=='1'){



	                    $find = ['${ORDER_NO}'];



	                    $replace = [$order['orderNo']];



	                    //发送一条商家信息







	                	$msg = array();



			            $msg["shopId"] = $shopId;



			            $msg["tplCode"] = $tpl["tplCode"];



			            $msg["msgType"] = 1;



			            $msg["content"] = str_replace($find,$replace,$tpl['tplContent']) ;



			            $msg["msgJson"] = ['from'=>1,'dataId'=>$order['orderId']];



			            model("common/MessageQueues")->add($msg);



	                }



	                //微信消息



		            if((int)WSTConf('CONF.wxenabled')==1){



		            	$params = [];



		                $params['ORDER_NO'] = $order['orderNo'];



	                    WSTWxMessage(['CODE'=>'WX_ORDER_USER_PAY_TIMEOUT','userId'=>$order['userId'],'URL'=>Url('wechat/orders/sellerorder','',true,true),'params'=>$params]);







		            	$msg = array();



		            	$tplCode = "WX_ORDER_SHOP_PAY_TIMEOUT";



						$msg["shopId"] = $shopId;



			            $msg["tplCode"] = $tplCode;



			            $msg["msgType"] = 4;



			            $msg["paramJson"] = ['CODE'=>$tplCode,'URL'=>Url('wechat/orders/index',['type'=>'abnormal'],true,true),'params'=>$params] ;



			            $msg["msgJson"] = "";



			            model("common/MessageQueues")->add($msg);



		            }



                }







		        Db::commit();



				return WSTReturn('操作成功',1);



	 		}catch (\Exception $e) {



	            Db::rollback();errLog($e);



	            return WSTReturn('操作失败',-1);



	        }



	 	}



	 	return WSTReturn('操作成功',1);



	}



    /**



	 * 自动好评



	 */



	public function autoAppraise(){



        $autoAppraiseDays = (int)WSTConf('CONF.autoAppraiseDays');



	 	$autoAppraiseDays = ($autoAppraiseDays>0)?$autoAppraiseDays:7;//避免有些客户没有设置值



	 	$lastDay = date("Y-m-d 00:00:00",strtotime("-".$autoAppraiseDays." days"));



	 	$rs = model('orders')->where("receiveTime<'".$lastDay."' and orderStatus=2 and dataFlag=1 and isAppraise=0")->field("orderId,userId,orderScore,shopId,orderNo")->select();



	 	if(!empty($rs)){



	 		$prefix = config('database.prefix');



	 		$orderIds = [];



	 		foreach ($rs as $okey => $order){



	 			$orderIds[] = $order->orderId;



	 		}



	 		Db::startTrans();



		    try{



		    	//提前锁定订单



		    	Db::name('orders')->where(['orderId'=>['in',$orderIds]])->update(['isAppraise'=>1,'isClosed'=>1]);



		    	foreach ($rs as $okey => $order){;



		    	    //获取订单相关的商品



		    	    $ordergoods = Db::name('order_goods')->where('orderId',$order->orderId)->field('goodsId,orderId,goodsSpecId')->select();



		    	    foreach($ordergoods as $goods){



		    	    	//增加订单评价



						$data = [];



						$data['userId'] = $order->userId;



						$data['goodsSpecId'] = (int)$goods['goodsSpecId'];



						$data['goodsId'] = $goods['goodsId'];



						$data['shopId'] = $order->shopId;



						$data['orderId'] = $goods['orderId'];



						$data['goodsScore'] = 5;



						$data['serviceScore'] = 5;



						$data['timeScore']= 5;



						$data['content'] = '自动好评';



						$data['createTime'] = date('Y-m-d H:i:s');



						Db::name('goods_appraises')->insert($data);



		    	    }



					//增加商品评分



					$updateSql = "update ".$prefix."goods_scores set 



						             totalScore=totalScore+15,



					             goodsScore=goodsScore+5,



					             serviceScore=serviceScore+5,



					             timeScore=timeScore+5,



					             totalUsers=totalUsers+1,goodsUsers=goodsUsers+1,serviceUsers=serviceUsers+1,timeUsers=timeUsers+1



					             where goodsId=".$goods['goodsId'];



					Db::execute($updateSql);



					//增加商品评价数



					Db::name('goods')->where('goodsId',$goods['goodsId'])->setInc('appraiseNum');



					//增加店铺评分



					$updateSql = "update ".$prefix."shop_scores set 



					             totalScore=totalScore+15,



					             goodsScore=goodsScore+5,



					             serviceScore=serviceScore+5,



					             timeScore=timeScore+5,



					             totalUsers=totalUsers+1,goodsUsers=goodsUsers+1,serviceUsers=serviceUsers+1,timeUsers=timeUsers+1



					             where shopId=".$order->shopId;



					Db::execute($updateSql);



					// 查询该订单是否已经完成评价,修改orders表中的isAppraise



					$ogRs = Db::name('order_goods')->alias('og')



					   			  ->join('__GOODS_APPRAISES__ ga','og.orderId=ga.orderId and og.goodsId=ga.goodsId and og.goodsSpecId=ga.goodsSpecId','left')



					              ->where('og.orderId',$order->orderId)->field('og.id,ga.id gid')->select();



					$isFinish = true;



					foreach ($ogRs as $vkey => $v){



						if($v['id']>0 && $v['gid']==''){



								$isFinish = false;



								break;



						}



					}



					//订单商品全部评价完则修改订单状态



					if($isFinish){



						if(WSTConf("CONF.isAppraisesScore")==1){



							$appraisesScore = (int)WSTConf('CONF.appraisesScore');



							if($appraisesScore>0){



								//给用户增加积分



								$score = [];



								$score['userId'] = $order->userId;



								$score['score'] = $appraisesScore;



								$score['dataSrc'] = 1;



								$score['dataId'] = $order->orderId;



								$score['dataRemarks'] = "评价订单【".$order->orderNo."】获得积分".$appraisesScore."个";



								$score['scoreType'] = 1;



								$score['createTime'] = date('Y-m-d H:i:s');



								Db::name('user_scores')->insert($score);



								// 增加用户积分



							    model('Users')->where("userId=".$order->userId)->update([



							    	'userScore'=>['exp','userScore+'.$appraisesScore],



							    	'userTotalScore'=>['exp','userTotalScore+'.$appraisesScore]



							    ]);



							}



						}



					}



				}



		        Db::commit();



				return WSTReturn('操作成功',1);



	 		}catch (\Exception $e) {



	            Db::rollback();errLog($e);



	            return WSTReturn('操作失败',-1);



	        }



	 	}



	 	return WSTReturn('操作成功',1);



	}



	/**



	 * 自动确认收货



	 */



	public function autoReceive(){



	 	$autoReceiveDays = (int)WSTConf('CONF.autoReceiveDays');



	 	$autoReceiveDays = ($autoReceiveDays>0)?$autoReceiveDays:10;//避免有些客户没有设置值



	 	$lastDay = date("Y-m-d 00:00:00",strtotime("-".$autoReceiveDays." days"));



		$rs= model('orders')->where("deliveryTime<'".$lastDay."' and orderStatus=1 and dataFlag=1")->field("orderId,orderNo,shopId,userId,shopId,orderScore,commissionFee")->select();



		//dump($rs);



		//循环是否有延时收获的



		$now_time = time();



		foreach($rs as $key=>$v){



			$delay_time = Db::name('order_delay')->where(['orderId'=>$v['orderId']])->value('delayTime');



			if($now_time < $delay_time){



				unset($rs[$key]);



			}



		}



	 	if(!empty($rs)){



	 		$prefix = config('database.prefix');



	 		Db::startTrans();



		    try{



		 		foreach ($rs as $key => $order){



		 			//结束订单状态



		 			$order->receiveTime = date('Y-m-d 00:00:00');



		 			$order->orderStatus = 2;



		 			$rsStatus = $order->save();



		 			if(false !== $rsStatus){



		 				hook('afterUserReceive',['orderId'=>$order->orderId]);







					    if(WSTConf('CONF.statementType')==1){



					    	//修改商家未计算订单数



						    $upSql = 'update '.$prefix.'shops set noSettledOrderNum=noSettledOrderNum+1,noSettledOrderFee=noSettledOrderFee-'.$order->commissionFee.' where shopId='.$order->shopId;



						    Db::execute($upSql);



					    }else{



						    //即时结算



						    model('common/Settlements')->speedySettlement($order->orderId);



					    }







	                    //新增订单日志



						$logOrder = [];



						$logOrder['orderId'] = $order->orderId;



						$logOrder['orderStatus'] = 2;



						$logOrder['logContent'] = "系统自动确认收货";



						$logOrder['logUserId'] = $order->userId;



						$logOrder['logType'] = 0;



						$logOrder['logTime'] = date('Y-m-d H:i:s');



						Db::name('log_orders')->insert($logOrder);







						//发送一条商家信息



						$tpl = WSTMsgTemplates('ORDER_ATUO_RECEIVE');



		                if( $tpl['tplContent']!='' && $tpl['status']=='1'){



		                    $find = ['${ORDER_NO}'];



		                    $replace = [$order['orderNo']];



		                	$msg = array();



				            $msg["shopId"] = $order->shopId;



				            $msg["tplCode"] = $tpl["tplCode"];



				            $msg["msgType"] = 1;



				            $msg["content"] = str_replace($find,$replace,$tpl['tplContent']) ;



				            $msg["msgJson"] = ['from'=>1,'dataId'=>$order->orderId];



				            model("common/MessageQueues")->add($msg);



		                }



						//给用户增加积分



						if(WSTConf("CONF.isOrderScore")==1){



							$score = [];



							$score['userId'] = $order->userId;



							$score['score'] = $order->orderScore;



							$score['dataSrc'] = 1;



							$score['dataId'] = $order->orderId;



							$score['dataRemarks'] = "交易订单【".$order->orderNo."】获得积分".$order->orderScore."个";



							$score['scoreType'] = 1;



							$score['createTime'] = date('Y-m-d H:i:s');



							model('UserScores')->save($score);



							// 增加用户积分



						    model('Users')->where("userId=".$order->userId)->setInc('userScore',$order->orderScore);



						    // 用户总积分



						    model('Users')->where("userId=".$order->userId)->setInc('userTotalScore',$order->orderScore);



						}



		 			}



	 			}



	 			Db::commit();



				return WSTReturn('操作成功',1);



	 		}catch (\Exception $e) {



	            Db::rollback();errLog($e);



	            return WSTReturn('操作失败',-1);



	        }



	 	}



	 	//echo 1;



	 	return WSTReturn('操作成功',1);



	}







	public function autoSendMsg(){



		$now = date("Y-m-d H:i:s");



		$list = Db::name("message_queues")->where(["sendStatus"=>0])->limit(500)->select();



		foreach ($list as $key => $msg) {



			Db::startTrans();



		    try{



				$msgParams = json_decode($msg["paramJson"],true);



				if($msg["msgType"]==2){//短信消息



					//门店暂无



				}else if($msg["msgType"]==3){//邮件消息



					//门店暂无



				}else if($msg["msgType"]==4){//微信消息



					WSTWxMessage($msgParams);



				}



				Db::name("message_queues")->where(["id"=>$msg["id"]])->update(["sendStatus"=>1,"sendTime"=>$now]);



				Db::commit();



			}catch (\Exception $e) {



	            Db::rollback();errLog($e);



	            return WSTReturn('操作失败',-1);



	        }



		}



		return WSTReturn('操作成功',1);



	}



}