审查视图

app/portal/controller/OrderController.php 38.0 KB
董瑞恩 authored
1 2 3 4 5 6 7 8 9 10 11 12 13
<?php
/**
 * Created by PhpStorm.
 * User: ruidiudiu
 * Date: 2018/11/24
 * Time: 8:54
 */

namespace app\portal\controller;


use cmf\controller\HomeBaseController;
use think\Db;
sgj authored
14
use think\Log;
董瑞恩 authored
15 16 17 18 19 20 21 22 23
use wxapp\pay\WeixinPay;

/**
 * @title 订单相关接口
 * @description 订单相关接口
 * @group 订单相关接口
 */
class OrderController extends HomeBaseController{
董瑞恩 authored
24 25 26 27 28 29 30 31 32 33 34 35
//    /**
//     * @title 生成订单
//     * @description 生成订单,加入开始时间和用户id
//     * @author 董瑞恩
//     * @url /portal/order/createOrder
//     * @method GET
//     *
//     * @param name:users_id type:String require:1 default:无 other: desc:用户id
//     * @param name:name type:String require:1 default:无 other: desc:设备名称
//     *
//     */
    public function createOrder($users_id,$name){
董瑞恩 authored
36 37
        $order=[
            'order_no' => cmf_get_order_sn(),
董瑞恩 authored
38
            'eq_name' => $name,
董瑞恩 authored
39 40 41 42 43 44
            'users_id' => $users_id,
            'start_time' => time(),
            'state' => 1
        ];
        try{
            Db::startTrans();
董瑞恩 authored
45
            Db::name('users')->where('id',$users_id)->update(['is_use'=>1]);
董瑞恩 authored
46 47 48
            Db::name('order')->insert($order);
        }catch (\Exception $exception){
            Db::rollback();
董瑞恩 authored
49 50
            $data=[
                'state'=>false,
董瑞恩 authored
51
                'message'=>$exception->getMessage()
董瑞恩 authored
52
            ];
董瑞恩 authored
53
            return $data;
董瑞恩 authored
54 55
        }
        Db::commit();
董瑞恩 authored
56 57 58 59 60
        $data=[
            'state'=>true,
            'order_no' => $order['order_no']
        ];
        return $data;
董瑞恩 authored
61 62
    }
董瑞恩 authored
63 64 65 66 67 68 69 70 71 72 73 74 75
//    /**
//     * @title 完成订单
//     * @description 订单完成,加入结束时间和结算费用,并调用微信统一下单
//     * @author 董瑞恩
//     * @url /portal/order/order
//     * @method GET
//     *
//     * @param name:users_id type:String require:1 default:无 other: desc:用户id
//     *
//     * @return data:返回用于调用支付的参数
//     */
    public function order($users_id,$name){
        $order= Db::name('order')->where(['users_id'=>$users_id,'state'=>1])->find();
潘浩文 authored
76
        $hospital=Db::name('equipment')->where(['name'=>$order['eq_name'],'is_delete'=>0])->find()['hospital'];
董瑞恩 authored
77
        $end_time=time();
潘浩文 authored
78
        $price=$this->getPrice($users_id,$order['start_time'],$end_time,$hospital);
董瑞恩 authored
79
        $time=ceil(($end_time-$order['start_time'])/3600);
董瑞恩 authored
80 81
        $data=[
            'end_time'=>$end_time,
董瑞恩 authored
82
            'time' => $time,
董瑞恩 authored
83 84 85
            'price' => $price,
            'state' => 2
        ];
潘浩文 authored
86 87
//        try{
//            Db::startTrans();
董瑞恩 authored
88
            Db::name('users')->where('id',$users_id)->update(['is_use'=>0]);
董瑞恩 authored
89 90
            Db::name('equipment')->where('name',$name)->update(['use'=>0]);
            Db::name('order')->where('order_no',$order['order_no'])->update($data);
潘浩文 authored
91
潘浩文 authored
92 93 94 95 96 97 98 99 100 101
//        }catch (\Exception $exception){
//            Db::rollback();
//            $data=[
//                'state'=>false,
//                'message'=>'数据库操作失败',
//                'error' =>$exception->getMessage()
//            ];
//            $this->apiResponse(200,'success',$data);
//        }
//        Db::commit();
董瑞恩 authored
102
        //调起支付
董瑞恩 authored
103
        if ($price==0){
董瑞恩 authored
104 105 106 107 108
            try{
                Db::name('order')->where(['order_no'=>$order['order_no']])->update(['state'=>3]);
            }catch (\Exception $exception){
                $this->apiResponse(301,'error:'.$exception->getMessage());
            }
董瑞恩 authored
109 110 111 112 113
            $data=[
                'state'=>2,
            ];
            $this->apiResponse(200,'success',$data);
        }
潘浩文 authored
114
//        $this->pay($order['order_no']);
潘浩文 authored
115
        $this->apiResponse(200,'success','订单进入待支付');
董瑞恩 authored
116 117
    }
董瑞恩 authored
118
sgj authored
119 120

sgj authored
121
    public function getPriceDRN($users_id,$start_time,$end_time){
董瑞恩 authored
122 123
        $cost=Db::name('cost')->where('id',1)->find();
        $interval = Db::name('interval')->where('id',1)->find();
董瑞恩 authored
124
        $is_free=Db::name('users')->where('id',$users_id)->find()['is_free'];
sgj authored
125
        //一小时免费状态
董瑞恩 authored
126
        $free=$cost['free'];
sgj authored
127
董瑞恩 authored
128 129 130
        //获取整天的价格
        $dayPrice=$this->getDayPrice();
董瑞恩 authored
131
        //用了多少天
董瑞恩 authored
132
        $day=floor(($end_time-$start_time)/86400);
董瑞恩 authored
133
        $dayPrice=$day*$dayPrice;
董瑞恩 authored
134 135
        //去掉整天的金额
        $new_start_time=$start_time+$day*86400;//时间戳
董瑞恩 authored
136
        $new_end_time= $end_time;//时间戳
董瑞恩 authored
137 138
        $hours_start_time=date('His',$new_start_time);
        $hours_end_time=date('His',$new_end_time);
董瑞恩 authored
139
董瑞恩 authored
140 141
        $stateTime=strtotime($interval['start_time']);
        $endTime=strtotime($interval['end_time']);
董瑞恩 authored
142
        //判断预设时间段是否跨天
董瑞恩 authored
143
        $price=0;
董瑞恩 authored
144
        if ($endTime < $stateTime){
董瑞恩 authored
145
            //设备使用时间段是否跨天(不跨天)
董瑞恩 authored
146
            if ($hours_end_time > $hours_start_time){
董瑞恩 authored
147 148 149 150
//                dump(date('Y-m-d H:i:s',$new_start_time));
//                dump(date('Y-m-d H:i:s',$new_end_time));
//                dump(date('Y-m-d H:i:s',$stateTime));
//                dump(date('Y-m-d H:i:s',$endTime));
董瑞恩 authored
151 152 153
                //在预设时间段左边并不与之重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && ($new_end_time > $new_start_time && $new_end_time < $endTime)){
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $interval['price']);
董瑞恩 authored
154
                }
董瑞恩 authored
155 156 157
                //与预设时间段的尾部重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && ($new_end_time > $endTime && $new_end_time < $stateTime)){
                    $price +=(ceil(($endTime-$new_start_time)/3600) * $interval['price'] +  ceil(($new_end_time-$endTime)/3600) * $cost['cost']);
董瑞恩 authored
158
                }
董瑞恩 authored
159 160 161 162 163
                //与预设时间段的头尾都重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && $new_end_time > $stateTime){
                    $price +=(ceil(($endTime-$new_start_time)/3600) * $interval['price'] +  ceil(($new_end_time-$stateTime)/3600) * $interval['price'] + ceil(($stateTime-$endTime)/3600) * $cost['cost']);
                }
                //不与预设时间段重合
