xxxrrrdddd 3 years ago
parent
commit
5319f00efa

+ 4 - 12
application/admin/controller/MobileOrder.php

@@ -2,11 +2,13 @@
 
 namespace app\admin\controller;
 
+use app\admin\model\Admin;
 use app\admin\model\MobileOrderAdmin;
 use app\common\controller\Backend;
 use app\common\model\MobileOrderOperation;
 use app\common\service\Refund;
 use app\common\service\SmsSend;
+use app\common\validate\RefundValidate;
 use think\Db;
 
 /**
@@ -117,20 +119,10 @@ class MobileOrder extends Backend
             return view();
         }else{
             $data=input('row/a');
-            $this->validate($data,[
-                'amount|金额'=>'require|number|egt:0',
-            ]);
+            $this->validate($data,RefundValidate::class);
             Db::startTrans();
             $model=$this->model->where('id',$ids)->lock(true)->findOrFail();
-            if($data['amount']>$model['amount']){
-                $this->error('退款金额不能大于付款金额');
-            }
-            $model['amount_refund']=$data['amount'];
-            $model['refund_no']=session_create_id();
-            Refund::setType($model)->refund();
-            $model['status']=\app\common\model\MobileOrder::STATUS_REFUNDED;
-            $model->save();
-            SmsSend::orderRefund($model['phone']);
+            $model->makeRefund('admin',Admin::find($this->auth->id),$data);
             Db::commit();
             $this->success();
         }

+ 4 - 0
application/admin/model/Admin.php

@@ -3,6 +3,7 @@
 namespace app\admin\model;
 
 use app\common\model\MobileHoldLog;
+use app\common\model\MobileOrderRefundLog;
 use think\Model;
 use think\Session;
 
@@ -34,4 +35,7 @@ class Admin extends Model
     public function mobileHoldLog(){
         return $this->morphMany(MobileHoldLog::class,'holdable','admin');
     }
+    public function mobileOrderRefundLog(){
+        return $this->morphMany(MobileOrderRefundLog::class,'refunduser','admin');
+    }
 }

+ 12 - 0
application/admin/view/mobile_order/refund.html

@@ -1,10 +1,22 @@
 <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">{:__('选择操作')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[pass]',[1=>'同意',0=>'驳回'],1)}
+        </div>
+    </div>
+    <div class="form-group">
         <label class="control-label col-xs-12 col-sm-2">{:__('退款金额')}:</label>
         <div class="col-xs-12 col-sm-8">
             <input id="c-no" class="form-control" name="row[amount]" type="text" data-rule="required" value="{$row.amount}">
         </div>
     </div>
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">{:__('理由')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-refund_reason" class="form-control" name="row[refund_reason]" type="text" data-rule="required">
+        </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">

+ 0 - 102
application/admin/view/user_question/add.html

@@ -1,102 +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">{:__('Type')}:</label>
-        <div class="col-xs-12 col-sm-8" id="type">
-            {:build_radios('row[type]',['decide'=>'判断题','choose'=>'选择题','wenda'=>'问答题'],'decide')}
-        </div>
-    </div>
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <input id="c-title" class="form-control" name="row[title]" type="text" data-rule="required">
-        </div>
-    </div>
-    <span id="item">
-    </span>
-    <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>
-<span id="item-choose" class="hidden">
-            <div class="form-group">
-                <label class="control-label col-xs-12 col-sm-2">{:__('选项类型')}:</label>
-                <div class="col-xs-12 col-sm-8 item-type">
-                    {:build_radios('row[item_type]',['txt'=>'文本','image'=>'图片'],'txt')}
-                </div>
-            </div>
-            <div class="form-group item-type-txt">
-                <label class="control-label col-xs-12 col-sm-2">{:__('选项')}:</label>
-                <div class="col-xs-12 col-sm-8">
-                    <button class="btn btn-info add-item" type="button">新增选项</button>
-                    <div>
-                        <label style="position: relative;top:10px;">
-                            <input name="row[key][1]" type="checkbox" value="1">答案
-                        </label>
-                        <input class="form-control" name="row[items][txt][1]" type="text" style="width: 200px;" placeholder="输入选项">
-                    </div>
-                </div>
-            </div>
-            <div class="form-group item-type-image hidden">
-                <label class="control-label col-xs-12 col-sm-2">{:__('选项')}:</label>
-                <div class="col-xs-12 col-sm-8">
-                    <button class="btn btn-info add-item-image" type="button">新增选项</button>
-                    <div class="input-group">
-                        <label style="position: relative;">
-                               <input name="row[key][1]" type="checkbox" value="1">答案
-                        </label>
-                        <input id="c-choose-1" class="form-control up-input" size="50" name="row[items][image][1]" type="text" style="width: 200px" readonly>
-                        <div class="input-group-addon no-border no-padding" style="display: inline-block;">
-                            <span><button type="button" id="plupload-avatar-1" class="btn btn-danger plupload" data-input-id="c-choose-1" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false"><i class="fa fa-upload"></i> 上传</button></span>
-                            <span><button type="button" id="fachoose-avatar-1" class="btn btn-primary fachoose" data-input-id="c-choose-1" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> 选择</button></span>
-                            <span><button type="button" class="btn btn-danger btn-delete hidden" onclick="$(this).parents('.input-group').remove()">删除</button></span>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </span>
-<span id="item-decide" class="hidden">
-    <div class="form-group">
-        <label class="control-label col-xs-12 col-sm-2">{:__('Key')}:</label>
-        <div class="col-xs-12 col-sm-8">
-            <!--{:build_radios('row[key]',['true'=>'正确','false'=>'错误'],'true')}-->
-            <label style="display: block;">
-                <input type="radio" name="row[key]" value="A" checked/>
-                <input type="text" name="row[items][A]" style="width: 150px" class="form-control" placeholder="请输入正确时候的描述" data-rule="required">
-            </label>
-            <label>
-                <input type="radio" name="row[key]" value="B"/>
-                <input type="text" name="row[items][B]" style="width: 150px" class="form-control" placeholder="请输入错误时候的描述" data-rule="required">
-            </label>
-        </div>
-    </div>
-</span>
-<span id="item-wenda" class="hidden"></span>
-<div class="input-group hidden item-type-image-example">
-    <label>
-        <input name="row[key][$idx]" type="checkbox" value="1">答案
-    </label>
-    <input id="c-choose-$idx" class="form-control up-input" size="50" name="row[items][image][$idx]" type="text" style="width: 200px" readonly>
-    <div class="input-group-addon no-border no-padding" style="display: inline-block;">
-        <span><button type="button" id="plupload-avatar-$idx" class="btn btn-danger plupload" data-input-id="c-choose-$idx" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp" data-multiple="false"><i class="fa fa-upload"></i> 上传</button></span>
-        <span><button type="button" id="fachoose-avatar-$idx" class="btn btn-primary fachoose" data-input-id="c-choose-$idx" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> 选择</button></span>
-        <span><button type="button" class="btn btn-danger btn-delete" onclick="$(this).parents('.input-group').remove()">删除</button></span>
-    </div>
-</div>
-<span class="hidden item-type-txt-example">
-    <div>
-        <label style="position: relative;top:10px;">
-            <input name="row[key][$idx]" type="checkbox" value="1">答案
-        </label>
-        <input class="form-control" name="row[items][txt][$idx]" type="text" style="width: 200px;" placeholder="输入选项">
-    </div>
-</span>
-<style>
-    .up-input{
-        float: none!important;
-        display: inline-block!important;
-    }
-</style>

+ 0 - 37
application/admin/view/user_question/index.html

@@ -1,37 +0,0 @@
-<div class="panel panel-default panel-intro">
-    {:build_heading()}
-
-    <div class="panel-body">
-        <div id="myTabContent" class="tab-content">
-            <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_question/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_question/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_question/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
-<!--                        <a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('user_question/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_question/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">
-                                <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
-                                <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
-                            </ul>
-                        </div>-->
-
-                        
-                    </div>
-                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
-                           data-operate-edit="0"
-                           data-operate-del="{:$auth->check('user_question/del')}" 
-                           width="100%">
-                    </table>
-                </div>
-            </div>
-
-        </div>
-    </div>
-</div>

+ 1 - 1
application/api/controller/MobileController.php

@@ -455,7 +455,7 @@ class MobileController extends UserApi
         Db::startTrans();
         $order=MobileOrder::findOrFail($data['id']);
         $order->checkAllowRefund();
-        $order->makeRefund($data['reason']);
+        $order->makeUserRefund($data['reason']);
         Db::commit();
         $this->success();
     }

+ 28 - 2
application/common/model/MobileOrder.php

@@ -4,6 +4,7 @@ namespace app\common\model;
 
 use app\admin\model\Admin;
 use app\admin\model\MobileOrderAdmin;
+use app\common\service\Refund;
 use app\common\service\SmsSend;
 use think\db\Query;
 use think\Model;
@@ -19,6 +20,7 @@ class MobileOrder extends Model
     const STATUS_CAN_SEND=15;
     const STATUS_REFUND=30;
     const STATUS_REFUNDED=90;
+    const STATUS_REFUNDED_REJECT=100;
     public static $status=[
         0=>'待付款',
         self::STATUS_WAIT_SEND=>'已付款',
@@ -31,7 +33,8 @@ class MobileOrder extends Model
         60=>'无号码',
         70=>'换卡',
         80=>'争议单',
-        90=>'已退款',
+        self::STATUS_REFUNDED=>'已退款',
+        self::STATUS_REFUNDED_REJECT=>'退款驳回',
     ];
     public static $refundAllowStatus=[
         self::STATUS_WAIT_SEND,
@@ -81,6 +84,9 @@ class MobileOrder extends Model
     public function status(){
         return $this->hasMany(MobileOrderStatus::class);
     }
+    public function refundLog(){
+        return $this->hasMany(MobileOrderRefundLog::class);
+    }
     public function proxy(){
         $columns=Admin::getTableInfo()['fields'];
         unset($columns['password']);
@@ -174,7 +180,7 @@ class MobileOrder extends Model
             throw_user('当前状态不允许退款');
         }
     }
-    public function makeRefund($reason){
+    public function makeUserRefund($reason){
         $this['status']=self::STATUS_REFUND;
         $this['refund_reason']=$reason;
         $this->save();
@@ -195,4 +201,24 @@ class MobileOrder extends Model
     public function scopeFilterShow(Query $query){
         $query->whereIn('mobile_order.status',$this->frontStatus());
     }
+
+    public function makeRefund($from,$user,$data){
+        $model=$this;
+        $model['amount_refund'] = $data['amount'];
+        $model['refund_no'] = session_create_id();
+        $model['refund_reason']=$data['refund_reason'];
+        $model['status_bak']=$model['status'];
+        if ($data['pass']) {
+            if ($data['amount'] > $model['amount']) {
+                throw_user('退款金额不能大于付款金额');
+            }
+            Refund::setType($model)->refund();
+            $model['status'] = self::STATUS_REFUNDED;
+            SmsSend::orderRefund($model['phone']);
+        }else{
+            $model['status'] = self::STATUS_REFUNDED_REJECT;
+        }
+        $model->save();
+        $model->refundLog()->save(MobileOrderRefundLog::withRefund($from,$user,$data));
+    }
 }

+ 50 - 0
application/common/model/MobileOrderRefundLog.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace app\common\model;
+
+use app\admin\model\Admin;
+use think\Model;
+
+/**
+ * 配置模型
+ */
+class MobileOrderRefundLog extends Model
+{
+    protected $autoWriteTimestamp=true;
+    protected $updateTime=null;
+
+    public function rerunduser(){
+        return $this->morphTo('refunduser',[
+            'admin'=>Admin::class,
+            'user' =>User::class,
+        ]);
+    }
+    public function mobileOrder(){
+        return $this->belongsTo(MobileOrder::class,'mobile_id','id')->setEagerlyType(0);
+    }
+
+    public static function withRefundUser(User $user,$data){
+        return new self([
+            'refunduser_type'=>'user',
+            'refunduser_id'=>$user['id'],
+            'amount'=>$data['amount'],
+        ]);
+    }
+    public static function withRefundAdmin(Admin $user,$data){
+        return new self([
+            'refunduser_type'=>'admin',
+            'refunduser_id'=>$user['id'],
+            'amount'=>$data['amount'],
+        ]);
+    }
+    public static function withRefund($type,$user,$data){
+        return new self([
+            'refunduser_type'=>$type,
+            'refunduser_id'=>$user['id'],
+            'amount_user'=>$data['amount_user']??0,
+            'amount_backend'=>$data['amount'],
+            'reason'=>$data['refund_reason'],
+            'pass'=>$data['pass'],
+        ]);
+    }
+}

