作者 郭文星

123

@@ -51,17 +51,17 @@ class Car extends Backend @@ -51,17 +51,17 @@ class Car extends Backend
51 list($where, $sort, $order, $offset, $limit) = $this->buildparams(); 51 list($where, $sort, $order, $offset, $limit) = $this->buildparams();
52 52
53 $list = $this->model 53 $list = $this->model
54 - ->with(['route','driver']) 54 + ->with(['driver','route'])
55 ->where($where) 55 ->where($where)
56 ->order($sort, $order) 56 ->order($sort, $order)
57 ->paginate($limit); 57 ->paginate($limit);
58 58
59 foreach ($list as $row) { 59 foreach ($list as $row) {
60 - $row->visible(['id','car_model','reservation_time','license_plate','seat','colour','driver_license_img','driving_license_img','start_time','create_time']);  
61 - $row->visible(['route']);  
62 - $row->getRelation('route')->visible(['name']); 60 + $row->visible(['id','car_model','license_plate','seat','colour','driver_license_img','driving_license_img','reservation_time','start_time','create_time']);
63 $row->visible(['driver']); 61 $row->visible(['driver']);
64 $row->getRelation('driver')->visible(['name']); 62 $row->getRelation('driver')->visible(['name']);
  63 + $row->visible(['route']);
  64 + $row->getRelation('route')->visible(['name']);
65 } 65 }
66 66
67 $result = array("total" => $list->total(), "rows" => $list->items()); 67 $result = array("total" => $list->total(), "rows" => $list->items());
@@ -13,6 +13,6 @@ return [ @@ -13,6 +13,6 @@ return [
13 'Reservation_time' => '预约时间', 13 'Reservation_time' => '预约时间',
14 'Start_time' => '发车时间', 14 'Start_time' => '发车时间',
15 'Create_time' => '创建时间', 15 'Create_time' => '创建时间',
16 - 'Route.name' => '线路名称',  
17 - 'Driver.name' => '司机名称' 16 + 'Driver.name' => '司机名称',
  17 + 'Route.name' => '线路名称'
18 ]; 18 ];
@@ -25,6 +25,7 @@ class Car extends Model @@ -25,6 +25,7 @@ class Car extends Model
25 25
26 // 追加属性 26 // 追加属性
27 protected $append = [ 27 protected $append = [
  28 + 'reservation_time_text',
28 'start_time_text', 29 'start_time_text',
29 'create_time_text' 30 'create_time_text'
30 ]; 31 ];
@@ -34,6 +35,13 @@ class Car extends Model @@ -34,6 +35,13 @@ class Car extends Model
34 35
35 36
36 37
  38 + public function getReservationTimeTextAttr($value, $data)
  39 + {
  40 + $value = $value ? $value : (isset($data['reservation_time']) ? $data['reservation_time'] : '');
  41 + return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
  42 + }
  43 +
  44 +
37 public function getStartTimeTextAttr($value, $data) 45 public function getStartTimeTextAttr($value, $data)
38 { 46 {
39 $value = $value ? $value : (isset($data['start_time']) ? $data['start_time'] : ''); 47 $value = $value ? $value : (isset($data['start_time']) ? $data['start_time'] : '');
@@ -47,6 +55,11 @@ class Car extends Model @@ -47,6 +55,11 @@ class Car extends Model
47 return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value; 55 return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
48 } 56 }
49 57
  58 + protected function setReservationTimeAttr($value)
  59 + {
  60 + return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
  61 + }
  62 +