董瑞恩 authored
164
                if (($new_start_time > $endTime && $new_start_time < $stateTime) && ($new_end_time > $new_start_time && $new_end_time < $stateTime)){
董瑞恩 authored
165 166
                    //存在首小时免费
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $cost['cost']);
董瑞恩 authored
167
                    if ($free==1 && $is_free==0){
董瑞恩 authored
168
                        $price-=$cost['cost'];
sgj authored
169
                        Db::name('users')->where('id',$users_id)->update(['is_free'=>1]);
sgj authored
170 171 172 173
                        Log::init([
                            'type'  =>  'File',
                            'path'  =>  APP_PATH.'logs/'
                        ]);
sgj authored
174
                        Log::write($price);
董瑞恩 authored
175
                    }
董瑞恩 authored
176
                }
董瑞恩 authored
177 178 179 180
                //与预设时间段的头部重合
                if (($new_start_time > $endTime && $new_start_time < $stateTime) && ($new_end_time > $stateTime && $new_end_time < strtotime('24:00:00'))){
                    //存在首小时免费
                    $price += (ceil(($stateTime-$new_start_time)/3600) * $cost['cost'] + ceil(($new_end_time-$stateTime)/3600) * $interval['price']);
董瑞恩 authored
181
                    if ($free==1 && $is_free==0){
董瑞恩 authored
182
                        $price-=$cost['cost'];
董瑞恩 authored
183
                        Db::name('users')->where('id',$users_id)->update(['is_free'=>1]);
董瑞恩 authored
184
                    }
董瑞恩 authored
185 186 187 188
                }
                //在预设时间段右边并不与之重合
                if (($new_start_time > $stateTime && $new_start_time < strtotime('24:00:00')) && ($new_end_time > $new_start_time && $new_end_time < strtotime('24:00:00'))){
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $interval['price']);
董瑞恩 authored
189
                }
董瑞恩 authored
190
            //设备使用时间段是否跨天(跨天:开始时间在昨天,结束时间在今天)
