Răsfoiți Sursa

refactor: 放号设置重构

zzb 2 ani în urmă
părinte
comite
ed37304457

+ 28 - 163
app/admin/controller/Appointment.php

@@ -14,48 +14,9 @@ class Appointment extends Permissions
         return new appointmentModel();
     }
 
-    public function index()
-    {
-        $pid = $this->request->param('pid', 0, 'intval');
-        if ($this->request->isAjax()) {
-            $post = $this->request->param();
-            $where = [
-                'provider_id' => $pid
-            ];
-            if (isset($post['ids']) and !empty($post['ids'])) {
-                $where['id'] = ['in', $post['ids']];
-            }
-            if (isset($post["start_time"]) and !empty($post["start_time"])) {
-                $timerang = explode(' - ', $post["start_time"]);
-                $min_time = strtotime($timerang[0]);
-                $max_time = $timerang[0] == $timerang[1] ? $min_time + 24 * 3600 - 1 : strtotime($timerang[1]??'');
-                $where["start_time"] = [['>=', $min_time], ['<=', $max_time]];
-            }
-            if (isset($post["create_time"]) and !empty($post["create_time"])) {
-                $timerang = explode(' - ', $post["create_time"]);
-                $min_time = strtotime($timerang[0]);
-                $max_time = $timerang[0] == $timerang[1] ? $min_time + 24 * 3600 - 1 : strtotime($timerang[1]??'');
-                $where["create_time"] = [['>=', $min_time], ['<=', $max_time]];
-            }
-
-            $model = $this->getModel();
-            $count = $model->where($where)->count();
-            $data = $model->where($where)->page($post['page']??0, $post['limit']??15)->order('id desc')->select();
-            foreach ($data as $key => $value) {
-                $value['specialist_name'] = $value->specialist->name;
-                $value['appointment_date_text'] = $value->appointment_date_text;
-                $data[$key] = $value;
-            }
-            return array('code' => 0, 'count' => $count, 'data' => $data);
-        } else {
-            return $this->fetch();
-        }
-    }
-
 
     public function publish()
     {
-        $id = $this->request->param('id', 0, 'intval');
         $pid = $this->request->param('pid', 0, 'intval');
         $this->assign('pid', $pid);
 
@@ -63,152 +24,56 @@ class Appointment extends Permissions
         $post['provider_id'] = $pid;
 
         if ($this->request->isPost()) {
-
-            if (isset($post['start_time']) && !empty($post['start_time'])) {
-                $timerang = explode(' - ', $post["start_time"]);
-                $min_time = strtotime(str_replace(['年', '月'], '-', $timerang[0]));
-                $max_time = $timerang[0] == $timerang[1] ? $min_time + 24 * 3600 - 1 : strtotime(str_replace(['年', '月'], '-', $timerang[1]??''));
-                $post['start_time'] = $min_time;
-                $post['end_time'] = $max_time;
-            }
-            if (isset($post['morning_start_time']) && !empty($post['morning_start_time'])) {
-                $timerang = explode(' - ', $post["morning_start_time"]);
-                $post['morning_start_time'] = $timerang[0];
-                $post['morning_end_time'] = $timerang[1];
-            }
-            if (isset($post['afternoon_start_time']) && !empty($post['afternoon_start_time'])) {
-                $timerang = explode(' - ', $post["afternoon_start_time"]);
-                $post['afternoon_start_time'] = $timerang[0];
-                $post['afternoon_end_time'] = $timerang[1];
-            }
-            if (isset($post['night_start_time']) && !empty($post['night_start_time'])) {
-                $timerang = explode(' - ', $post["night_start_time"]);
-                $post['night_start_time'] = $timerang[0];
-                $post['night_end_time'] = $timerang[1];
-            }
-
             //验证
             $validate = new \think\Validate([
                 ['provider_id', 'require|number'],
-                ['start_time', 'number', '排号日期格式不对'],
-                ['end_time', 'number', '排号日期格式不对'],
-                ['morning_num|上午放号个数', 'number'],
-                ['morning_start_time', 'length:8', '上午时间格式不对'],
-                ['morning_end_time', 'length:8', '上午时间格式不对'],
-                ['afternoon_num|下午放号个数', 'number'],
-                ['afternoon_start_time', 'length:8', '下午时间格式不对'],
-                ['afternoon_end_time', 'length:8', '下午时间格式不对'],
-                ['night_num|晚上放号个数', 'number'],
-                ['night_start_time', 'length:8', '晚上时间格式不对'],
-                ['night_end_time', 'length:8', '晚上时间格式不对'],
             ]);
+
             if (!$validate->check($post)) {
                 $this->error('提交失败:' . $validate->getError());
             }
-
-            $weeks = $post['weeks']??[];
-            $weeks = array_keys($weeks);
         }
 
         $model = $this->getModel();
-        if ($id > 0) {
+        $appointment = $model->where('provider_id', $pid)->find();
+
+        if ($appointment) {
             //修改
-            $this->error('不允许修改');
-        } else {
-            //新增
             if ($this->request->isPost()) {
+                $weeks = $post['weeks']??[];
+                $weeks = array_keys($weeks);
+                $post['weeks'] = implode(',', $weeks);
 
-                if (empty($weeks)) {
-                    //按时间跨度排号
-                    $exits = (new \app\common\model\AppointmentTicket())->where(['provider_id' => $pid, 'appointment_daytime' => [['>=', $post['start_time']], ['<=', $post['end_time']]]])->count();
-                    if ($exits > 0) {
-                        $this->error('该时间跨度内,已存在排号,请重新选择放号时间,或删除旧的排号');
-                    }
-                    //保存放号设置
-                    if (false == $model->allowField(true)->save($post)) {
-                        $this->error('添加失败');
-                    } else {
-                        //生成号源
-                        $daylist = DateHelper::dateTimeList(date('Y-m-d', $post['start_time']), date('Y-m-d', $post['end_time']), true);
-                        if (count($daylist) == 2 && end($daylist) == current($daylist)) {
-                            array_pop($daylist);
-                        }
-                        $addressId = (new \app\common\model\Specialist())->where('id', $post['provider_id'])->value('address_id');
-                        foreach ($daylist as $datetime) {
-                            $data = [
-                                'appointment_id' => $model->id,
-                                'appointment_daytime' => strtotime($datetime),
-                                'address_id' => $addressId,
-                                'provider_id' => $post['provider_id'],
-                                'status' => \app\common\model\AppointmentTicket::STATUS_OPEN
-                            ];
-                            if (false == (new \app\common\model\AppointmentTicket())->allowField(true)->save($data)) {
-                                $this->error('添加失败');
-                            }
-                        }
-                    }
-
-                } else {
-                    //按工作日排号
-                    $appoints = (new \app\common\model\Appointment())->where(['provider_id' => $pid, 'weeks' => ['<>', '']])->select();
-                    foreach ($appoints as $appoint) {
-                        foreach ($weeks as $week) {
-                            if (in_array($week, explode(',', $appoint->weeks))) {
-                                $week_text = \app\common\model\Appointment::WEEK_TEXTS[$week];
-                                $this->error("{$week_text} 已存在放号设置,请重新选择时间");
-                            }
-                        }
-                    }
-
-                    //保存放号设置
-                    $post['start_time'] = 0;
-                    $post['end_time'] = 0;
-                    $post['weeks'] = implode(',', $weeks);
-                    if (false == $model->allowField(true)->save($post)) {
-                        $this->error('添加失败');
-                    }
-                }
-
-                $this->success('添加成功', 'index', ['pid' => $pid]);
+                $post['morning_time_periods'] = json_encode($post['morning_time_periods']);
+                $post['afternoon_time_periods'] = json_encode($post['afternoon_time_periods']);
 
+                if (false == $appointment->allowField(true)->save($post)) {
+                    $this->error('修改失败');
+                }
+                $this->success('修改成功', 'index', ['pid' => $pid]);
             } else {
                 return $this->fetch();
             }
-        }
-    }
 
-    public function delete()
-    {
-        if ($this->request->isAjax()) {
-            $id = $this->request->param('id', 0, 'intval');
-            if (false == $this->getModel()->where('id', $id)->delete()) {
-                $this->error('删除失败');
-            } else {
-                $this->success('删除成功', 'index');
-            }
-        }
-    }
+        } else {
+            //新增
+            if ($this->request->isPost()) {
 
-    public function deletes()
-    {
-        if ($this->request->isAjax()) {
-            $post = $this->request->param();
-            $ids = $post['ids'];
-            if ($this->getModel()->where('id', 'in', $ids)->delete()) {
-                $this->success('删除成功');
-            }
-        }
-    }
+                $weeks = $post['weeks']??[];
+                $weeks = array_keys($weeks);
+                $post['weeks'] = implode(',', $weeks);
 
-    public function status()
-    {
-        if ($this->request->isPost()) {
-            $post = $this->request->post();
-            if (false == $this->getModel()->where('id', $post['id'])->update(['status' => $post['status']])) {
-                $this->error('设置失败');
+                $post['morning_time_periods'] = json_encode($post['morning_time_periods']);
+                $post['afternoon_time_periods'] = json_encode($post['afternoon_time_periods']);
+
+                if (false == $model->allowField(true)->save($post)) {
+                    $this->error('添加失败');
+                }
+                $this->success('添加成功', 'index', ['pid' => $pid]);
             } else {
-                $this->success('设置成功', 'index');
+                return $this->fetch();
             }
         }
     }
+
 }

+ 25 - 3
app/admin/controller/Webconfig.php

@@ -24,11 +24,11 @@ class Webconfig extends Permissions
         //扩展配置标签
         $tabs = (new configTabModel())->where('status', configTabModel::STATUS_OPEN)->order('sort desc')->select();
         $this->assign('tabs', $tabs);
+        $this->assign('web_config', \app\common\model\Webconfig::get(1));
     }
 
     public function index()
     {
-        $this->assign('web_config', \app\common\model\Webconfig::get(1));
         $this->assign('is_close_site_key', (new Urlconfig())->getCloseSiteKey());
         $this->assign('admin_log_num', (new AdminLog())->count());
         $this->assign('backend_pass', (new Urlconfig())->getBackendPass());
@@ -65,13 +65,35 @@ class Webconfig extends Permissions
 
     public function appointmentConfig()
     {
-        $this->assign('web_config', \app\common\model\Webconfig::get(1));
+        if ($this->request->isPost()) {
+
+            $post = $this->request->post();
+            $weeks = $post['weeks']??[];
+            $weeks = array_keys($weeks);
+            $post['weeks'] = implode(',', $weeks);
+
+            $post['morning_time_periods'] = json_encode($post['morning_time_periods']);
+            $post['afternoon_time_periods'] = json_encode($post['afternoon_time_periods']);
+
+            $model = (new \app\common\model\Webconfig())->where('id', 1)->find();
+            if (false == $model->allowField(true)->save($post)) {
+                $this->error('提交失败');
+            } else {
+                $this->success('提交成功', 'admin/webconfig/index');
+            }
+
+        } else {
+            return $this->fetch();
+        }
+    }
+
+    public function applicationConfig()
+    {
         return $this->fetch();
     }
 
     public function noticeConfig()
     {
-        $this->assign('web_config', \app\common\model\Webconfig::get(1));
         return $this->fetch();
     }
 }

