xxxrrrdddd 3 years ago
parent
commit
097814ed50

+ 1 - 0
application/admin/config.php

@@ -5,4 +5,5 @@ return [
     'url_common_param'       => true,
     'url_html_suffix'        => '',
     'controller_auto_search' => true,
+    'exception_handle'=>app\api\library\ExceptionHandle::class,
 ];

+ 34 - 0
application/admin/controller/UserOrder.php

@@ -5,6 +5,7 @@ namespace app\admin\controller;
 use app\common\controller\Backend;
 use app\admin\model\UserOrder as UO;
 use app\common\model\SenderOrder;
+use think\Db;
 
 /**
  * 订单管理
@@ -92,4 +93,37 @@ class UserOrder extends Backend
         $this->assign('order',$order);
         return view();
     }
+    public function remark($ids){
+        $order=$this->model->find($ids);
+        if (!$order){
+            $this->error('信息不存在');
+        }
+        $data=input();
+        $this->validate($data,[
+            'remark'=>['require','max:100'],
+        ]);
+        $order->log()->save([
+            'txt'=>$data['remark'],
+        ]);
+        $this->success();
+    }
+    public function deal_settle($ids){
+        $data=input();
+        $this->validate($data,[
+            'status'=>['require','in:1,2'],
+        ]);
+        Db::startTrans();
+        $order= $this->model->settle()->lock(true)->find($ids);
+        if (!$order){
+            $this->error('信息不存在');
+        }
+        $order->dealSettle($data);
+        Db::commit();
+        $this->success();
+    }
+    public function delete($ids){
+        $order= \app\common\model\UserOrder::findOrFail($ids);
+        $order->remove();
+        $this->success();
+    }
 }

+ 0 - 332
application/admin/view/user_order/add.html

@@ -1,332 +0,0 @@
-<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
-
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-user_id" data-rule="required" min="0" data-source="user/user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('From_addr')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-from_addr" class="form-control" name="row[from_addr]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('To_addr')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-to_addr" class="form-control" name="row[to_addr]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('From_city')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <div class='control-relative'><input id="c-from_city" class="form-control" data-toggle="city-picker" name="row[from_city]" type="text"></div>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('To_city')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <div class='control-relative'><input id="c-to_city" class="form-control" data-toggle="city-picker" name="row[to_city]" type="text"></div>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Agree_date')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-agree_date" class="form-control datetimepicker" data-date-format="YYYY-MM-DD" data-use-current="true" name="row[agree_date]" type="text" value="{:date('Y-m-d')}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Agree_time')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-agree_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[agree_time]" type="text" value="{:date('Y-m-d H:i:s')}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Pick_up')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-pick_up" class="form-control" name="row[pick_up]" type="number" value="0">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Pet_category')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-pet_category" class="form-control" name="row[pet_category]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Num')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-num" min="0" class="form-control" name="row[num]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Weight')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-weight" class="form-control" name="row[weight]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Spec')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-spec" class="form-control" name="row[spec]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Piece')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-piece" class="form-control" name="row[piece]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Has_cage')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-has_cage" class="form-control" name="row[has_cage]" type="number" value="0">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-remark" class="form-control" name="row[remark]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <div class="input-group">
-                <input id="c-images" class="form-control" size="50" name="row[images]" type="text">
-                <div class="input-group-addon no-border no-padding">
-                    <span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
-                    <span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
-                </div>
-                <span class="msg-box n-right" for="c-images"></span>
-            </div>
-            <ul class="row list-inline faupload-preview" id="p-images"></ul>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Protect_amount')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-protect_amount" data-rule="required" class="form-control" step="0.01" name="row[protect_amount]" type="number" value="0.00">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Protect_max')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-protect_max" data-rule="required" class="form-control" step="0.01" name="row[protect_max]" type="number" value="0.00">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Created_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-created_at" class="form-control" name="row[created_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Updated_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-updated_at" class="form-control" name="row[updated_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Freight')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-freight" class="form-control" name="row[freight]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Total_amount')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-total_amount" class="form-control" step="0.01" name="row[total_amount]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Real_amount')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-real_amount" class="form-control" step="0.01" name="row[real_amount]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Coupon_id')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-coupon_id" data-rule="required" data-source="coupon/index" class="form-control selectpage" name="row[coupon_id]" type="text" value="">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Coupon_amount')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-coupon_amount" class="form-control" step="0.01" name="row[coupon_amount]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-status" class="form-control" name="row[status]" type="number" value="0">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Pay_time')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-pay_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[pay_time]" type="text" value="{:date('Y-m-d H:i:s')}">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Pay_type')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-pay_type" class="form-control" name="row[pay_type]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Completed_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-completed_at" class="form-control" name="row[completed_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Billed_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-billed_at" class="form-control" name="row[billed_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('No')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-no" class="form-control" name="row[no]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Get_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-get_at" class="form-control" name="row[get_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Settled_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-settled_at" class="form-control" name="row[settled_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Expired_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-expired_at" class="form-control" name="row[expired_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cancel_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-cancel_at" class="form-control" name="row[cancel_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Reject_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-reject_at" class="form-control" name="row[reject_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Refund_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-refund_at" class="form-control" name="row[refund_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Refund_status')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-refund_status" data-rule="required" class="form-control" name="row[refund_status]" type="number" value="-1">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Refund_reason')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-refund_reason" class="form-control" name="row[refund_reason]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Refund_images')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <div class="input-group">
-                <input id="c-refund_images" class="form-control" size="50" name="row[refund_images]" type="text" value="[]">
-                <div class="input-group-addon no-border no-padding">
-                    <span><button type="button" id="faupload-refund_images" class="btn btn-danger faupload" data-input-id="c-refund_images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="true" data-preview-id="p-refund_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
-                    <span><button type="button" id="fachoose-refund_images" class="btn btn-primary fachoose" data-input-id="c-refund_images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
-                </div>
-                <span class="msg-box n-right" for="c-refund_images"></span>
-            </div>
-            <ul class="row list-inline faupload-preview" id="p-refund_images"></ul>
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Refund_amount')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-refund_amount" class="form-control" step="0.01" name="row[refund_amount]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Refund_apply_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-refund_apply_at" class="form-control" name="row[refund_apply_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Deleted_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-deleted_at" class="form-control" name="row[deleted_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Rec_order_id')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-rec_order_id" data-rule="required" data-source="rec/order/index" class="form-control selectpage" name="row[rec_order_id]" type="text" value="">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Status_bak')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-status_bak" class="form-control" name="row[status_bak]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('From_longitude')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-from_longitude" class="form-control" step="0.000001" name="row[from_longitude]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('From_latitude')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-from_latitude" class="form-control" step="0.000001" name="row[from_latitude]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('To_longitude')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-to_longitude" class="form-control" step="0.000001" name="row[to_longitude]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('To_latitude')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-to_latitude" class="form-control" name="row[to_latitude]" type="text">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Cancel_type')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-cancel_type" class="form-control" name="row[cancel_type]" type="number">
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Settle_submit_at')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-settle_submit_at" class="form-control" name="row[settle_submit_at]" type="number">
-        </div>
-    </div>
-    <div class="form-group layer-footer">
-        <label class="control-label col-xs-12 col-sm-2"></label>
-        <div class="col-xs-12 col-sm-8">
-            <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
-            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
-        </div>
-    </div>
-</form>

+ 3 - 1
application/admin/view/user_order/edit.html

@@ -63,5 +63,7 @@
     </table>
 </div>
 <div class="deal">
-    <button class="btn btn-primary deal_remark">备注</button>
+    {eq name="row.status" value="50"}
+    <button class="btn btn-primary deal_remark" data-id="{$row.id}">结算</button>
+    {/eq}
 </div>

+ 7 - 6
application/admin/view/user_order/index.html

@@ -6,12 +6,12 @@
             <div class="tab-pane fade active in" id="one">
                 <div class="widget-body no-padding">
                     <div id="toolbar" class="toolbar">
-  <!--                      <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
-                        <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('user_order/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
-                        <a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('user_order/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
-                        <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('user_order/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
-                        <a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('user_order/import')?'':'hide'}" title="{:__('Import')}" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="fa fa-upload"></i> {:__('Import')}</a>
--->
+                      <a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
+                        <!--                       <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('user_order/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
+                                             <a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('user_order/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
+                                             <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('user_order/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
+                                             <a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('user_order/import')?'':'hide'}" title="{:__('Import')}" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="fa fa-upload"></i> {:__('Import')}</a>
+                     -->
                         <div class="dropdown btn-group {:$auth->check('user_order/multi')?'':'hide'}">
                             <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
                             <ul class="dropdown-menu text-left" role="menu">
@@ -26,6 +26,7 @@
                            data-operate-edit="{:$auth->check('user_order/edit')}" 
                            data-operate-del="{:$auth->check('user_order/del')}"
                            data-operate-send_detail="{:$auth->check('user_order/send_detail')}"
+                           data-operate-delete="{:$auth->check('user_order/delete')}"
                            width="100%">
                     </table>
                 </div>

+ 9 - 7
application/api/library/ExceptionHandle.php

@@ -18,6 +18,7 @@ class ExceptionHandle extends Handle
     {
         // 在生产环境下返回code信息
         //if (!\think\Config::get('app_debug')) {
+        if(request()->isAjax()) {
             $statuscode = $code = 0;
             //$msg = 'An error occurred';
             $msg = $e->getMessage();
@@ -31,19 +32,20 @@ class ExceptionHandle extends Handle
             if ($e instanceof \think\exception\HttpException) {
                 $statuscode = $code = $e->getStatusCode();
             }
-            if($e instanceof UserException){
-                $code=0;
-                $msg=$e->getMessage();
-                $statuscode=200;
+            if ($e instanceof UserException) {
+                $code = 0;
+                $msg = $e->getMessage();
+                $statuscode = 200;
             }
-            if($e instanceof ModelNotFoundException){
-                $msg='查找的数据不存在';
+            if ($e instanceof ModelNotFoundException) {
+                $msg = '查找的数据不存在';
             }
             return json(['code' => $code, 'msg' => $msg, 'time' => time(), 'data' => null], $statuscode);
+        }
         //}
 
         //其它此交由系统处理
-        //return parent::render($e);
+        return parent::render($e);
     }
 
 }

+ 1 - 0
application/command.php

@@ -19,4 +19,5 @@ return [
     'app\admin\command\Api',
     \app\common\command\AreaCommand::class,
     \app\common\command\TestCommand::class,
+    \app\common\command\OrderExpiredCommand::class,
 ];

+ 31 - 0
application/common/command/OrderExpiredCommand.php

@@ -0,0 +1,31 @@
+<?php
+namespace app\common\command;
+
+use app\common\model\UserOrder;
+use think\console\Command;
+use think\console\Input;
+use think\console\Output;
+use think\Db;
+use think\Log;
+
+class OrderExpiredCommand extends Command{
+    protected function configure()
+    {
+        $this->setName('order:expired')->setDescription('订单超时关闭');
+    }
+
+    protected function execute(Input $input, Output $output)
+    {
+        $orders= UserOrder::expired()->select();
+        foreach ($orders as $order){
+            try {
+                Db::startTrans();
+                $order->cancel();
+                Db::commit();
+            }catch (\Exception $e){
+                Log::error("关闭订单[$order->id]失败:{$e->getMessage()}");
+            }
+        }
+        $output->info('success');
+    }
+}

+ 1 - 0
application/common/controller/Backend.php

@@ -116,6 +116,7 @@ class Backend extends Controller
 
     public function _initialize()
     {
+        $this->failException=true;
         $modulename = $this->request->module();
         $controllername = Loader::parseName($this->request->controller());
         $actionname = strtolower($this->request->action());

+ 9 - 5
application/common/model/UserOrder.php

@@ -62,7 +62,7 @@ class UserOrder extends Model
         self::STATUS_COMPLETE=>'已完成,待结算',
         self::STATUS_SET=>'已结算',
         self::STATUS_SET_REJECT=>'已拒绝结算',
-        self::STATUS_REFUND=>'退款中',
+        self::STATUS_REFUND=>'退款处理中',
         self::STATUS_CANCEL=>'已取消',
     ];
 
@@ -439,10 +439,7 @@ class UserOrder extends Model
             #更新配送订单状态
             $data=$order->getChangedData();
             if(isset($data['status'])){
-                $update=$order->currentSenderOrder()->update(['status'=>$data['status']]);
-                if(!$update){
-                    throw_user('更新配送订单失败');
-                }
+                $order->senderOrder()->update(['status'=>$data['status']]);
             }
         });
     }
@@ -540,4 +537,11 @@ class UserOrder extends Model
     public function scopeCanceled(Query $query){
         $query->where('status',self::STATUS_CANCEL);
     }
+    /** 已超时 */
+    public function scopeExpired(Query $query,$limit=10){
+        $query->where('expired_at','<',time())
+            ->where('status',self::STATUS_WAIT_PAY)
+            ->order('id','desc')
+            ->limit($limit);
+    }
 }