+ 3 - 0
application/common/model/User.php

@@ -271,6 +271,9 @@ class User extends Model
     public function mobileHoldLog(){
         return $this->morphMany(MobileHoldLog::class,'holdable','user');
     }
+    public function mobileOrderRefundLog(){
+        return $this->morphMany(MobileOrderRefundLog::class,'refunduser','user');
+    }
     /** 模糊搜索 */
     public function scopeDim(Query $query,$keyword){
         $keyword="%{$keyword}%";

+ 23 - 0
application/common/validate/RefundValidate.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace app\common\validate;
+
+use think\Validate;
+
+class RefundValidate extends Validate
+{
+    /**
+     * 验证规则
+     */
+    protected $rule = [
+        'pass'=>'require|in:0,1',
+        'amount|金额'=>'require|number|egt:0',
+        'refund_reason|理由'=>'require|max:100',
+    ];
+    /**
+     * 提示消息
+     */
+    protected $message = [
+    ];
+    
+}

+ 5 - 1
application/sub/controller/Order.php

@@ -20,7 +20,7 @@ use think\Validate;
 class Order extends SubCommon
 {
     protected $noNeedLogin=[];
-    protected $noNeedRight=['mobile','index'];
+    protected $noNeedRight=['mobile','index','refund_log'];
 
     public function mobile(){
         $data=input();
@@ -86,4 +86,8 @@ class Order extends SubCommon
             $this->success();
         }
     }
+    #退款记录
+    public function refund_log(){
+
+    }
 }