+ 130 - 136
app/admin/view/appointment/publish.html

@@ -32,103 +32,69 @@
 <div class="tplay-body-div">
 
 
-    <div class="layui-tab">
-        <ul class="layui-tab-title">
-            <li><a href="{:url('admin/appointment/index',['pid'=>$Request.param.pid])}" class="a_menu">列表</a></li>
-            <li class="layui-this">新增</li>
-        </ul>
-    </div>
-
-
-
     <div style="margin-top: 20px;"></div>
     <form class="layui-form" id="publish" method="post" lay-filter="myform">
 
-        <div class="layui-tab">
-            <ul class="layui-tab-title">
-                <li class="layui-this">按工作日排号</li>
-                <li>按时间跨度排号</li>
-            </ul>
-            <div class="layui-tab-content" style="padding: 0;padding-top: 10px;">
-                <div class="layui-tab-item layui-show">
-                    <div class="layui-form-item">
-                        <label class="layui-form-label">工作日</label>
-                        <div class="layui-input-block">
-                            <input type="checkbox" name="weeks[1]" title="周一">
-                            <input type="checkbox" name="weeks[2]" title="周二">
-                            <input type="checkbox" name="weeks[3]" title="周三">
-                            <input type="checkbox" name="weeks[4]" title="周四">
-                            <input type="checkbox" name="weeks[5]" title="周五" checked>
-                            <input type="checkbox" name="weeks[6]" title="周六">
-                            <input type="checkbox" name="weeks[7]" title="周日">
-                        </div>
-                    </div>
-                </div>
-                <div class="layui-tab-item">
-                    <!-- 时间 -->
-                    <div class="layui-form-item">
-                        <label class="layui-form-label">日期跨度</label>
-                        <div class="layui-input-inline" style="width:600px;">
-                            <input name="start_time" id="start_time" autocomplete="off" placeholder="开始日期 - 结束日期" class="layui-input"
-                                   type="text">
-                        </div>
-                    </div>
-                </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">工作日</label>
+            <div class="layui-input-block">
+                <input type="checkbox" name="weeks[1]" title="周一">
+                <input type="checkbox" name="weeks[2]" title="周二">
+                <input type="checkbox" name="weeks[3]" title="周三">
+                <input type="checkbox" name="weeks[4]" title="周四">
+                <input type="checkbox" name="weeks[5]" title="周五" checked>
+                <input type="checkbox" name="weeks[6]" title="周六">
+                <input type="checkbox" name="weeks[7]" title="周日">
             </div>
         </div>
 