50 protected function setStartTimeAttr($value) 63 protected function setStartTimeAttr($value)
51 { 64 {
52 return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value); 65 return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
@@ -58,14 +71,14 @@ class Car extends Model @@ -58,14 +71,14 @@ class Car extends Model
58 } 71 }
59 72
60 73
61 - public function route() 74 + public function driver()
62 { 75 {
63 - return $this->belongsTo('Route', 'route_id', 'id', [], 'LEFT')->setEagerlyType(0); 76 + return $this->belongsTo('Driver', 'driver_id', 'id', [], 'LEFT')->setEagerlyType(0);
64 } 77 }
65 78
66 79
67 - public function driver() 80 + public function route()
68 { 81 {
69 - return $this->belongsTo('Driver', 'driver_id', 'id', [], 'LEFT')->setEagerlyType(0); 82 + return $this->belongsTo('Route', 'route_id', 'id', [], 'LEFT')->setEagerlyType(0);
70 } 83 }
71 } 84 }
@@ -39,29 +39,13 @@ @@ -39,29 +39,13 @@
39 <div class="form-group"> 39 <div class="form-group">
40 <label class="control-label col-xs-12 col-sm-2">{:__('Driver_license_img')}:</label> 40 <label class="control-label col-xs-12 col-sm-2">{:__('Driver_license_img')}:</label>
41 <div class="col-xs-12 col-sm-8"> 41 <div class="col-xs-12 col-sm-8">
42 - <div class="input-group">  
43 - <input id="c-driver_license_img" class="form-control" size="50" name="row[driver_license_img]" type="text">  
44 - <div class="input-group-addon no-border no-padding">  
45 - <span><button type="button" id="faupload-driver_license_img" class="btn btn-danger faupload" data-input-id="c-driver_license_img" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-driver_license_img"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>  
46 - <span><button type="button" id="fachoose-driver_license_img" class="btn btn-primary fachoose" data-input-id="c-driver_license_img" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>  
47 - </div>  
48 - <span class="msg-box n-right" for="c-driver_license_img"></span>  
49 - </div>  
50 - <ul class="row list-inline faupload-preview" id="p-driver_license_img"></ul> 42 + <input id="c-driver_license_img" class="form-control" name="row[driver_license_img]" type="text">
51 </div> 43 </div>
52 </div> 44 </div>
53 <div class="form-group"> 45 <div class="form-group">
54 <label class="control-label col-xs-12 col-sm-2">{:__('Driving_license_img')}:</label> 46 <label class="control-label col-xs-12 col-sm-2">{:__('Driving_license_img')}:</label>
55 <div class="col-xs-12 col-sm-8"> 47 <div class="col-xs-12 col-sm-8">
56 - <div class="input-group">  
57 - <input id="c-driving_license_img" class="form-control" size="50" name="row[driving_license_img]" type="text">  
58 - <div class="input-group-addon no-border no-padding">  
59 - <span><button type="button" id="faupload-driving_license_img" class="btn btn-danger faupload" data-input-id="c-driving_license_img" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-driving_license_img"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>  
60 - <span><button type="button" id="fachoose-driving_license_img" class="btn btn-primary fachoose" data-input-id="c-driving_license_img" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>  
61 - </div>  
62 - <span class="msg-box n-right" for="c-driving_license_img"></span>  
63 - </div>  
64 - <ul class="row list-inline faupload-preview" id="p-driving_license_img"></ul> 48 + <input id="c-driving_license_img" class="form-control" name="row[driving_license_img]" type="text">
65 </div> 49 </div>
66 </div> 50 </div>
67 <div class="form-group"> 51 <div class="form-group">
@@ -73,7 +57,7 @@ @@ -73,7 +57,7 @@
73 <div class="form-group"> 57 <div class="form-group">
74 <label class="control-label col-xs-12 col-sm-2">{:__('Start_time')}:</label> 58 <label class="control-label col-xs-12 col-sm-2">{:__('Start_time')}:</label>
75 <div class="col-xs-12 col-sm-8"> 59 <div class="col-xs-12 col-sm-8">
76 - <input id="c-start_time" class="form-control datetimepicker" data-date-format="HH:mm" data-use-current="true" name="row[start_time]" type="text" value="{:date('H:i')}"> 60 + <input id="c-start_time" class="form-control datetimepicker" data-date-format=" HH:mm" data-use-current="true" name="row[start_time]" type="text" value="{:date('H:i')}">
77 </div> 61 </div>
78 </div> 62 </div>
79 <div class="form-group"> 63 <div class="form-group">
@@ -39,29 +39,13 @@ @@ -39,29 +39,13 @@
39 <div class="form-group"> 39 <div class="form-group">
40 <label class="control-label col-xs-12 col-sm-2">{:__('Driver_license_img')}:</label> 40 <label class="control-label col-xs-12 col-sm-2">{:__('Driver_license_img')}:</label>
41 <div class="col-xs-12 col-sm-8"> 41 <div class="col-xs-12 col-sm-8">
42 - <div class="input-group">  
43 - <input id="c-driver_license_img" class="form-control" size="50" name="row[driver_license_img]" type="text" value="{$row.driver_license_img|htmlentities}">  
44 - <div class="input-group-addon no-border no-padding">  
45 - <span><button type="button" id="faupload-driver_license_img" class="btn btn-danger faupload" data-input-id="c-driver_license_img" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-driver_license_img"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>  
46 - <span><button type="button" id="fachoose-driver_license_img" class="btn btn-primary fachoose" data-input-id="c-driver_license_img" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>  
47 - </div>  
48 - <span class="msg-box n-right" for="c-driver_license_img"></span>  
49 - </div>  
50 - <ul class="row list-inline faupload-preview" id="p-driver_license_img"></ul> 42 + <input id="c-driver_license_img" class="form-control" name="row[driver_license_img]" type="text" value="{$row.driver_license_img|htmlentities}">
51 </div> 43 </div>
52 </div> 44 </div>
53 <div class="form-group"> 45 <div class="form-group">
54 <label class="control-label col-xs-12 col-sm-2">{:__('Driving_license_img')}:</label> 46 <label class="control-label col-xs-12 col-sm-2">{:__('Driving_license_img')}:</label>
55 <div class="col-xs-12 col-sm-8"> 47 <div class="col-xs-12 col-sm-8">
56 - <div class="input-group">  
57 - <input id="c-driving_license_img" class="form-control" size="50" name="row[driving_license_img]" type="text" value="{$row.driving_license_img|htmlentities}">  
58 - <div class="input-group-addon no-border no-padding">  
59 - <span><button type="button" id="faupload-driving_license_img" class="btn btn-danger faupload" data-input-id="c-driving_license_img" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" data-preview-id="p-driving_license_img"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>  
60 - <span><button type="button" id="fachoose-driving_license_img" class="btn btn-primary fachoose" data-input-id="c-driving_license_img" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>  
61 - </div>  
62 - <span class="msg-box n-right" for="c-driving_license_img"></span>  
63 - </div>  
64 - <ul class="row list-inline faupload-preview" id="p-driving_license_img"></ul> 48 + <input id="c-driving_license_img" class="form-control" name="row[driving_license_img]" type="text" value="{$row.driving_license_img|htmlentities}">
65 </div> 49 </div>
66 </div> 50 </div>
67 <div class="form-group"> 51 <div class="form-group">
@@ -262,4 +262,55 @@ class Car extends Base @@ -262,4 +262,55 @@ class Car extends Base
262 return $this->success($content); 262 return $this->success($content);
263 } 263 }
264 264
  265 + /**
  266 + * 退款接口
  267 + * @param $id
  268 + * @return void
  269 + * @throws \think\Exception
  270 + * @throws \think\db\exception\DataNotFoundException
  271 + * @throws \think\db\exception\ModelNotFoundException
  272 + * @throws \think\exception\DbException
  273 + * @throws \think\exception\PDOException
  274 + */
  275 + public function refund($id){
  276 + $id=$this->request->param("id");
  277 + //查询订单
  278 + $order=Db::name("order")->where("id",$id)->find();
  279 + if($order['is_pay']==1){
  280 + $this->error("该订单无法退款");
  281 + //拼接退款参数
  282 + $pay_fee = $order['price'];
  283 + $refund_fee = $pay_fee;
  284 + $order_sn = $order['order_no'];
  285 + $pay_type = 'wechat';
  286 + $reason = '订单退款';
  287 + $notifyurl = 'https://wyc.tenyes.cn/api/index/refundNotifyx';//退款回调地址
  288 + //直接调用退款方法传参即可
  289 + $response = \addons\epay\library\Service::submitRefund($pay_fee, $refund_fee, $order_sn, getRefundSn($order['user_id']), $pay_type, $reason, $notifyurl, '', 'miniapp');
  290 + $response = json_encode($response);
  291 + $response = json_decode($response, true);
  292 + file_put_contents("pcl_repay_v2.log", date("Y-m-d H:i:s") . "::" . json_encode($response, JSON_UNESCAPED_UNICODE) . PHP_EOL, FILE_APPEND);
  293 + if (!empty($response['return_code'] == 'SUCCESS')) {
  294 + //退款成功,更新退款记录
  295 + $relogs['update_time'] = time();
  296 + $relogs['is_pay'] = 3;
  297 + $relogs['out_refund_no'] = $response['out_refund_no'];
  298 + $relogs['refund_time'] = time();
  299 + $rs2 = Db::name('order')
  300 + ->where(['id' => $order['id']])
  301 + ->update($relogs);
  302 + } else {
  303 + $this->error('退款失败');
  304 + }
  305 + $this->success("退款成功");
  306 + }else{
  307 + $relogs['is_pay'] = 4;
  308 + $rs2 = Db::name('order')
  309 + ->where(['id' => $order['id']])
  310 + ->update($relogs);
  311 + $this->success("取消成功");
  312 + }
  313 + }
  314 +
  315 +