董瑞恩 authored
191
            }else{
董瑞恩 authored
192 193
                $YesterdayStateTime=$stateTime-86400;
                $YesterdayEndTime=$endTime-86400;
董瑞恩 authored
194
                //昨天预设结束前使用,今天预设结束前停止
董瑞恩 authored
195
                if(($new_start_time > (strtotime('00:00:00')-86400) && $new_start_time < $YesterdayEndTime) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){
sgj authored
196
董瑞恩 authored
197 198 199
                    $price+= ceil(($YesterdayEndTime-$new_start_time)/3600) * $interval['price']
                            +ceil(($YesterdayStateTime-$YesterdayEndTime)/3600) * $cost['cost']
                            +ceil(($new_end_time-$YesterdayStateTime)/3600) * $interval['price'];
董瑞恩 authored
200
                }
董瑞恩 authored
201
                //昨天预设开始前使用,今天预设结束前停止
董瑞恩 authored
202 203
                if(($new_start_time > $YesterdayEndTime && $new_start_time < $YesterdayStateTime) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){
                    //存在首小时免费
sgj authored
204
董瑞恩 authored
205 206
                    $price+= ceil(($YesterdayStateTime-$new_start_time)/3600) *  $cost['cost']
                            +ceil(($new_end_time-$YesterdayStateTime)/3600) * $interval['price'];
董瑞恩 authored
207
                    if ($free==1 && $is_free==0){
董瑞恩 authored
208
                        $price-=$cost['cost'];
董瑞恩 authored
209
                        Db::name('users')->where('id',$users_id)->update(['is_free'=>1]);
董瑞恩 authored
210
                    }
董瑞恩 authored
211 212
                }
                //昨天预设开始前使用,今天预设结束后停止
董瑞恩 authored
213 214
                if(($new_start_time > $YesterdayEndTime && $new_start_time < $YesterdayStateTime) && ($new_end_time > $endTime && $new_end_time < $stateTime)){
                    //存在首小时免费
sgj authored
215
董瑞恩 authored
216 217 218
                    $price+= ceil(($YesterdayStateTime-$new_start_time)/3600) *  $cost['cost']
                            +ceil(($endTime-$YesterdayStateTime)/3600) *  $interval['price']
                            +ceil(($new_end_time-$endTime)/3600) * $cost['cost'];
董瑞恩 authored
219
                    if ($free==1 && $is_free==0){
董瑞恩 authored
220
                        $price-=$cost['cost'];
董瑞恩 authored
221
                        Db::name('users')->where('id',$users_id)->update(['is_free'=>1]);
董瑞恩 authored
222
                    }
董瑞恩 authored
223
                }
董瑞恩 authored
224
                //昨天预设开始后使用,今天预设结束前停止
董瑞恩 authored
225
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){
sgj authored
226
董瑞恩 authored
227 228
                    $price+= ceil(($new_end_time-$new_start_time)/3600) *  $interval['price'];
                }
董瑞恩 authored
229
                //昨天预设开始后使用,今天预设结束后停止