-
-
-
-        <!-- 数字 -->
         <div class="layui-form-item">
-            <label class="layui-form-label">上午放号个数</label>
-            <div class="layui-input-inline" style="max-width:300px;">
-                <input name="morning_num" autocomplete="off" placeholder="请输入" class="layui-input" type="number"
-                       value="20">
-            </div>
-            <div class="layui-form-mid">时段</div>
+            <label class="layui-form-label">上午时段</label>
+
             <div class="layui-input-inline" style="width:350px;">
-                <input name="morning_start_time" id="morning_start_time" autocomplete="off" placeholder="开始时间 - 结束时间"
-                       class="layui-input" type="text" >
+                <input type="text" name="morning_time_periods[]" placeholder="请输入,格式如:08:00 - 12:00" autocomplete="off"
+                       class="layui-input test-item" value="">
             </div>
-        </div>
 
-        <!-- 数字 -->
-        <div class="layui-form-item">
-            <label class="layui-form-label">下午放号个数</label>
-            <div class="layui-input-inline" style="max-width:300px;">
-                <input name="afternoon_num" autocomplete="off" placeholder="请输入" class="layui-input" type="number"
-                       value="20">
-            </div>
-            <div class="layui-form-mid">时段</div>
-            <div class="layui-input-inline" style="width:350px;">
-                <input name="afternoon_start_time" id="afternoon_start_time" autocomplete="off" placeholder="开始时间 - 结束时间"
-                       class="layui-input" type="text" >
+            <div class="layui-inline" style="margin-top: 5px;">
+                <div class="layui-btn-group">
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm createinput"
+                            lay-filter="createinput"><i class="layui-icon">&#xe654;</i></button>
+                </div>
             </div>
+
+            <!--<div class="layui-inline">-->
+            <!--<div class="layui-input-inline" style="width:350px;">-->
+            <!--<input type="checkbox" name="show_morning" title="显示" checked>-->
+            <!--</div>-->
+            <!--</div>-->
         </div>
-        <!-- 数字 -->
+
+
+
         <div class="layui-form-item">