+ 3 - 106
application/sub/view/order/index.html

@@ -58,6 +58,7 @@
                 {eq name='a.status' value='30'}
                 <a class="layui-btn layui-btn-mini news_edit" data-id="{$a.id}"><i class="iconfont icon-caozuo"></i> 退款</a>
                 {/eq}
+                <a class="layui-btn layui-btn-mini refund_log" data-id="{$a.id}"> 退款记录</a>
             </td>
         </tr>
         {/foreach}
@@ -80,100 +81,11 @@
             laypage = layui.laypage,
             $ = layui.jquery;
 
-
         //查询
         $(".search_btn").click(function(){
             var newArray = [];
         })
 
-        //添加文章
-        //改变窗口大小时,重置弹窗的高度,防止超出可视区域(如F12调出debug的操作)
-        $(window).one("resize",function(){
-            $(".newsAdd_btn").click(function(){
-                var index = layui.layer.open({
-                    title : "添加文章",
-                    type : 2,
-                    content : "newsAdd.html",
-                    success : function(layero, index){
-                        setTimeout(function(){
-                            layui.layer.tips('点击此处返回文章列表', '.layui-layer-setwin .layui-layer-close', {
-                                tips: 3
-                            });
-                        },500)
-                    }
-                })
-                layui.layer.full(index);
-            })
-        }).resize()
-
-
-        //批量删除
-        $(".batchDel").click(function(){
-            var $checkbox = $('.news_list tbody .choose');
-            var $checked = $('.news_list tbody .choose:checked');
-            if($checkbox.is(":checked")){
-                layer.confirm('确定删除选中的信息?',{icon:3, title:'提示信息'},function(index){
-                    var index = layer.msg('删除中,请稍候',{icon: 16,time:false,shade:0.8});
-                    setTimeout(function(){
-                        //删除数据
-                        for(var j=0;j<$checked.length;j++){
-                            for(var i=0;i<newsData.length;i++){
-                                if(newsData[i].newsId == $checked.eq(j).parents("tr").find(".news_del").attr("data-id")){
-                                    newsData.splice(i,1);
-                                    newsList(newsData);
-                                }
-                            }
-                        }
-                        $('.news_list thead input[type="checkbox"]').prop("checked",false);
-                        form.render();
-                        layer.close(index);
-                        layer.msg("删除成功");
-                    },2000);
-                })
-            }else{
-                layer.msg("请选择需要删除的文章");
-            }
-        })
-
-        //全选
-        form.on('checkbox(allChoose)', function(data){
-            var child = $(data.elem).parents('table').find('tbody .choose');
-            child.each(function(index, item){
-                item.checked = data.elem.checked;
-            });
-            form.render('checkbox');
-        });
-
-        //通过判断文章是否全部选中来确定全选按钮是否选中
-        form.on("checkbox(choose)",function(data){
-            var child = $(data.elem).parents('table').find('tbody input.choose');
-            var childChecked = $(data.elem).parents('table').find('tbody input.choose:checked')
-            if(childChecked.length == child.length){
-                $(data.elem).parents('table').find('thead input#allChoose').get(0).checked = true;
-            }else{
-                $(data.elem).parents('table').find('thead input#allChoose').get(0).checked = false;
-            }
-            form.render('checkbox');
-        })
-
-        //预占
-        form.on('switch(holdChange)', function(data){
-            let open=data.elem.checked,
-                _this=this
-            var index = layer.msg('修改中,请稍候',{icon: 16,time:5000,shade:0.1});
-            $.post('{:url("mobile/hold")}',{is_hold:open?1:0,id:_this.value},function (res) {
-                if(res.code===0){
-                    layer.alert(res.msg)
-                    _this.checked=!open
-                    form.render('checkbox')
-                }else{
-                    layer.close(index)
-                    layer.msg('修改成功')
-                    //location.reload()
-                }
-            })
-        })
-
         //操作
         $("body").on("click",".news_edit",function(){  //编辑
             let id=$(this).data('id')
@@ -187,13 +99,13 @@
             })
         })
 