董瑞恩 authored
230
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > $endTime && $new_end_time < $stateTime)){
sgj authored
231
董瑞恩 authored
232
                    $price+= ceil(($endTime-$new_start_time)/3600) *  $interval['price']
sgj authored
233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
                            +ceil(($new_end_time-$endTime)/3600) * $cost['cost'];
                }
                //昨天预设开始后使用,今天预设开始前停止
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > $stateTime && $new_end_time < ($new_start_time+86400))){

                    $price+= ceil(($endTime-$new_start_time)/3600) *  $interval['price']
                            +ceil(($stateTime-$endTime)/3600) * $cost['cost']
                            +ceil(($new_end_time-$stateTime)/3600) * $interval['price'];
                }
            }
        }
        if ($price > $cost['ceiling']){
            $price = $cost['ceiling'];
        }
        $numPrice = $dayPrice+$price;
        log::write($numPrice);
        return $numPrice;
    }

    /**
     * 只是获取价格信息不会进行操作
     * @param $users_id
     * @param $start_time
     * @param $end_time
     * @return float|int|mixed
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
sgj authored
263
    public function onlyGetPriceDRN($users_id,$start_time,$end_time){
sgj authored
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
        $cost=Db::name('cost')->where('id',1)->find();
        $interval = Db::name('interval')->where('id',1)->find();
        $is_free=Db::name('users')->where('id',$users_id)->find()['is_free'];
        //一小时免费状态
        $free=$cost['free'];

        //获取整天的价格
        $dayPrice=$this->getDayPrice();

        //用了多少天
        $day=floor(($end_time-$start_time)/86400);
        $dayPrice=$day*$dayPrice;
        //去掉整天的金额
        $new_start_time=$start_time+$day*86400;//时间戳
        $new_end_time= $end_time;//时间戳
        $hours_start_time=date('His',$new_start_time);
        $hours_end_time=date('His',$new_end_time);

        $stateTime=strtotime($interval['start_time']);
        $endTime=strtotime($interval['end_time']);
        //判断预设时间段是否跨天
        $price=0;
        if ($endTime < $stateTime){
            //设备使用时间段是否跨天(不跨天)
            if ($hours_end_time > $hours_start_time){
//                dump(date('Y-m-d H:i:s',$new_start_time));
//                dump(date('Y-m-d H:i:s',$new_end_time));
//                dump(date('Y-m-d H:i:s',$stateTime));
//                dump(date('Y-m-d H:i:s',$endTime));
                //在预设时间段左边并不与之重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && ($new_end_time > $new_start_time && $new_end_time < $endTime)){
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $interval['price']);
                }
                //与预设时间段的尾部重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && ($new_end_time > $endTime && $new_end_time < $stateTime)){
                    $price +=(ceil(($endTime-$new_start_time)/3600) * $interval['price'] +  ceil(($new_end_time-$endTime)/3600) * $cost['cost']);
                }
                //与预设时间段的头尾都重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && $new_end_time > $stateTime){
                    $price +=(ceil(($endTime-$new_start_time)/3600) * $interval['price'] +  ceil(($new_end_time-$stateTime)/3600) * $interval['price'] + ceil(($stateTime-$endTime)/3600) * $cost['cost']);
                }
                //不与预设时间段重合
                if (($new_start_time > $endTime && $new_start_time < $stateTime) && ($new_end_time > $new_start_time && $new_end_time < $stateTime)){
                    //存在首小时免费
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $cost['cost']);
                    if ($free==1 && $is_free==0){
                        $price-=$cost['cost'];
                        Log::init([
                            'type'  =>  'File',
                            'path'  =>  APP_PATH.'logs/'
                        ]);
                        Log::write($price);
                    }
                }
                //与预设时间段的头部重合
                if (($new_start_time > $endTime && $new_start_time < $stateTime) && ($new_end_time > $stateTime && $new_end_time < strtotime('24:00:00'))){
                    //存在首小时免费
                    $price += (ceil(($stateTime-$new_start_time)/3600) * $cost['cost'] + ceil(($new_end_time-$stateTime)/3600) * $interval['price']);
                    if ($free==1 && $is_free==0){
                        $price-=$cost['cost'];

                    }
                }
                //在预设时间段右边并不与之重合
                if (($new_start_time > $stateTime && $new_start_time < strtotime('24:00:00')) && ($new_end_time > $new_start_time && $new_end_time < strtotime('24:00:00'))){
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $interval['price']);
                }
            //设备使用时间段是否跨天(跨天:开始时间在昨天,结束时间在今天)
            }else{
                $YesterdayStateTime=$stateTime-86400;
                $YesterdayEndTime=$endTime-86400;
                //昨天预设结束前使用,今天预设结束前停止
                if(($new_start_time > (strtotime('00:00:00')-86400) && $new_start_time < $YesterdayEndTime) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){

                    $price+= ceil(($YesterdayEndTime-$new_start_time)/3600) * $interval['price']
                            +ceil(($YesterdayStateTime-$YesterdayEndTime)/3600) * $cost['cost']
                            +ceil(($new_end_time-$YesterdayStateTime)/3600) * $interval['price'];
                }
                //昨天预设开始前使用,今天预设结束前停止
                if(($new_start_time > $YesterdayEndTime && $new_start_time < $YesterdayStateTime) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){
                    //存在首小时免费

                    $price+= ceil(($YesterdayStateTime-$new_start_time)/3600) *  $cost['cost']
                            +ceil(($new_end_time-$YesterdayStateTime)/3600) * $interval['price'];
                    if ($free==1 && $is_free==0){
                        $price-=$cost['cost'];
                    }
                }
                //昨天预设开始前使用,今天预设结束后停止
                if(($new_start_time > $YesterdayEndTime && $new_start_time < $YesterdayStateTime) && ($new_end_time > $endTime && $new_end_time < $stateTime)){
                    //存在首小时免费

                    $price+= ceil(($YesterdayStateTime-$new_start_time)/3600) *  $cost['cost']
                            +ceil(($endTime-$YesterdayStateTime)/3600) *  $interval['price']
                            +ceil(($new_end_time-$endTime)/3600) * $cost['cost'];
                    if ($free==1 && $is_free==0){
                        $price-=$cost['cost'];
                    }
                }
                //昨天预设开始后使用,今天预设结束前停止
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){

                    $price+= ceil(($new_end_time-$new_start_time)/3600) *  $interval['price'];
                }
                //昨天预设开始后使用,今天预设结束后停止
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > $endTime && $new_end_time < $stateTime)){

                    $price+= ceil(($endTime-$new_start_time)/3600) *  $interval['price']
董瑞恩 authored
372 373
                            +ceil(($new_end_time-$endTime)/3600) * $cost['cost'];
                }
董瑞恩 authored
374
                //昨天预设开始后使用,今天预设开始前停止
董瑞恩 authored
375
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > $stateTime && $new_end_time < ($new_start_time+86400))){
sgj authored
376
董瑞恩 authored
377 378 379 380
                    $price+= ceil(($endTime-$new_start_time)/3600) *  $interval['price']
                            +ceil(($stateTime-$endTime)/3600) * $cost['cost']
                            +ceil(($new_end_time-$stateTime)/3600) * $interval['price'];
                }
董瑞恩 authored
381
            }
董瑞恩 authored
382
        }
董瑞恩 authored
383 384 385 386
        if ($price > $cost['ceiling']){
            $price = $cost['ceiling'];
        }
        $numPrice = $dayPrice+$price;
sgj authored
387
        log::write($numPrice);
董瑞恩 authored
388
        return $numPrice;
董瑞恩 authored
389 390
    }
董瑞恩 authored
391 392 393 394 395 396 397 398 399 400 401 402 403
    //获取整天的价格
    public function getDayPrice(){
        $cost=Db::name('cost')->where('id',1)->find();
        $interval = Db::name('interval')->where('id',1)->find();
        $stateTime=strtotime($interval['start_time']);
        $endTime=strtotime($interval['end_time']);
        //预设时间长度
        $time=($stateTime-$endTime)/3600;
        if ($endTime < $stateTime){
            $price=($time *  $cost['cost']) + ((24-$time) *  $interval['price']);
        }else{
            $price=($time *  $interval['price']) + ((24-$time) *  $cost['cost']);
        }
董瑞恩 authored
404 405 406 407

        if ($price > $cost['ceiling']){
            $price = $cost['ceiling'];
        }
董瑞恩 authored
408 409
        return $price;
    }
sgj authored
410
    /**
sgj authored
411
     * 宋国杰
sgj authored
412 413 414
     * @title 计算价格
     * @description 微信统一下单
     * @author 董瑞恩
sgj authored
415
     * @url /portal/order/getPriceTest
sgj authored
416 417 418 419 420 421 422
     * @method GET
     *
     * @param name:start_time type:String require:1 default:无 other: desc:起始时间
     * @param name:end_time type:String require:1 default:无 other: desc:结束时间
     *
     * @return data:返回用于调用支付的参数
     */