-            <label class="layui-form-label">晚上放号个数</label>
-            <div class="layui-input-inline" style="max-width:300px;">
-                <input name="night_num" autocomplete="off" placeholder="请输入" class="layui-input" type="number"
-                       value="10">
-            </div>
-            <div class="layui-form-mid">时段</div>
+            <label class="layui-form-label">下午时段</label>
+
             <div class="layui-input-inline" style="width:350px;">
-                <input name="night_start_time" id="night_start_time" autocomplete="off" placeholder="开始时间 - 结束时间"
-                       class="layui-input" type="text" >
+                <input type="text" name="afternoon_time_periods[]" placeholder="请输入,格式如:14:00 - 18:00" autocomplete="off"
+                       class="layui-input test-item" value="">
+            </div>
+
+            <div class="layui-inline" style="margin-top: 5px;">
+                <div class="layui-btn-group">
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm createinput2"
+                            lay-filter="createinput"><i class="layui-icon">&#xe654;</i></button>
+                </div>
             </div>
-        </div>
 
-        <!--<div class="layui-form-item">-->
-            <!--<label class="layui-form-label">服务价格</label>-->
-            <!--<div class="layui-input-inline" style="max-width:300px;">-->
-                <!--<input name="price" lay-verify="required" autocomplete="off" placeholder="请输入" class="layui-input"-->
-                <!--type="text" value="">-->
+            <!--<div class="layui-inline">-->
+            <!--<div class="layui-input-inline" style="width:350px;">-->
+            <!--<input type="checkbox" name="show_afternoon" title="显示" checked>-->
             <!--</div>-->
-            <!--<div class="layui-form-mid layui-word-aux">必填</div>-->
-        <!--</div>-->
+            <!--</div>-->
+        </div>
 
 
         <input type="hidden" name="pid" value="{$Request.param.pid}">
@@ -144,6 +110,52 @@
         </div>
     </form>
 
+
+
+    <div id="create_input" style="display:none">
+        <div class="layui-form-item">
+            <label class="layui-form-label"></label>
+            <div class="layui-input-inline" style="width:350px;">
+                <input type="text" name="morning_time_periods[]" placeholder="请输入,格式如:08:00 - 12:00" autocomplete="off"
+                       class="layui-input test-item" value="">
+            </div>
+
+            <div class="layui-inline" style="margin-top: 5px;">
+                <div class="layui-btn-group">
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm createinput"
+                            lay-filter="createinput"><i class="layui-icon">&#xe654;</i></button>
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm deleteinput"
+                            lay-filter="deleteinput"><i class="layui-icon">&#xe640;</i></button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+    <div id="create_input2" style="display:none">
+        <div class="layui-form-item">
+            <label class="layui-form-label"></label>
+            <div class="layui-input-inline" style="width:350px;">
+                <input type="text" name="afternoon_time_periods[]" placeholder="请输入,格式如:14:00 - 18:00" autocomplete="off"
+                       class="layui-input test-item" value="">
+            </div>
+
+            <div class="layui-inline" style="margin-top: 5px;">
+                <div class="layui-btn-group">
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm createinput2"
+                            lay-filter="createinput"><i class="layui-icon">&#xe654;</i></button>
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm deleteinput"
+                            lay-filter="deleteinput"><i class="layui-icon">&#xe640;</i></button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+
     <script>
         layui.use(['layer', 'form', 'laydate','element'], function () {
             var layer = layui.layer,
@@ -154,27 +166,13 @@
             $(window).on('load', function () {
                 form.on('submit(admin)', function (data) {
 
-                    if($('#publish .layui-this').text() == '按时间跨度排号'){
-                        //给表单赋值
-                        form.val("myform", { //即 class="layui-form" 所在元素属性 lay-filter="" 对应的值
-                            "weeks[1]": false // "name": "value"
-                            ,"weeks[2]": false
-                            ,"weeks[3]": false
-                            ,"weeks[4]": false
-                            ,"weeks[5]": false
-                            ,"weeks[6]": false
-                            ,"weeks[7]": false
-                        });
-                    }else{
-                        //获取表单区域所有值
-                        var data = form.val("myform");
-                        if (data['weeks[1]'] == null && data['weeks[2]'] == null && data['weeks[3]'] == null && data['weeks[4]'] == null && data['weeks[5]'] == null && data['weeks[6]'] == null && data['weeks[7]'] == null) {
-                            layer.msg('请选择排号的工作日');
-                            return false;
-                        }
+                    //获取表单区域所有值
+                    var data = form.val("myform");
+                    if (data['weeks[1]'] == null && data['weeks[2]'] == null && data['weeks[3]'] == null && data['weeks[4]'] == null && data['weeks[5]'] == null && data['weeks[6]'] == null && data['weeks[7]'] == null) {
+                        layer.msg('请选择排号的工作日');
+                        return false;
                     }
 
-
                     $.ajax({
                         url: "{:url('publish')}",
                         data: $('#publish').serialize(),
@@ -184,7 +182,7 @@
                         success: function (res) {
                             if (res.code == 1) {
                                 layer.alert(res.msg, function (index) {
-                                    location.href = "{:url('admin/appointment/index')}?pid=" + res.data.pid;
+                                    location.href = "{:url('admin/appointment/publish')}?pid=" + res.data.pid;
                                 })
                             } else {
                                 layer.msg(res.msg);
@@ -194,44 +192,40 @@
                     return false;
                 });
 
-
-                //日期范围
-                laydate.render({
-                    elem: '#start_time',
-                    range: true,
-                    type: 'datetime',
-                    theme: 'molv',
-                    mark: {
-                        '{:date("Y-m-d",time())}': '今天'
-                    },
-                    calendar: true,
-                    format:'yyyy年MM月dd',
-                    value:'{:date("Y年m月d",time())} - {:date("Y年m月d",strtotime("+ 8 days",time()))}'
-                });
-                laydate.render({
-                    elem: '#morning_start_time', //指定元素
-                    range: true,
-                    type: 'time',
-                    theme: 'molv',
-                    value:'08:00:00 - 12:00:00'
-                });
-                laydate.render({
-                    elem: '#afternoon_start_time', //指定元素
-                    range: true,
-                    type: 'time',
-                    theme: 'molv',
-                    value:'14:00:00 - 18:00:00'
-                });
-                laydate.render({
-                    elem: '#night_start_time', //指定元素
-                    range: true,
-                    type: 'time',
-                    theme: 'molv',
-                    value:'20:00:00 - 23:59:59'
-                });
-
             });
         });
+
+
+        function createinput(ele) {
+            var parent = ele.parent().parent().parent();
+            parent.after($('#create_input').prop("innerHTML"));
+            init()
+        }
+        function createinput2(ele) {
+            var parent = ele.parent().parent().parent();
+            parent.after($('#create_input2').prop("innerHTML"));
+            init()
+        }
+        function deleteinput(ele) {
+            if(ele.parent().parent().next().text() == "")
+                ele.parent().parent().parent().remove();
+        }
+
+        function init() {
+            $('.createinput').off("click").click(function () {
+                createinput($(this))
+            })
+            $('.createinput2').off("click").click(function () {
+                createinput2($(this))
+            })
+            $('.deleteinput').off("click").click(function () {
+                deleteinput($(this))
+            })
+        }
+
+        $(function () {
+            init()
+        })
     </script>
 </div>
 </body>

+ 1 - 1
app/admin/view/specialist/index.html

@@ -185,7 +185,7 @@
                         area: ['80%', '90%'],
                         maxmin: true,
                         id: 'layerDemo', //防止重复弹出
-                        content: "{:url('admin/appointment/index')}?pid=" + obj.data.id
+                        content: "{:url('admin/appointment/publish')}?pid=" + obj.data.id
                     });
                 }
             });

