OrderController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: 思维定制
  5. * Date: 2018/9/5
  6. * Time: 18:03
  7. */
  8. namespace App\Http\Controllers\Web;
  9. use App\Models\MedicalComboModel;
  10. use App\Models\MedicalOrderModel;
  11. use App\Models\MedicalSingleCateModel;
  12. use App\Models\MedicalSingleProjectModel;
  13. use Illuminate\Support\Facades\Cache;
  14. use App\Models\MedicalSmsConfModel;
  15. use Illuminate\Http\Request;
  16. use Auth, Validator;
  17. use Carbon\Carbon;
  18. use GuzzleHttp\Client as GuzzleHttpClient;
  19. use GuzzleHttp\Exception\RequestException;
  20. class OrderController extends Controller
  21. {
  22. public $keySmsCodeExist = 'keySmsCodeExist';
  23. public $expireTimeExist = '';
  24. public $keySmsCode = 'keySmsCode';
  25. public $expireTime = '';
  26. public function index(Request $request)
  27. {
  28. if($request->method() == 'POST') {
  29. $data = $request->input();
  30. $key = $this->keySmsCode . $data['mobile'];
  31. $code = Cache::store('file')->get($key);
  32. if ($code !== $data['verify']) {
  33. $res['state'] = 0;
  34. $res['err'] = '验证码错误!';
  35. return $this->api($res);
  36. }
  37. $check = MedicalOrderModel::where('mobile',$data['mobile'])->first();
  38. if($check&&!empty($check->pdf)){
  39. $res['state'] = 2;
  40. $res['err'] = '您已提交';
  41. $res['redirect_url'] = url('web/Index/post').'?id='.$check->id;
  42. $res['download_url'] = url('web/Index/download').'?id='.$check->id;
  43. $res['pdf_url'] = $check->pdf;
  44. }elseif($check&&empty($check->pdf)){
  45. $res['state'] = 1;
  46. $res['err'] = '您已提交,请耐心等待结果';
  47. $res['redirect_url'] = url('web/Index/post').'?id='.$check->id;
  48. }elseif(!$check){
  49. $res['state'] = 1;
  50. $res['err'] = '请您先填写基本资料';
  51. $res['redirect_url'] = url('web/Index/sms').'?mob='.$data['mobile'];
  52. }
  53. return $this->api($res);
  54. }else{
  55. return view('web.order.sms');
  56. }
  57. }
  58. public function download(Request $request)
  59. {
  60. $id = $request->get('id');
  61. $check = MedicalOrderModel::find($id);
  62. if(!empty($check)&&!empty($check->pdf)){
  63. $url = str_replace(env('APP_URL'),public_path(),$check->pdf);
  64. return response()->download($url);
  65. }
  66. }
  67. public function sms(Request $request){
  68. $conf['nationality'] = '民族';
  69. $conf['name'] = '姓名';
  70. $conf['native_place'] = '籍贯';
  71. $conf['email'] = '邮件';
  72. $conf['work'] = '工作';
  73. $conf['address'] = '通讯地址';
  74. if($request->method() == 'POST') {
  75. $data = $request->input();
  76. foreach ($data as $key=>$val){
  77. if(empty($val)&&$key!='work'&&$key!='native_place'&&$key!='address'){
  78. $res['state'] = 0;
  79. $res['err'] = $conf[$key].'不能为空!';
  80. return $this->api($res);
  81. }
  82. }
  83. $style = explode(',',$data['sample_type']);
  84. $str = '';
  85. foreach ($style as $key=>$val){
  86. if($val==1){
  87. $str.= 'EDTA抗凝静脉血';
  88. }
  89. if($val==2){
  90. $str.= '口腔拭子';
  91. }
  92. if($val==3){
  93. $str.= '宫颈刷';
  94. }
  95. }
  96. //dd($style);
  97. $data['sample_type'] = $str;
  98. $query = MedicalOrderModel::create($data);
  99. if($query){
  100. $res['state'] = 1;
  101. $res['err'] = '提交成功';
  102. $res['redirect_url'] = url('web/Index/post').'?id='.$query->id;
  103. }else{
  104. $res['state'] = 0;
  105. $res['err'] ='网络错误';
  106. }
  107. // dd($res);
  108. return $this->api($res);
  109. }else{
  110. $mobile = $request->input();
  111. if(empty($mobile['mob'])){
  112. return redirect('web/Index/index');
  113. }
  114. return view('web.order.index',compact('mobile'));
  115. }
  116. }
  117. public function post(Request $request){
  118. if($request->method() == 'POST'){
  119. $data = $request->input();
  120. if(!empty($data['tcan'])){
  121. foreach ($data['tcan'] as $key_all=>$val_all){
  122. $tcan[] = MedicalComboModel::find($val_all);
  123. }
  124. $Update['combo'] = serialize($tcan);
  125. }
  126. if(!empty($data['xiangmu'])){
  127. foreach ($data['xiangmu'] as $key_single=>$val_single){
  128. $single[] = MedicalSingleProjectModel::find($val_single);
  129. }
  130. $Update['single'] = serialize($single);
  131. }
  132. $Update['total_price'] = $data['total_price'];
  133. $res = MedicalOrderModel::where('id',$data['id'])->update($Update);
  134. if($res){
  135. $q['msg'] = '提交成功';
  136. }else{
  137. $q['msg'] = '提交失败';
  138. }
  139. // dd($q);
  140. return view('web.order.complete',compact('q'));
  141. }
  142. $id = $request->get('id');
  143. if(empty($id)){
  144. return redirect('web/Index/index');
  145. }
  146. $cat = MedicalSingleCateModel::all();
  147. $data_single=array();
  148. foreach ($cat as $key=>$val){
  149. $projects = MedicalSingleProjectModel::where('cate_id',$val['id'])->get();
  150. $project = array();
  151. foreach($projects as $k=>$v){
  152. $project[]=(object)[
  153. 'id'=>$v['id'],
  154. 'name'=>$v['name'],
  155. 'price'=>$v['oldPrice'],
  156. 'youhui'=>$v['realPrice']
  157. ];
  158. }
  159. $data_single[]=(object)[
  160. 'id'=>$val['id'],
  161. 'name'=>$val['name'],
  162. 'data'=>$project
  163. ];
  164. }
  165. $data_combos = MedicalComboModel::all();
  166. $data_combo = array();
  167. foreach ($data_combos as $k_c=>$v_c){
  168. $data_combo[]=(object)[
  169. 'id'=>$v_c['id'],
  170. 'name'=>$v_c['name'],
  171. 'neirong'=>$v_c['content'],
  172. 'jiage'=>$v_c['oldPrice'],
  173. 'youhui'=>$v_c['realPrice']
  174. ];
  175. }
  176. $data_single = json_encode($data_single);
  177. $data_combo = json_encode($data_combo);
  178. $checkorder = MedicalOrderModel::find($id);
  179. $combos=array();
  180. $singles=array();
  181. if($checkorder&&(!empty($checkorder['single'])||!empty($checkorder['combo']))){
  182. if(!empty($checkorder['single'])){
  183. $single = unserialize($checkorder['single']);
  184. foreach ($single as $k_s=>$v_s){
  185. $singles[]=(object)[
  186. 'id'=>$v_s['id'],
  187. 'cate_id'=> $v_s['cate_id'],
  188. 'name'=>$v_s['name'],
  189. 'price'=>$v_s['oldPrice'],
  190. 'youhui'=>$v_s['realPrice']
  191. ];
  192. }
  193. }
  194. if(!empty($checkorder['combo'])){
  195. $combo = unserialize($checkorder['combo']);
  196. foreach ($combo as $k_c=> $v_c){
  197. $combos[]=(object)[
  198. 'id'=>$v_c['id'],
  199. 'name'=>$v_c['name'],
  200. 'neirong'=>$v_c['content'],
  201. 'jiage'=>$v_c['oldPrice'],
  202. 'youhui'=>$v_c['realPrice']
  203. ];
  204. }
  205. }
  206. $data_single_check = json_encode($singles);
  207. $data_combo_check = json_encode($combos);
  208. //dd($data_single);
  209. return view('web.order.result',compact('data_single_check','data_combo_check','data_single','data_combo','id'));
  210. }elseif(!$checkorder){
  211. return redirect('web/Index/index');
  212. }
  213. // dd($data_single);
  214. return view('web.order.post',compact('data_single','data_combo','id'));
  215. }
  216. /**
  217. ***聚合数据
  218. ***DATE:2015-05-25
  219. */
  220. public function smsJuHe(Request $request)
  221. {
  222. $data = $request->input();
  223. $conf = MedicalSmsConfModel::find(1);
  224. header('content-type:text/html;charset=utf-8');
  225. $sendUrl = 'http://v.juhe.cn/sms/send'; //短信接口的URL
  226. $num = rand(1000,9999);
  227. Cache::put($data['mobile'].'post',$num,10000);
  228. $smsConf = array(
  229. 'key' => $conf->apikey, //您申请的APPKEY
  230. 'mobile' => $data['mobile'], //接受短信的用户手机号码
  231. 'tpl_id' => $conf->temp_id, //您申请的短信模板ID,根据实际情况修改
  232. 'tpl_value' =>'#code#=1234&#company#='.$conf->sign //您设置的模板变量,根据实际情况修改
  233. );
  234. $content = $this->juhecurl($sendUrl,$smsConf,1); //请求发送短信
  235. //$content=false;
  236. if($content){
  237. $result = json_decode($content,true);
  238. $error_code = $result['error_code'];
  239. if($error_code == 0){
  240. //状态为0,说明短信发送成功
  241. $res['state'] = 1;
  242. }else{
  243. //状态非0,说明失败
  244. $msg = $result['reason'];
  245. $res['err'] = "短信发送失败(".$error_code."):".$msg;
  246. $res['state'] = 0;
  247. }
  248. }else{
  249. $res['state'] = 0;
  250. $res['err'] = '发送失败';
  251. }
  252. return $this->api($res);
  253. }
  254. /*
  255. * 获取验证码
  256. */
  257. public function getCode(Request $request)
  258. {
  259. //对手机号码进行验证
  260. $validator = Validator::make($request->all(),
  261. [
  262. 'mobile' => 'required|regex:/^1[34578]\d{9}$/',
  263. ],
  264. [
  265. 'mobile.required' => '手机号码必填',
  266. 'mobile.regex' => '手机号码格式不正确',
  267. ]
  268. );
  269. if ($validator->fails()) {
  270. $msgs = $validator->errors()->first();
  271. return json_encode(['code' => 0, 'msg' => $msgs]);
  272. }
  273. $phone = $request->get('mobile');
  274. $ipkeyexist = $this->keySmsCodeExist . $_SERVER["REMOTE_ADDR"] . Carbon::now()->toDateString();
  275. $times = Cache::store('file')->get($ipkeyexist);
  276. if($times>10) {
  277. return json_encode(['state' => 0, 'msg' => '一天内一个ip最多发送十次验证码']);
  278. }else{
  279. $times++;
  280. Cache::store('file')->put($ipkeyexist, $times, 60 * 24);
  281. }
  282. $keyexist = $this->keySmsCodeExist . $phone . Carbon::now()->toDateString();;
  283. $times = Cache::store('file')->get($keyexist);
  284. if($times>8) {
  285. return json_encode(['state' => 0, 'msg' => '一天内最多发送八次验证码']);
  286. }else{
  287. $times++;
  288. Cache::store('file')->put($keyexist, $times, 60 * 24);
  289. }
  290. $verify_code = (string)mt_rand(1000, 9999);
  291. $key = $this->keySmsCode . $phone;
  292. Cache::store('file')->put($key, $verify_code, 6000);
  293. $msg = '【精准医疗】您的验证码是:' . $verify_code;
  294. $result = $this->sendSms($msg, $phone);
  295. // \Log::info($msg . " res:" . $result);
  296. if (!$result) return json_encode(['state' => 0, 'msg' => '短信发送失败']);
  297. return json_encode(['state' => 1, 'msg' => '短信发送成功']);
  298. }
  299. /*
  300. * 发送短信
  301. */
  302. public function sendSms($msg, $mobile) {
  303. $url = "http://api.106txt.com/smsGBK.aspx?";
  304. $account = "swufecredit2017";
  305. $password = "mask751002";
  306. $password = strtoupper(md5($password));
  307. $gwid = 53;
  308. $message = iconv("UTF-8", "GB2312", $msg);
  309. try {
  310. $client = new GuzzleHttpClient();
  311. $data = [
  312. 'action' => 'Send',
  313. 'username' => $account,
  314. 'password' => $password,
  315. 'gwid' => $gwid,
  316. 'mobile' => $mobile,
  317. 'message' => $message,
  318. ];
  319. $apiRequest = $client->post($url, [
  320. 'form_params' => $data,
  321. ]);
  322. $resp = $apiRequest->getBody()->getContents();
  323. $res = iconv("GB2312", "UTF-8", $resp);
  324. $re = json_decode($res, true);
  325. \Log::info("发送短信 到手机:$mobile 内容:$msg RESULT:".$re['RESULT']);
  326. if (trim($re['CODE']) == '1') {
  327. return true;
  328. }
  329. } catch (RequestException $re) {
  330. \Log::info("发送短信错误:".$re->getMessage());
  331. return false;
  332. }
  333. return false;
  334. }
  335. /**
  336. * 请求接口返回内容
  337. * @param string $url [请求的URL地址]
  338. * @param string $params [请求的参数]
  339. * @param int $ipost [是否采用POST形式]
  340. * @return string
  341. */
  342. function juhecurl($url,$params=false,$ispost=0){
  343. $httpInfo = array();
  344. $ch = curl_init();
  345. curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
  346. curl_setopt( $ch, CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22' );
  347. curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 30 );
  348. curl_setopt( $ch, CURLOPT_TIMEOUT , 30);
  349. curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );
  350. if( $ispost )
  351. {
  352. curl_setopt( $ch , CURLOPT_POST , true );
  353. curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );
  354. curl_setopt( $ch , CURLOPT_URL , $url );
  355. }
  356. else
  357. {
  358. if($params){
  359. curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );
  360. }else{
  361. curl_setopt( $ch , CURLOPT_URL , $url);
  362. }
  363. }
  364. $response = curl_exec( $ch );
  365. if ($response === FALSE) {
  366. //echo "cURL Error: " . curl_error($ch);
  367. return false;
  368. }
  369. $httpCode = curl_getinfo( $ch , CURLINFO_HTTP_CODE );
  370. $httpInfo = array_merge( $httpInfo , curl_getinfo( $ch ) );
  371. curl_close( $ch );
  372. return $response;
  373. }
  374. }