sgj authored
423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
    public function getPriceTest(){
        /*先获取跨越天数*/

            $users_id=1;
        $start_time=strtotime(input('start_time'));
        $end_time=strtotime(input('end_time'));
//        $end_time=$data['end_time']??time();
        $spend=$this->timediff($start_time,$end_time);
        if ($spend['min']!=0||$spend['sec']!=0){
            $spend['hour']++;
        }
        $interval = Db::name('interval')->where('id',1)->find();
        $cost=Db::name('cost')->where('id',1)->find();
        $is_free=Db::name('users')->where('id',$users_id)->find()['is_free'];
        $price=0;
        $time=$start_time;
        for ($i=0;$i<$spend['hour'];$i++){
            $price+=$this->getPriceByTime($time,$interval['end_time'],$interval['start_time'],$interval['price'],$cost['cost']);
            $time=$time+3600;
        }

        if ($price>$cost['ceiling']){
            $price=$cost['ceiling'];
            $free=0;
        }else{
            if ($cost['free']==1 && $is_free==0){
                $free=$this->getPriceByTime($start_time,$interval['end_time'],$interval['start_time'],$interval['price'],$cost['cost']);
//                 Db::name('users')->where('id',$users_id)->update(['is_free'=>1]);
            }else{
                $free=0;
            }
        }
        $allPirce=$cost['ceiling']*$spend['day']+$price-$free;
        return $allPirce;
    }


潘浩文 authored
461
  public function getPrice($users_id,$start_time,$end_time,$hospital){
sgj authored
462
        /*先获取跨越天数*/
sgj authored
463 464 465 466


//        $start_time=$data['start_time']??'1545084020';
//        $end_time=$data['end_time']??time();
sgj authored
467
        $spend=$this->timediff($start_time,$end_time);
sgj authored
468
        if ($spend['min']!=0||$spend['sec']!=0){
sgj authored
469 470
            $spend['hour']++;
        }
潘浩文 authored
471 472
        $interval = Db::name('interval')->where('hospital',$hospital)->find();
        $cost=Db::name('cost')->where('hospital',$hospital)->find();
sgj authored
473 474 475 476 477
        $is_free=Db::name('users')->where('id',$users_id)->find()['is_free'];
        $price=0;
        $time=$start_time;
        for ($i=0;$i<$spend['hour'];$i++){
              $price+=$this->getPriceByTime($time,$interval['end_time'],$interval['start_time'],$interval['price'],$cost['cost']);
sgj authored
478
             $time=$time+3600;
sgj authored
479
        }
董瑞恩 authored
480 481

sgj authored
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496
         if ($price>$cost['ceiling']){
             $price=$cost['ceiling'];
             $free=0;
         }else{
             if ($cost['free']==1 && $is_free==0){
                 $free=$this->getPriceByTime($start_time,$interval['end_time'],$interval['start_time'],$interval['price'],$cost['cost']);
                 Db::name('users')->where('id',$users_id)->update(['is_free'=>1]);
             }else{
                 $free=0;
             }
         }
         $allPirce=$cost['ceiling']*$spend['day']+$price-$free;
         return $allPirce;
    }
sgj authored
497 498 499 500 501
    /**
     * 宋国杰
     * @param $users_id
     * @param $start_time
     * @param $end_time
潘浩文 authored
502
     * @param $hospital
sgj authored
503 504 505 506 507
     * @return float|int|mixed
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
潘浩文 authored
508
    public function onlyGetPrice($users_id,$start_time,$end_time,$hospital){
sgj authored
509
        /*先获取跨越天数*/
sgj authored
510 511 512 513
//        $users_id='11';
//        $data=input();
//        $start_time=$data['start_time']??'1545084020';
//        $end_time=$data['end_time']??time();
sgj authored
514
        $spend=$this->timediff($start_time,$end_time);
sgj authored
515
        if ($spend['min']!=0||$spend['sec']!=0){
sgj authored
516 517
            $spend['hour']++;
        }