+ 92 - 0
app/admin/view/webconfig/application_config.html

@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>layui</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" href="__PUBLIC__/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="__PUBLIC__/font-awesome/css/font-awesome.min.css" media="all"/>
+    <link rel="stylesheet" href="__CSS__/admin.css" media="all">
+</head>
+<body style="padding:10px;">
+<div class="tplay-body-div">
+
+    {include file="webconfig/tab"}
+
+    <div style="margin-top: 20px;">
+    </div>
+    <form class="layui-form" id="admin">
+
+        <div class="layui-form-item">
+            <label class="layui-form-label">爽约设置</label>
+            <div class="layui-input-inline" style="width: 60px;">
+                <input type="number" name="break_the_promise_day_range" placeholder="0" autocomplete="off" class="layui-input" value="{$web_config.break_the_promise_day_range}">
+            </div>
+            <div class="layui-form-mid">天内</div>
+            <div class="layui-form-mid">用户爽约</div>
+            <div class="layui-input-inline" style="width: 60px;">
+                <input type="number" name="break_the_promise_times" placeholder="0" autocomplete="off" class="layui-input" value="{$web_config.break_the_promise_times}">
+            </div>
+            <div class="layui-form-mid">次</div>
+            <div class="layui-form-mid">则限制</div>
+            <div class="layui-input-inline" style="width: 60px;">
+                <input type="number" name="stop_appointment_day" placeholder="0" autocomplete="off" class="layui-input" value="{$web_config.stop_appointment_day}">
+            </div>
+            <div class="layui-form-mid">天无法再预约</div>
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label">取消设置</label>
+            <div class="layui-input-inline" style="width: 60px;">
+                <input type="number" name="cancel_appointment_time" placeholder="0" autocomplete="off" class="layui-input" value="{$web_config.cancel_appointment_time}">
+            </div>
+            <div class="layui-form-mid">小时内可取消预约</div>
+        </div>
+
+        <div class="layui-form-item">
+            <label class="layui-form-label"></label>
+            <div class="layui-form-mid layui-word-aux">数字0表示不限制</div>
+        </div>
+
+        <div class="layui-form-item">
+            <div class="layui-input-block">
+                <button class="layui-btn" lay-submit lay-filter="admin">立即提交</button>
+                <button type="reset" class="layui-btn layui-btn-primary">重置</button>
+            </div>
+        </div>
+    </form>
+
+    {include file="public/foot"}
+
+    <script>
+        layui.use(['layer', 'form'], function () {
+            var layer = layui.layer,
+                $ = layui.jquery,
+                form = layui.form;
+            $(window).on('load', function () {
+                form.on('submit(admin)', function (data) {
+                    $.ajax({
+                        url: "{:url('admin/webconfig/publish')}",
+                        data: $('#admin').serialize(),
+                        type: 'post',
+                        dataType: 'json',
+                        async: false,
+                        success: function (res) {
+                            layer.msg(res.msg);
+                            if (res.code == 1) {
+                                setTimeout(function () {
+                                    location.reload();
+                                }, 1500)
+                            }
+                        }
+                    })
+                    return false;
+                });
+            });
+        });
+    </script>
+</div>
+</body>
+</html>