265 } 316 }
@@ -34,10 +34,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin @@ -34,10 +34,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
34 {field: 'colour', title: __('Colour'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content}, 34 {field: 'colour', title: __('Colour'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
35 {field: 'driver_license_img', title: __('Driver_license_img'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images}, 35 {field: 'driver_license_img', title: __('Driver_license_img'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images},
36 {field: 'driving_license_img', title: __('Driving_license_img'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images}, 36 {field: 'driving_license_img', title: __('Driving_license_img'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images},
37 - {field: 'route.name', title: __('Route.name'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},  
38 - {field: 'driver.name', title: __('Driver.name'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},  
39 {field: 'reservation_time', title: __('Reservation_time'),operate:'RANGE', addclass:'datetimerange',datetimeFormat:"HH:mm", autocomplete:false, formatter: Table.api.formatter.datetime}, 37 {field: 'reservation_time', title: __('Reservation_time'),operate:'RANGE', addclass:'datetimerange',datetimeFormat:"HH:mm", autocomplete:false, formatter: Table.api.formatter.datetime},
40 {field: 'start_time', title: __('Start_time'),operate:'RANGE', addclass:'datetimerange',datetimeFormat:"HH:mm", autocomplete:false, formatter: Table.api.formatter.datetime}, 38 {field: 'start_time', title: __('Start_time'),operate:'RANGE', addclass:'datetimerange',datetimeFormat:"HH:mm", autocomplete:false, formatter: Table.api.formatter.datetime},
  39 + {field: 'create_time', title: __('Create_time'),operate:'RANGE', addclass:'datetimerange',datetimeFormat:"HH:mm", autocomplete:false, formatter: Table.api.formatter.datetime},
  40 + {field: 'driver.name', title: __('Driver.name'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
  41 + {field: 'route.name', title: __('Route.name'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
41 {field: 'create_time', title: __('Create_time'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime}, 42 {field: 'create_time', title: __('Create_time'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
42 {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate} 43 {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
43 ] 44 ]