潘浩文 authored
518 519
        $interval = Db::name('interval')->where('hospital',$hospital)->find();
        $cost=Db::name('cost')->where('hospital',$hospital)->find();
sgj authored
520 521 522 523 524 525 526 527 528 529 530 531 532 533
        $is_free=Db::name('users')->where('id',$users_id)->find()['is_free'];
        $price=0;
        $time=$start_time;
        for ($i=0;$i<$spend['hour'];$i++){
              $price+=$this->getPriceByTime($time,$interval['end_time'],$interval['start_time'],$interval['price'],$cost['cost']);
            $time=$time+3600;
        }

         if ($price>$cost['ceiling']){
             $price=$cost['ceiling'];
             $free=0;
         }else{
             if ($cost['free']==1 && $is_free==0){
                 $free=$this->getPriceByTime($start_time,$interval['end_time'],$interval['start_time'],$interval['price'],$cost['cost']);
sgj authored
534
//                 Db::name('users')->where('id',$users_id)->update(['is_free'=>1]);
sgj authored
535 536 537 538 539 540 541 542 543
             }else{
                 $free=0;
             }
         }
         $allPirce=$cost['ceiling']*$spend['day']+$price-$free;
         return $allPirce;
    }

sgj authored
544 545 546 547 548 549 550 551 552
    /**
     * 获取当前时间点价格
     * @param $time 开始时间点
     * @param $first_time 一阶段价格
     * @param $second_time 二阶段价格
     * @param $cost1  一阶段金额单价
     * @param $cost2  二阶段金额单价
     * @return mixed
     */
sgj authored
553
        public function getPriceBytime($time,$first_time,$second_time,$cost1,$cost2){
sgj authored
554 555 556 557
            $date=date('Y-m-d',$time);
            $first_time=strtotime($date.' '.$first_time);
            $second_time=strtotime($date.' '.$second_time);
sgj authored
558 559 560 561 562 563 564 565 566 567 568 569 570 571
            if ($time<$first_time){
              return $cost1;
            }

            if ($time>$first_time && $time<$second_time){
                return $cost2;
            }

             if ($time>$second_time){
                 return $cost1;
             }

        }
潘浩文 authored
572
    /**
董瑞恩 authored
573 574 575 576 577 578
     * @title 统一下单
     * @description 微信统一下单
     * @author 董瑞恩
     * @url /portal/order/pay
     * @method GET
     * @param name:order_no type:String require:1 default:无 other: desc:订单号
董瑞恩 authored
579
     * @return data:返回用于调用支付的参数
董瑞恩 authored
580
     */
潘浩文 authored
581 582
    public function pay($order_no){
        $order = Db::name('order')->where(['order_no' => $order_no, 'state' => 2])->find();
潘浩文 authored
583 584 585 586
        if ($order['price']==0){
            Db::name('order')->where(['id'=>$order['id']])->update(['state'=>3]);
            $this->apiResponse(200, '订单结算成功');
        }
潘浩文 authored
587
        $user = Db::name('users')->where('id', $order['users_id'])->find();
潘浩文 authored
588
            $price = $order['price'] * 100;//订单价格
潘浩文 authored
589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611
        //微信直接支付
//        if ($param['type']==1) {
//            $body = '支付';
//            $notify_url = url('order/notify', '', '', true);//回调地址
//            $out_trade_no = $param['order_no'] . $this->create_noncestr(4);
//            $wxPay = new WeixinPay($user['open_id'], $out_trade_no, $body, $price, $notify_url);
//            $pay = $wxPay->pay();
//            if (isset($pay['package'])) {
//                $data = [
//                    'state' => 1,
//                    'pay' => $pay
//                ];
//                $this->apiResponse(200, 'success', $data);
//            } else {
//                $data = [
//                    'state' => 0,
//                    'message' => '统一下单失败',
//                    'error' => $pay
//                ];
//                $this->apiResponse(200, 'success', $data);
//            }
//        }
        //余额支付
潘浩文 authored
612
         if ($user['fee']<$order['price'] || $user['fee']==0){
潘浩文 authored
613
                Db::name('order')->where('id',$order['id'])->update(['group_money'=>($order['price']-$user['fee'])]);
潘浩文 authored
614 615
                $body = '支付';
                $notify_url = url('order/group', '', '', true);//回调地址
潘浩文 authored
616
                $out_trade_no = $order['order_no'] . $this->create_noncestr(4);
潘浩文 authored
617
                $wxPay = new WeixinPay($user['open_id'], $out_trade_no, $body, ($order['price']-$user['fee'])*100, $notify_url);
潘浩文 authored
618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633
                $pay = $wxPay->pay();
                if (isset($pay['package'])) {
                    $data = [
                        'state' => 1,
                        'pay' => $pay
                    ];
                    $this->apiResponse(200, 'success', $data);
                } else {
                    $data = [
                        'state' => 0,
                        'message' => '统一下单失败',
                        'error' => $pay
                    ];
                    $this->apiResponse(200, 'success', $data);
                }
            }
634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650
            
            if ($user['fee']>=$order['price']){
//                Db::startTrans();
//                try {
                    Db::name('users')->where('id', $user['id'])->setDec('fee',$order['price']);
                    Db::name('order')->where('id',$order['id'])->update(['state'=>3]);
                    Db::name('fee_log')->insert(['user_id'=>$user['id'],'fee'=>$order['price'],'type'=>2,'add_time'=>time()]);
                    // 提交事务
//                    Db::commit();
//                } catch (\Exception $e) {
//                   // 回滚事务
//                   Db::rollback();
//                    $this->apiResponse(400,'余额支付失败');
//               }
                $this->apiResponse(201, '余额支付成功');
            }
           
董瑞恩 authored
651
    }