+ 137 - 22
app/admin/view/webconfig/appointment_config.html

@@ -20,36 +20,69 @@
     <form class="layui-form" id="admin">
 
         <div class="layui-form-item">
-            <label class="layui-form-label">爽约设置</label>
-            <div class="layui-input-inline" style="width: 60px;">
-                <input type="number" name="break_the_promise_day_range" placeholder="0" autocomplete="off" class="layui-input" value="{$web_config.break_the_promise_day_range}">
-            </div>
-            <div class="layui-form-mid">天内</div>
-            <div class="layui-form-mid">用户爽约</div>
-            <div class="layui-input-inline" style="width: 60px;">
-                <input type="number" name="break_the_promise_times" placeholder="0" autocomplete="off" class="layui-input" value="{$web_config.break_the_promise_times}">
-            </div>
-            <div class="layui-form-mid">次</div>
-            <div class="layui-form-mid">则限制</div>
-            <div class="layui-input-inline" style="width: 60px;">
-                <input type="number" name="stop_appointment_day" placeholder="0" autocomplete="off" class="layui-input" value="{$web_config.stop_appointment_day}">
+            <label class="layui-form-label">工作日</label>
+            <div class="layui-input-block">
+                <input type="checkbox" name="weeks[1]" title="周一" {in name="1" value="$web_config.weeks"}checked{/in}>
+                <input type="checkbox" name="weeks[2]" title="周二" {in name="2" value="$web_config.weeks"}checked{/in}>
+                <input type="checkbox" name="weeks[3]" title="周三" {in name="3" value="$web_config.weeks"}checked{/in}>
+                <input type="checkbox" name="weeks[4]" title="周四" {in name="4" value="$web_config.weeks"}checked{/in}>
+                <input type="checkbox" name="weeks[5]" title="周五" {in name="5" value="$web_config.weeks"}checked{/in}>
+                <input type="checkbox" name="weeks[6]" title="周六" {in name="6" value="$web_config.weeks"}checked{/in}>
+                <input type="checkbox" name="weeks[7]" title="周日" {in name="7" value="$web_config.weeks"}checked{/in}>
             </div>
-            <div class="layui-form-mid">天无法再预约</div>
         </div>
 
         <div class="layui-form-item">
-            <label class="layui-form-label">取消设置</label>
-            <div class="layui-input-inline" style="width: 60px;">
-                <input type="number" name="cancel_appointment_time" placeholder="0" autocomplete="off" class="layui-input" value="{$web_config.cancel_appointment_time}">
+            <label class="layui-form-label">上午时段</label>
+
+            <div class="layui-input-inline" style="width:350px;">
+                <input type="text" name="morning_time_periods[]" placeholder="请输入,格式如:08:00 - 12:00" autocomplete="off"
+                       class="layui-input test-item" value="">
+            </div>
+
+            <div class="layui-inline" style="margin-top: 5px;">
+                <div class="layui-btn-group">
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm createinput"
+                            lay-filter="createinput"><i class="layui-icon">&#xe654;</i></button>
+                </div>
             </div>
-            <div class="layui-form-mid">小时内可取消预约</div>
+
+            <!--<div class="layui-inline">-->
+                <!--<div class="layui-input-inline" style="width:350px;">-->
+                    <!--<input type="checkbox" name="show_morning" title="显示" checked>-->
+                <!--</div>-->
+            <!--</div>-->
         </div>
 
+
+
         <div class="layui-form-item">
-            <label class="layui-form-label"></label>
-            <div class="layui-form-mid layui-word-aux">数字0表示不限制</div>
+            <label class="layui-form-label">下午时段</label>
+
+            <div class="layui-input-inline" style="width:350px;">
+                <input type="text" name="afternoon_time_periods[]" placeholder="请输入,格式如:14:00 - 18:00" autocomplete="off"
+                       class="layui-input test-item" value="">
+            </div>
+
+            <div class="layui-inline" style="margin-top: 5px;">
+                <div class="layui-btn-group">
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm createinput2"
+                            lay-filter="createinput"><i class="layui-icon">&#xe654;</i></button>
+                </div>
+            </div>
+
+            <!--<div class="layui-inline">-->
+                <!--<div class="layui-input-inline" style="width:350px;">-->
+                    <!--<input type="checkbox" name="show_afternoon" title="显示" checked>-->
+                <!--</div>-->
+            <!--</div>-->
         </div>
 
+
+
+
         <div class="layui-form-item">
             <div class="layui-input-block">
                 <button class="layui-btn" lay-submit lay-filter="admin">立即提交</button>
@@ -58,17 +91,65 @@
         </div>
     </form>
 