-        $('.hold_log').click(function () {
+        $('.refund_log').click(function () {
             let id=$(this).data('id')
             let index = layui.layer.open({
                 title : "预占记录",
                 type : 2,
                 area:['1000px','100%'],
-                content : '{:url("mobile/hold_log")}?id='+id,
+                content : '{:url("order/refund_log")}?id='+id,
                 success : function(layero, index){
                 }
             })
@@ -201,21 +113,6 @@
         $('.reset-btn').click(function (){
             location.replace(location.pathname)
         })
-
-
-        $("body").on("click",".news_del",function(){  //删除
-            var _this = $(this);
-            layer.confirm('确定删除此信息?',{icon:3, title:'提示信息'},function(index){
-                $.post("{:url('mobile/delete')}",{id:[_this.data('id')]},function (res){
-                    if(res.code===1){
-                        layer.msg('删除成功')
-                    }else{
-                        layer.msg(res.msg)
-                    }
-                    layer.close(index);
-               })
-            });
-        })
     })
 
 </script>

+ 47 - 0
application/sub/view/order/refund_log.html

@@ -0,0 +1,47 @@
+{extend name="layout/sub"/}
+{block name='css'}
+<link rel="stylesheet" href="__SUB__/css/news.css" media="all" />
+{/block}
+{block name='body'}
+<div class="layui-form news_list">
+    <table class="layui-table">
+        <thead>
+        <tr>
+            <th width="20">ID</th>
+            <th width="100">用户名</th>
+            <th>状态</th>
+            <th>时间</th>
+        </tr>
+        </thead>
+        <tbody class="news_content">
+        {foreach name="list" item="a"}
+        <tr>
+            <td>{$a.id}</td>
+            <td>{$a.holdable.nickname}</td>
+            <td>{:$a.is_hold?'开启':'关闭'}</td>
+            <td>
+                {:date('Y-m-d H:i:s',$a.create_time)}
+            </td>
+        </tr>
+        {/foreach}
+        </tbody>
+    </table>
+</div>
+<div id="page">
+    {$list->render()}
+</div>
+{/block}
+{block name='js'}
+
+<script>
+    layui.config({
+        base : "__SUB__/js/"
+    }).use(['form','layer','jquery','laypage'],function(){
+        var form = layui.form(),
+            layer = parent.layer === undefined ? layui.layer : parent.layer,
+            laypage = layui.laypage,
+            $ = layui.jquery;
+    })
+
+</script>
+{/block}