sgj authored
652 653 654 655 656 657 658
    /**
     * @title 充值生成订单
     * @description
     * @author sgj
     * @url /portal/order/chargeOrder
     * @method GET
     *
sgj authored
659
     * @param name:fee type:String require:1 default:无 other: desc:金额
sgj authored
660 661 662 663 664 665 666 667 668 669
     * @param name:user_id  type:String require:1 default:无 other: desc:用户id
     *
     * @return order:订单号
     */
    public function chargeOrder(){
        $fee=input('fee');
        $user_id=input('user_id');
        if (empty($fee)||empty($user_id)){
            $this->error('信息错误!');
        }
sgj authored
670
        $insert['order_no']=date('YmdHis').rand(1000,9999);
sgj authored
671 672 673
        $insert['eq_name']='';
        $insert['start_time']=time();
        $insert['price']=$fee;
sgj authored
674
        $insert['state']=2;
sgj authored
675
        $insert['type']=2;
sgj authored
676
        $insert['users_id']=$user_id;
sgj authored
677
        $result=\db('order')->insert($insert);
潘浩文 authored
678
            if ($result!=1){
sgj authored
679
                $this->apiResponse(400,'下单失败!');
sgj authored
680
            }
潘浩文 authored
681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719
//        $order=Db::name('order')->where(['order_no'=>$order_no,'state'=>2])->find();
        $openId=Db::name('users')->where('id',$user_id)->find()['open_id'];

        $body='支付';
        $price=$insert['price']*100;//订单价格
        $notify_url=url('order/notify','','',true);//回调地址
        $out_trade_no=$insert['order_no'];
        $wxPay=new WeixinPay($openId,$out_trade_no,$body,$price,$notify_url);
        $pay=$wxPay->pay();
        if (isset($pay['package'])){
            $data=[
                'state'=>1,
                'pay'=>$pay
            ];
            $this->apiResponse(200,'success',$data);
        }else{
            $data=[
                'state'=>0,
                'message'=>'统一下单失败',
                'error' => $pay
            ];
            $this->apiResponse(200,'success',$data);
        }
    }

    /**
     * @title 充值
     * @description
     * @author sgj
     * @url /portal/order/chargeOrder
     * @method GET
     *
     * @param name:fee type:String require:1 default:无 other: desc:金额
     * @param name:user_id  type:String require:1 default:无 other: desc:用户id
     *
     * @return order:订单号
     */
    public function chargePay($order_no){
sgj authored
720
    }
董瑞恩 authored
721
sgj authored
722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747
    /**
     * @title 余额支付
     * @description
     * @author sgj
     * @url /portal/order/chargeOrder
     * @method GET
     *
     * @param name:fee type:String require:1 default:无 other: desc:金额
     * @param name:user_id  type:String require:1 default:无 other: desc:用户id
     *
     * @return order:订单号
     */
    public function payByBalance(){
        $order_no=input('order_no');
        $order_map['order_no']=$order_no;
        $order=\db('order')->where($order_map)->find();
        $user_map['id']=$order['users_id'];
        $user=\db('users')->where($user_map)->find();
        if ($order['price']>$user['fee']){
            $this->apiResponse('400','余额不足!');
        }
        $result=\db('users')->where($user_map)->setDec('fee',$order['price']);
        if ($result==1){
            $this->apiResponse('200','支付成功!');
        }
    }
sgj authored
748
董瑞恩 authored
749 750 751 752 753 754 755 756 757 758 759 760 761 762
    //支付回调接口
    public function notify(){
        $param = $this->request->param();
        if ($param == null) {
            $param = file_get_contents("php://input");
            if ($param == null) {
                $param = $GLOBALS['HTTP_RAW_POST_DATA'];
            }
        }
        $wxPay=new WeixinPay();
        $data = $wxPay->xmlToArray($param);
        $Sign = $data['sign'];
        //支付成功回调后变更订单状态
        $mySign = $wxPay->getSign($data);
潘浩文 authored
763 764
//        $order_no =substr($data['out_trade_no'], 0, -4);
        $order_no=$data['out_trade_no'];
sgj authored
765
        $order=\db('order')->where(['order_no'=>$order_no])->find();
sgj authored
766 767 768 769
        if ($order['state']==3){
            echo "SUCCESS";
            exit;
        }
sgj authored
770 771 772
        Log::record($order);
     Log::record($mySign);
        Log::record($data['return_code']);
董瑞恩 authored
773 774 775
        if ($Sign===$mySign && $data['return_code'] == 'SUCCESS') {
            try{
                Db::name('order')->where(['order_no'=>$order_no])->update(['state'=>3]);
sgj authored
776 777 778 779 780 781 782
                if ($order['type']==2){
                    /*用户加积分*/
                    \db('users')->where(['id'=>$order['users_id']])->setInc('fee',$order['price']);
                    /*记录信息*/
                    $log_insert['user_id']=$order['users_id'];
                    $log_insert['fee']=$order['price'];
                    $log_insert['type']=1;
sgj authored
783
                    $log_insert['add_time']=time();
sgj authored
784 785
                    \db('fee_log')->insert($log_insert);
                }
董瑞恩 authored
786 787 788 789 790 791 792 793 794 795 796
            }catch (\Exception $exception){
                $this->apiResponse(301,'error:'.$exception->getMessage());
            }
            return "<xml>
                      <return_code><![CDATA[SUCCESS]]></return_code>
                      <return_msg><![CDATA[OK]]></return_msg>
                    </xml>";

        }
    }