+ 96 - 1
public/assets/js/backend/user_order.js

@@ -62,6 +62,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                                     url: 'user_order/edit',
                                     callback: function (data) {
                                         //Layer.alert("接收到回传数据:" + JSON.stringify(data), {title: "回传数据"});
+                                        $('.btn-refresh').trigger('click')
                                     },
                                     visible: function (row) {
                                         //返回true时按钮显示,返回false隐藏
@@ -83,6 +84,69 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                                         return $('#table').data('operate-send_detail')===1;
                                     }
                                 },
+                                {
+                                    name: 'remark',
+                                    text: __('备注'),
+                                    title: __('备注'),
+                                    classname: 'btn btn-xs btn-danger btn-click',
+                                    icon: 'fa fa-wikipedia-w',
+                                    url: 'user_order/remark',
+                                    click: function (data) {
+                                        let _this=this
+                                        layer.prompt({
+                                            formType: 2,
+                                            title: '请填写备注',
+                                            area: ['500px', '150px'],
+                                            btnAlign: 'c',
+                                            yes: function(index, layero){
+                                                // 获取文本框输入的值
+                                                var value = layero.find(".layui-layer-input").val();
+                                                if (value) {
+                                                    $.post(_this.href,{remark:value,ids:data.id},function (res) {
+                                                        if(res.code===1) {
+                                                            $('.btn-refresh').trigger('click')
+                                                            layer.msg('操作成功')
+                                                            layer.close(index)
+                                                        }else{
+                                                            layer.alert(res.msg)
+                                                        }
+                                                    })
+                                                } else {
+                                                    layer.alert("输入值为空!");
+                                                }
+                                            }
+                                        })
+                                    },
+                                    visible: function (row) {
+                                        //返回true时按钮显示,返回false隐藏
+                                        return $('#table').data('operate-send_detail')===1;
+                                    }
+                                },
+                                {
+                                    name: 'delete',
+                                    text: __('删除'),
+                                    title: __('删除'),
+                                    classname: 'btn btn-xs btn-danger btn-click',
+                                    icon: 'fa fa-delicious',
+                                    url: 'user_order/delete',
+                                    click: function (data) {
+                                        let _this=this
+                                        layer.confirm('确认删除吗?',function (){
+                                            $.post(_this.href,{},function (res) {
+                                                if(res.code===1){
+                                                    layer.msg('删除成功')
+                                                    $('.btn-refresh').trigger('click')
+                                                }else{
+                                                    layer.msg(res.msg)
+                                                }
+                                            })
+                                        })
+                                    },
+                                    visible: function (row) {
+                                        //返回true时按钮显示,返回false隐藏
+                                        return $('#table').data('operate-delete')===1 && row.status===80;
+                                    }
+                                },
                             ],
                         }
                     ]
@@ -103,7 +167,38 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
         edit: function () {
             Controller.api.bindevent();
             $('.deal_remark').click(function (){
-                layer.prompt()
+                let id=$(this).data('id')
+                layer.open({
+                    content:'请选择操作',
+                    btn:['立即结算','拒绝结算','取消操作'],
+                    yes:function (idx){
+                        $.post('user_order/deal_settle',{ids:id,status:1},function (res) {
+                            if(res.code===1) {
+                                Fast.api.close({})
+                                layer.msg('操作成功')
+                                layer.close(idx)
+                                window.location.reload()
+                            }else{
+                                layer.alert(res.msg)
+                            }
+                        })
+                    },
+                    btn2:function (idx){
+                        $.post('user_order/deal_settle',{ids:id,status:2},function (res) {
+                            if(res.code===1) {
+                                Fast.api.close({})
+                                layer.msg('操作成功')
+                                layer.close(idx)
+                                window.location.reload()
+                            }else{
+                                layer.alert(res.msg)
+                            }
+                        })
+                    },
+                    btn3:function (idx){
+                        layer.close(idx)
+                    }
+                })
             })
         },
         api: {