+
+
+    <div id="create_input" style="display:none">
+        <div class="layui-form-item">
+            <label class="layui-form-label"></label>
+            <div class="layui-input-inline" style="width:350px;">
+                <input type="text" name="morning_time_periods[]" placeholder="请输入,格式如:08:00 - 12:00" autocomplete="off"
+                       class="layui-input test-item" value="">
+            </div>
+
+            <div class="layui-inline" style="margin-top: 5px;">
+                <div class="layui-btn-group">
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm createinput"
+                            lay-filter="createinput"><i class="layui-icon">&#xe654;</i></button>
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm deleteinput"
+                            lay-filter="deleteinput"><i class="layui-icon">&#xe640;</i></button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+    <div id="create_input2" style="display:none">
+        <div class="layui-form-item">
+            <label class="layui-form-label"></label>
+            <div class="layui-input-inline" style="width:350px;">
+                <input type="text" name="afternoon_time_periods[]" placeholder="请输入,格式如:14:00 - 18:00" autocomplete="off"
+                       class="layui-input test-item" value="">
+            </div>
+
+            <div class="layui-inline" style="margin-top: 5px;">
+                <div class="layui-btn-group">
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm createinput2"
+                            lay-filter="createinput"><i class="layui-icon">&#xe654;</i></button>
+                    <button type="button"
+                            class="layui-btn layui-btn-primary layui-btn-sm deleteinput"
+                            lay-filter="deleteinput"><i class="layui-icon">&#xe640;</i></button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+
     {include file="public/foot"}
 
     <script>