潘浩文 authored
797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812
    //组合支付回调
    public function group(){
        $param = $this->request->param();
        if ($param == null) {
            $param = file_get_contents("php://input");
            if ($param == null) {
                $param = $GLOBALS['HTTP_RAW_POST_DATA'];
            }
        }
        $wxPay=new WeixinPay();
        $data = $wxPay->xmlToArray($param);
        $Sign = $data['sign'];
        //支付成功回调后变更订单状态
        $mySign = $wxPay->getSign($data);
        $order_no =substr($data['out_trade_no'], 0, -4);
        $order=\db('order')->where(['order_no'=>$order_no])->find();
潘浩文 authored
813 814 815 816
        if ($order['state']==3){
            echo "SUCCESS";
            exit;
        }
潘浩文 authored
817 818 819
        if ($Sign===$mySign && $data['return_code'] == 'SUCCESS') {
            try{
                Db::name('order')->where(['order_no'=>$order_no])->update(['state'=>3]);
潘浩文 authored
820 821
                Db::name('fee_log')->insert(['user_id'=>$order['users_id'],'type'=>2,'fee'=>($order['price']-$order['group_money'])]);
                Db::name('users')->where('id',$order['users_id'])->setDec('fee',($order['price']-$order['group_money']));
潘浩文 authored
822 823 824 825 826 827 828 829 830
            }catch (\Exception $exception){
                $this->apiResponse(301,'error:'.$exception->getMessage());
            }
            return "<xml>
                      <return_code><![CDATA[SUCCESS]]></return_code>
                      <return_msg><![CDATA[OK]]></return_msg>
                    </xml>";
        }
    }
sgj authored
831
董瑞恩 authored
832 833 834 835 836 837 838 839 840
    function create_noncestr($length = 4){
        $chars = "0123456789";
        $str = "";
        for($i=0;$i<$length;$i++){
            $str.= substr($chars,mt_rand(0,strlen($chars)-1),1);
        }
        return $str;
    }
sgj authored
841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929
    /**
     * 计算两个时间戳戳相差时间
     * @param $begin_time
     * @param $end_time
     * @return array
     */
    public function timediff($begin_time,$end_time)
    {
        if ($begin_time < $end_time) {
            $starttime = $begin_time;
            $endtime = $end_time;
        } else {
            $starttime = $end_time;
            $endtime = $begin_time;
        }
        //计算天数
        $timediff = $endtime - $starttime;
        $days = intval($timediff / 86400);
        //计算小时数
        $remain = $timediff % 86400;
        $hours = intval($remain / 3600);
        //计算分钟数
        $remain = $remain % 3600;
        $mins = intval($remain / 60);
        //计算秒数
        $secs = $remain % 60;
        $res = array("day" => $days, "hour" => $hours, "min" => $mins, "sec" => $secs);
        return $res;
    }
    /**
     * 计算出不同收费时间段的使用时间
     * @param $start  开始时间
     * @param $end    结束时间
     * @param $first  早上计时点
     * @param $second  晚上计时点
     * @return mixed
     */
    public function getTimeOneDay($start,$end,$first,$second){
        $start_date=date('Y-m-d',$start);
        $first=$start_date.' '.$first;
        $first=strtotime($first);
        $second=$start_date.' '.$second;
        $second=strtotime($second);
//        dump($start);
//        dump($end);
//        dump($first);
//        dump($second);
        /*分为六种情况分别处理*/

        if ($end<=$first){
            $time['first']=$start-$end;
            $time['second']=0;
            return $time;
        }

        if ($start<=$first && $end<=$second && $end>$first){
            $time['first']=$first-$start;
            $time['second']=$end-$first;
            return $time;
        }

        if ($start<=$first && $end>$second){
            $time['first']=($first-$start)+($end-$second);
            $time['second']=$second-$first;
            return $time;
        }

        if ($start>$first && $start<=$second  && $end<=$second){
            $time['first']='0';
            $time['second']=$end-$start;
            return $time;
        }

        if ($start>$first && $start<=$second && $end>$second ){
            $time['first']=$second-$start;
            $time['second']=$end-$second;
            return $time;
        }

        if ($start>$second && $end>$second){
            $time['first']=$end-$start;
            $time['second']=0;
            return $time;
        }

    }


sgj authored
930 931

董瑞恩 authored
932
}