-        layui.use(['layer', 'form'], function () {
+        layui.use(['layer', 'form','laydate'], function () {
             var layer = layui.layer,
                 $ = layui.jquery,
                 form = layui.form;
+            var laydate = layui.laydate;
+
             $(window).on('load', function () {
                 form.on('submit(admin)', function (data) {
                     $.ajax({
-                        url: "{:url('admin/webconfig/publish')}",
+                        url: "{:url('admin/webconfig/appointmentConfig')}",
                         data: $('#admin').serialize(),
                         type: 'post',
                         dataType: 'json',
@@ -85,7 +166,41 @@
                     return false;
                 });
             });
+
         });
+
+
+
+        function createinput(ele) {
+            var parent = ele.parent().parent().parent();
+            parent.after($('#create_input').prop("innerHTML"));
+            init()
+        }
+        function createinput2(ele) {
+            var parent = ele.parent().parent().parent();
+            parent.after($('#create_input2').prop("innerHTML"));
+            init()
+        }
+        function deleteinput(ele) {
+            if(ele.parent().parent().next().text() == "")
+                ele.parent().parent().parent().remove();
+        }
+
+        function init() {
+            $('.createinput').off("click").click(function () {
+                createinput($(this))
+            })
+            $('.createinput2').off("click").click(function () {
+                createinput2($(this))
+            })
+            $('.deleteinput').off("click").click(function () {
+                deleteinput($(this))
+            })
+        }
+
+        $(function () {
+            init()
+        })
     </script>
 </div>
 </body>

+ 2 - 1
app/admin/view/webconfig/tab.html

@@ -1,7 +1,8 @@
 <div class="layui-tab">
     <ul class="layui-tab-title">
         <li {eq name="$Request.baseUrl" value=":url('admin/webconfig/index')"}class="layui-this"{/eq}><a href="{:url('admin/webconfig/index')}" class="a_menu">系统设置</a></li>
-        <li {eq name="$Request.baseUrl" value=":url('admin/webconfig/appointmentConfig')"}class="layui-this"{/eq}><a href="{:url('admin/webconfig/appointmentConfig')}" class="a_menu">预约设置</a></li>
+        <li {eq name="$Request.baseUrl" value=":url('admin/webconfig/appointmentConfig')"}class="layui-this"{/eq}><a href="{:url('admin/webconfig/appointmentConfig')}" class="a_menu">放号设置</a></li>
+        <li {eq name="$Request.baseUrl" value=":url('admin/webconfig/applicationConfig')"}class="layui-this"{/eq}><a href="{:url('admin/webconfig/applicationConfig')}" class="a_menu">预约设置</a></li>
         <li {eq name="$Request.baseUrl" value=":url('admin/webconfig/noticeConfig')"}class="layui-this"{/eq}><a href="{:url('admin/webconfig/noticeConfig')}" class="a_menu">来访须知</a></li>
         <!--扩展配置-->
         {foreach $tabs as $tab}

+ 9 - 9
app/api/controller/Appointment.php

@@ -4,11 +4,9 @@ namespace app\api\controller;
 
 use app\api\controller\base\Base;
 use app\common\model\Address;
-use app\common\model\Appointment as appointmentModel;
 use app\common\model\AppointmentApplication;
 use app\common\model\AppointmentTicket;
 use think\Exception;
-use time\DateHelper;
 
 class Appointment extends Base
 {
@@ -105,18 +103,20 @@ class Appointment extends Base
 
         foreach ($tickets as $k => $item) {
             $appoint = $item->appointment;
+            if (empty($appoint)) {
+                unset($item);
+                continue;
+            }
             //专家信息
             $item->specialist;
             $item->specialist->head_pic = geturl($item->specialist->head_pic, '', true);
-            //拆分预约时段
+            //预约
             $ticketPeriods = (new AppointmentApplication())->where('appointment_ticket_id', $item->id)->where('finish_time', 0)->column('appointment_time');
-            $item['morning_time_period'] = $this->setPeriodStatus(DateHelper::splitTimePeriod($appoint->morning_start_time, $appoint->morning_end_time, $appoint->morning_num), $ticketPeriods);
-            $item['afternoon_time_period'] = $this->setPeriodStatus(DateHelper::splitTimePeriod($appoint->afternoon_start_time, $appoint->afternoon_end_time, $appoint->afternoon_num), $ticketPeriods);
-            $item['night_time_period'] = $this->setPeriodStatus(DateHelper::splitTimePeriod($appoint->night_start_time, $appoint->night_end_time, $appoint->night_num), $ticketPeriods);
-            //剩余预约号码
+            $item['morning_time_period'] = $this->setPeriodStatus($appoint->morning_time_periods, $ticketPeriods);
+            $item['afternoon_time_period'] = $this->setPeriodStatus($appoint->afternoon_time_periods, $ticketPeriods);
+            //剩余预约号码个数
             $item['morning_remaining'] = count($item['morning_time_period']);
             $item['afternoon_remaining'] = count($item['afternoon_time_period']);
-            $item['night_remaining'] = count($item['night_time_period']);
             $tickets[$k] = $item;
         }
 
@@ -125,7 +125,7 @@ class Appointment extends Base
 
 
     /**
-     * @param $timePeriods array 拆分的时间段
+     * @param $timePeriods array 放号设置的时间段
      * @param $ticketPeriods array 已经预约的时间段
      * @return array
      */

+ 7 - 29
app/common/model/Appointment.php

@@ -2,10 +2,8 @@
 
 namespace app\common\model;
 
-use think\Db;
 use think\Exception;
 use think\Model;
-use time\DateHelper;
 
 class Appointment extends Model
 {
@@ -16,41 +14,21 @@ class Appointment extends Model
 
     const WEEK_TEXTS = ['', '周一', '周二', '周三', '周四', '周五', '周六', '周日'];
 
-    //appointment_date_text
-    public function getAppointmentDateTextAttr($value, $data)
-    {
-        if ($this->isWeekMode()) {
-            $weeks = explode(',', $this->weeks);
-            $week_texts = [];
-            foreach ($weeks as $week) {
-                $week_texts[] = self::WEEK_TEXTS[$week]??'';
-            }
-            return '每' . implode(',', $week_texts);
-        } else {
-            return $this->start_time . ' ~ ' . $this->end_time;
-        }
-    }
-
 
-    //start_time
-    public function getStartTimeAttr($value, $data)
+    //morning_time_periods
+    public function getMorningTimePeriodsAttr($value, $data)
     {
-        return $value ? date('Y-m-d', $value) : '';
+        return json_decode($this->morning_time_periods, true);
     }
 
-    //end_time
-    public function getEndTimeAttr($value, $data)
-    {
-        return $value ? date('Y-m-d', $value) : '';
-    }
 
-
-    //是否为工作日排号模式
-    public function isWeekMode()
+    //afternoon_time_periods
+    public function getAfternoonTimePeriodsAttr($value, $data)
     {
-        return $this->weeks ? true : false;
+        return json_decode($this->afternoon_time_periods, true);
     }
 
+
     //生成工作日号源
     public static function createWeekTicketAll($daytime)
     {

+ 34 - 1
app/install/data/db.sql

@@ -816,4 +816,37 @@ ALTER TABLE `tplay_config`
 	ADD COLUMN `image_aux` VARCHAR(50) NOT NULL DEFAULT '' AFTER `image_label`;
 
 ALTER TABLE `tplay_webconfig`
-	ADD COLUMN `cancel_appointment_time` INT NOT NULL DEFAULT 0 COMMENT '多少小时内可以取消' AFTER `notice_content`;
+	ADD COLUMN `cancel_appointment_time` INT NOT NULL DEFAULT 0 COMMENT '多少小时内可以取消' AFTER `notice_content`;
+
+
+
+ALTER TABLE `tplay_webconfig`
+	ADD COLUMN `show_morning` INT(11) NOT NULL DEFAULT '1' AFTER `cancel_appointment_time`,
+	ADD COLUMN `show_afternoon` INT(11) NOT NULL DEFAULT '1' AFTER `show_morning`;
+
+
+ALTER TABLE `tplay_webconfig`
+	ADD COLUMN `morning_time_periods` VARCHAR(2000) NOT NULL DEFAULT '' AFTER `show_night`,
+	ADD COLUMN `afternoon_time_periods` VARCHAR(2000) NOT NULL DEFAULT '' AFTER `morning_time_periods`;
+
+ALTER TABLE `tplay_webconfig`
+	ADD COLUMN `weeks` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '排号工作日' AFTER `cancel_appointment_time`;
+
+
+ALTER TABLE `tplay_appointment`
+	ADD COLUMN `morning_time_periods` VARCHAR(2000) NOT NULL DEFAULT '' AFTER `weeks`,
+	ADD COLUMN `afternoon_time_periods` VARCHAR(2000) NOT NULL DEFAULT '' AFTER `morning_time_periods`,
+	DROP COLUMN `price`,
+	DROP COLUMN `start_time`,
+	DROP COLUMN `end_time`,
+	DROP COLUMN `morning_num`,
+	DROP COLUMN `morning_start_time`,
+	DROP COLUMN `morning_end_time`,
+	DROP COLUMN `afternoon_num`,
+	DROP COLUMN `afternoon_start_time`,
+	DROP COLUMN `afternoon_end_time`,
+	DROP COLUMN `night_num`,
+	DROP COLUMN `night_start_time`,
+	DROP COLUMN `night_end_time`,
+	DROP COLUMN `create_time`,
+	DROP COLUMN `status`;