YM
2025-03-09 e786382e19c697c72c2b519d0acaa4085599e4cc
增加班次管理
3个文件已修改
4个文件已添加
1053 ■■■■■ 已修改文件
app/finance/controller/Expense.php 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/user/controller/Api.php 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/user/controller/Attendance.php 104 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/user/controller/WorkPlan.php 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/user/validate/WorkPlanCheck.php 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/user/view/work_plan/add.html 572 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/user/view/work_plan/index.html 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/finance/controller/Expense.php
@@ -104,8 +104,7 @@
            }
            $list = $this->model->datalist($param,$where,$whereOr);
            return table_assign(0, '', $list);
        }
        else{
        } else {
            return view();
        }
    }
@@ -123,13 +122,11 @@
            $cost = 0;
            if ($amountData == 0) {
                return to_assign(1,'报销金额不完善');
            }
            else{
            } else {
                foreach ($amountData as $key => $value) {
                    if ($value == 0) {
                        return to_assign(1,'第' . ($key + 1) . '条报销选项的金额不能为零');
                    }
                    else{
                    } else {
                        $cost+=$value;
                    }
                }
@@ -191,8 +188,7 @@
                return view('qiye@/finance/view_expense');
            }
            return view();
        }
        else{
        } else {
            return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']);
        }
    }
app/user/controller/Api.php
@@ -29,4 +29,15 @@
        }
    }
    //删除班次考勤时间
    public function del_work_plan_time()
    {
        $id = get_params("id");
        if (Db::name('AttendanceWorkTime')->where('id', $id)->update(['is_del'=>1]) !== false) {
            return to_assign(0, "删除成功");
        } else {
            return to_assign(1, "删除失败");
        }
    }
}
app/user/controller/Attendance.php
@@ -15,12 +15,13 @@
    public function index()
    {
        if (request()->isAjax()) {
            $list = Db::name('Position')->where('status', '>=', 0)->order('create_time asc')->select()->toArray();
            foreach ($list as &$val) {
                $groupId = Db::name('PositionGroup')->where(['pid' => $val['id']])->column('group_id');
                $groupName = Db::name('AdminGroup')->where('id', 'in', $groupId)->column('title');
                $val['groupName'] = implode(',', $groupName);
            }
            $list = Db::name('AttendanceGroup')->where('is_del', '=', 0)->order('create_time asc')->select()->toArray();
            // var_dump($list);
            // foreach ($list as &$val) {
            //     $groupId = Db::name('PositionGroup')->where(['pid' => $val['id']])->column('group_id');
            //     $groupName = Db::name('AdminGroup')->where('id', 'in', $groupId)->column('title');
            //     $val['groupName'] = implode(',', $groupName);
            // }
            $res['data'] = $list;
            return table_assign(0, '', $res);
        } else {
@@ -33,20 +34,17 @@
    {
        $param = get_params();
        if (request()->isAjax()) {
            // if (!empty($param['id']) && $param['id'] > 0) {
            //     if($param['id']==1){
            //         return to_assign(1, '超级管理员不能编辑');
            //     }
            //     try {
            //         validate(PositionCheck::class)->scene('edit')->check($param);
            //     } catch (ValidateException $e) {
            //         // 验证失败 输出错误信息
            //         return to_assign(1, $e->getError());
            //     }
            //     // 启动事务
            //     Db::startTrans();
            //     try {
            //         Db::name('Position')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
            if (!empty($param['id']) && $param['id'] > 0) {
                try {
                    validate(PositionCheck::class)->scene('edit')->check($param);
                } catch (ValidateException $e) {
                    // 验证失败 输出错误信息
                    return to_assign(1, $e->getError());
                }
                // 启动事务
                Db::startTrans();
                try {
                    Db::name('AttendanceGroup')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
            //         Db::name('PositionGroup')->where(['pid' => $param['id']])->delete();
            //         foreach ($param['group_id'] as $k => $v) {
            //             $data[$k] = [
@@ -56,28 +54,28 @@
            //             ];
            //         }
            //         Db::name('PositionGroup')->strict(false)->field(true)->insertAll($data);
            //         add_log('edit', $param['id'], $param);
            //         //清除菜单\权限缓存
                    add_log('edit', $param['id'], $param);
                    //清除菜单\权限缓存
            //         clear_cache('adminMenu');
            //         clear_cache('adminRules');
            //         // 提交事务
            //         Db::commit();
            //     } catch (\Exception $e) {
            //         // 回滚事务
            //         Db::rollback();
            //         return to_assign(1, '提交失败:' . $e->getMessage());
            //     }
            // } else {
            //     try {
            //         validate(PositionCheck::class)->scene('add')->check($param);
            //     } catch (ValidateException $e) {
            //         // 验证失败 输出错误信息
            //         return to_assign(1, $e->getError());
            //     }
            //     // 启动事务
            //     Db::startTrans();
            //     try {
            //         $uid = Db::name('Position')->strict(false)->field(true)->insertGetId($param);
                    // 提交事务
                    Db::commit();
                } catch (\Exception $e) {
                    // 回滚事务
                    Db::rollback();
                    return to_assign(1, '提交失败:' . $e->getMessage());
                }
            } else {
                try {
                    validate(PositionCheck::class)->scene('add')->check($param);
                } catch (ValidateException $e) {
                    // 验证失败 输出错误信息
                    return to_assign(1, $e->getError());
                }
                // 启动事务
                Db::startTrans();
                try {
                    $uid = Db::name('AttendanceGroup')->strict(false)->field(true)->insertGetId($param);
            //         foreach ($param['group_id'] as $k => $v) {
            //             $data[$k] = [
            //                 'pid' => $uid,
@@ -86,22 +84,22 @@
            //             ];
            //         }
            //         Db::name('PositionGroup')->strict(false)->field(true)->insertAll($data);
            //         add_log('add', $uid, $param);
            //         // 提交事务
            //         Db::commit();
            //     } catch (\Exception $e) {
            //         // 回滚事务
            //         Db::rollback();
            //         return to_assign(1, '提交失败:' . $e->getMessage());
            //     }
            // }
                    add_log('add', $uid, $param);
                    // 提交事务
                    Db::commit();
                } catch (\Exception $e) {
                    // 回滚事务
                    Db::rollback();
                    return to_assign(1, '提交失败:' . $e->getMessage());
                }
            }
            return to_assign();
        }
        else{
            // $id = isset($param['id']) ? $param['id'] : 0;
            $id = isset($param['id']) ? $param['id'] : 0;
            // $group = Db::name('AdminGroup')->order('create_time asc')->select()->toArray();
            // if ($id > 0) {
            //     $detail = Db::name('Position')->where(['id' => $id])->find();
                $detail = Db::name('AttendanceGroup')->where(['id' => $id])->find();
            //     $detail['group_id'] = Db::name('PositionGroup')->where(['pid' => $id])->column('group_id');
            //     foreach ($group as &$val) {
            //         if (in_array($val['id'], $detail['group_id'])) {
@@ -110,10 +108,10 @@
            //             $val['checked'] = 0;
            //         }
            //     }
            //     View::assign('detail', $detail);
                View::assign('detail', $detail);
            // }
            // View::assign('group', $group);
            // View::assign('id', $id);
            View::assign('id', $id);
            return view();
        }
    }
app/user/controller/WorkPlan.php
New file
@@ -0,0 +1,166 @@
<?php
declare(strict_types=1);
namespace app\user\controller;
use app\base\BaseController;
use app\user\validate\WorkPlanCheck;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class WorkPlan extends BaseController
{
    public function index()
    {
        if (request()->isAjax()) {
            $list = Db::name('AttendanceWorkPlan')->where('is_del', '=', 0)->order('create_time asc')->select()->each(function ($item, $key) {
                $item['create_time'] = date('Y-m-d H:i:s', $item['create_time']);
                $item['update_time'] = $item['update_time'] > 0 ? date('Y-m-d H:i:s', $item['update_time']) : "";
                return $item;
            })->toArray();
            foreach ($list as &$val) {
                $mappingTimes = Db::name('AttendanceWorkPlanWorkTimeLink')->where(['work_plan_id' => $val['id']])->column('work_time_id');
                $times = Db::name('AttendanceWorkTime')->where('id', 'in', $mappingTimes)->where('is_del', '=', 0)->select()->toArray();
                $val['times'] = $times;
            }
            $res['data'] = $list;
            return table_assign(0, '', $res);
        } else {
            return view();
        }
    }
    //添加&编辑
    public function add()
    {
        $param = get_params();
        if (request()->isAjax()) {
            if (!empty($param['id']) && $param['id'] > 0) {
                try {
                    validate(WorkPlanCheck::class)->scene('edit')->check($param);
                } catch (ValidateException $e) {
                    // 验证失败 输出错误信息
                    return to_assign(1, $e->getError());
                }
                // 启动事务
                Db::startTrans();
                try {
                    // 处理时间
                    foreach ($param['begin_time'] as $key => $value) {
                        if (!$value) {
                            continue;
                        }
                        $timeData = [
                            'id' => intval($param['time_id'][$key]),
                            'begin_time' => $param['begin_time'][$key],
                            'need_begin_check' => intval($param['need_begin_check'][$key]),
                            'end_time' => $param['end_time'][$key],
                            'need_end_check' => intval($param['need_end_check'][$key]),
                            'check_begin_start_time' => $param['check_begin_start_time'][$key],
                            'check_begin_end_time' => $param['check_begin_end_time'][$key],
                            'check_end_start_time' => $param['check_end_start_time'][$key],
                            'check_end_end_time' => $param['check_end_end_time'][$key],
                        ];
                        if ($timeData['id'] > 0) {
                            // 更新
                            $resa = Db::name('AttendanceWorkTime')->strict(false)->field(true)->update($timeData);
                        } else {
                            // 新增
                            unset($timeData['id']);
                            $timeId = Db::name('AttendanceWorkTime')->strict(false)->field(true)->insertGetId($timeData);
                            $mappingData = [
                                'work_plan_id' => $param['id'],
                                'work_time_id' => $timeId,
                            ];
                            $mappingId = Db::name('AttendanceWorkPlanWorkTimeLink')->strict(false)->field(true)->insertGetId($mappingData);
                        }
                    }
                    // 处理班次
                    $param['update_time'] = time();
                    Db::name('AttendanceWorkPlan')->where(['id' => $param['id']])->strict(false)->field(true)->update($param);
                    add_log('edit', $param['id'], $param);
                    // 提交事务
                    Db::commit();
                } catch (\Exception $e) {
                    // 回滚事务
                    Db::rollback();
                    return to_assign(1, '提交失败:' . $e->getMessage());
                }
            } else {
                try {
                    validate(WorkPlanCheck::class)->scene('add')->check($param);
                } catch (ValidateException $e) {
                    // 验证失败 输出错误信息
                    return to_assign(1, $e->getError());
                }
                // 启动事务
                Db::startTrans();
                try {
                    // 插入班次表
                    $param['is_del'] = 0;
                    $param['create_time'] = time();
                    unset($param['id']);
                    $uid = Db::name('AttendanceWorkPlan')->strict(false)->field(true)->insertGetId($param);
                    // 插入时间表
                    for ($i = 0; $i < count($param['begin_time']); $i++) {
                        // 获取时间数据
                        $timeData = [
                            'begin_time' => $param['begin_time'][$i],
                            'need_begin_check' => intval($param['need_begin_check'][$i]),
                            'end_time' => $param['end_time'][$i],
                            'need_end_check' => intval($param['need_end_check'][$i]),
                            'check_begin_start_time' => $param['check_begin_start_time'][$i],
                            'check_begin_end_time' => $param['check_begin_end_time'][$i],
                            'check_end_start_time' => $param['check_end_start_time'][$i],
                            'check_end_end_time' => $param['check_end_end_time'][$i],
                        ];
                        // 插入时间数据
                        $timeIds[$i] = Db::name('AttendanceWorkTime')->strict(false)->field(true)->insertGetId($timeData);
                    }
                    // mapping数据
                    foreach ($timeIds as $key => $value) {
                        $mappingData[$key] = [
                            'work_plan_id' => $uid,
                            'work_time_id' => $value,
                        ];
                    }
                    Db::name('AttendanceWorkPlanWorkTimeLink')->strict(false)->field(true)->insertAll($mappingData);
                    add_log('add', $uid, $param);
                    // 提交事务
                    Db::commit();
                } catch (\Exception $e) {
                    // 回滚事务
                    Db::rollback();
                    return to_assign(1, '提交失败:' . $e->getMessage());
                }
            }
            return to_assign();
        } else {
            $id = isset($param['id']) ? $param['id'] : 0;
            if ($id > 0) {
                $detail = Db::name('AttendanceWorkPlan')->where(['id' => $id])->find();
                $mappingTimes = Db::name('AttendanceWorkPlanWorkTimeLink')->where(['work_plan_id' => $id])->column('work_time_id');
                $times = Db::name('AttendanceWorkTime')->where('id', 'in', $mappingTimes)->where('is_del', '=', 0)->select()->toArray();
                $detail['times'] = $times;
                View::assign('detail', $detail);
            }
            View::assign('id', $id);
            return view();
        }
    }
    // 删除
    public function delete()
    {
        $id = get_params("id");
        if (Db::name('AttendanceWorkPlan')->where('id', $id)->update(['is_del'=>1]) !== false) {
            add_log('delete',  $id,[],'班次');
            return to_assign(0, "删除成功");
        } else {
            return to_assign(1, "删除失败");
        }
    }
}
app/user/validate/WorkPlanCheck.php
New file
@@ -0,0 +1,49 @@
<?php
/**
+-----------------------------------------------------------------------------------------------
* GouGuOPEN [ 左手研发,右手开源,未来可期!]
+-----------------------------------------------------------------------------------------------
* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
+-----------------------------------------------------------------------------------------------
* @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
+-----------------------------------------------------------------------------------------------
* @Author 勾股工作室 <hdm58@qq.com>
+-----------------------------------------------------------------------------------------------
*/
namespace app\user\validate;
use think\facade\Db;
use think\Validate;
class WorkPlanCheck extends Validate
{
    // 自定义验证规则
    protected function checkUnique($value, $rule, $data)
    {
        [$table, $field, $id] = explode(',', $rule);
        $idField = $id ?: 'id';
        $idValue = $data[$idField] ?? null;
        $map = [
            [$field, '=', $value],
        ];
        if (!is_null($idValue)) {
            $map[] = [$idField, '<>', $idValue];
        }
        return !Db::name(name: $table)->where($map)->count();
    }
    protected $rule = [
        'name' => 'require|checkUnique:AttendanceWorkPlan,name,id',
        'id' => 'require'
    ];
    protected $message = [
        'name.require' => '班次名称不能为空',
        'name.checkUnique' => '同样的班次名称已经存在',
        'id.require' => '缺少更新条件',
    ];
    protected $scene = [
        'add' => ['name'],
        'edit' => ['name', 'id'],
    ];
}
app/user/view/work_plan/add.html
New file
@@ -0,0 +1,572 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
  <h3 class="pb-3">班次</h3>
  {if condition="$id eq 0"}
  <table class="layui-table">
    <tr>
      <td class="layui-td-gray">班次名称<font>*</font></td>
      <td colspan="3">
        <input
          type="text"
          name="name"
          lay-verify="required"
          autocomplete="off"
          placeholder="请输入班次名称"
          lay-reqText="请输入班次名称"
          class="layui-input"
        />
      </td>
    </tr>
    <tr>
      <td class="layui-td-gray">时间设置<font>*</font></td>
      <td colspan="5">
        <table
          id="timeBox"
          class="layui-table layui-table-min"
          style="margin: 0"
        >
          <tr>
            <th width="180">上班时间</th>
            <th width="100">上班是否打卡</th>
            <th width="180">下班时间</th>
            <th width="100">下班是否打卡</th>
            <th>打卡时段</th>
            <th width="60">操作</th>
          </tr>
          <tr class="timeItem">
            <td>
              <input
                type="text"
                class="layui-input tool-time"
                data-type="time"
                data-format="HH:mm"
                name="begin_time[]"
                lay-verify="required"
                placeholder="请选择时间"
                lay-reqText="请选择时间"
                readonly
                value=""
              />
            </td>
            <td style="text-align: left">
              <select
                name="need_begin_check[]"
                lay-verify="required"
                lay-reqText="请选择"
              >
                <option value="">请选择</option>
                <option value="1">是</option>
                <option value="0">否</option>
              </select>
            </td>
            <td>
              <input
                type="text"
                class="layui-input tool-time"
                                data-type="time"
                data-format="HH:mm"
                name="end_time[]"
                lay-verify="required"
                placeholder="请选择时间"
                lay-reqText="请选择时间"
                readonly
              />
            </td>
            <td style="text-align: left">
              <select
                name="need_end_check[]"
                lay-verify="required"
                lay-reqText="请选择"
              >
                <option value="">请选择</option>
                <option value="1">是</option>
                <option value="0">否</option>
              </select>
            </td>
            <td style="text-align: left">
              <div
                style="
                  display: flex;
                  line-height: 36px;
                  gap: 10px;
                  margin-bottom: 10px;
                "
              >
                <span>上班前</span>
                <select
                  name="check_begin_start_time[]"
                  lay-reqText="请选择"
                >
                  <option value="">未设置</option>
                  <option value="10">10分钟</option>
                  <option value="30">半小时</option>
                  <option value="60">一小时</option>
                </select>
                <span>→ 上班后</span>
                <select
                  name="check_begin_end_time[]"
                  lay-reqText="请选择"
                >
                  <option value="">未设置</option>
                  <option value="10">10分钟</option>
                  <option value="30">半小时</option>
                  <option value="60">一小时</option>
                </select>
              </div>
              <div style="display: flex; line-height: 36px; gap: 10px">
                <span>下班前</span>
                <select
                  name="check_end_start_time[]"
                  lay-reqText="请选择"
                >
                  <option value="">未设置</option>
                  <option value="10">10分钟</option>
                  <option value="30">半小时</option>
                  <option value="60">一小时</option>
                </select>
                <span>→ 下班后</span>
                <select
                  name="check_end_end_time[]"
                  lay-reqText="请选择"
                >
                  <option value="">未设置</option>
                  <option value="10">10分钟</option>
                  <option value="30">半小时</option>
                  <option value="60">一小时</option>
                </select>
              </div>
            </td>
            <td>
              <a
                class="layui-btn layui-btn-danger layui-btn-xs"
                data-id="0"
                lay-event="del"
                >删除</a
              >
            </td>
          </tr>
        </table>
        <div class="pt-2">
          <button class="layui-btn layui-btn-sm" type="button" id="addTimeBtn">
            + 上下班时间选项
          </button>
        </div>
      </td>
    </tr>
    <tr>
      <td class="layui-td-gray">弹性打卡</td>
      <td colspan="3" style="display: flex; line-height: 36px; gap: 10px">
        <p>上班后</p>
        <select
          name="check_begin_bounce"
          lay-reqText="请选择"
        >
          <option value="">未设置</option>
          <option value="5">5分钟</option>
          <option value="10">10分钟</option>
          <option value="30">半小时</option>
        </select>
        <p>下班前</p>
        <select
          name="check_end_bounce"
          lay-reqText="请选择"
        >
          <option value="">未设置</option>
          <option value="5">5分钟</option>
          <option value="10">10分钟</option>
          <option value="30">半小时</option>
        </select>
      </td>
    </tr>
  </table>
  {else/}
  <table class="layui-table layui-table-form">
    <tr>
      <td class="layui-td-gray">班次名称<font>*</font></td>
      <td>
        <input
          type="text"
          name="name"
          value="{$detail.name}"
          lay-verify="required"
          autocomplete="off"
          placeholder="请输入班次名称"
          lay-reqText="请输入班次名称"
          class="layui-input"
        />
      </td>
    </tr>
    <tr>
      <td class="layui-td-gray">时间设置<font>*</font></td>
      <td colspan="5">
        <table
          id="timeBox"
          class="layui-table layui-table-min"
          style="margin: 0"
        >
          <tr>
            <th width="180">上班时间</th>
            <th width="100">上班是否打卡</th>
            <th width="180">下班时间</th>
            <th width="100">下班是否打卡</th>
            <th>打卡时段</th>
            <th width="60">操作</th>
          </tr>
                    {volist name="$detail.times" id="val"}
          <tr class="timeItem">
            <td>
              <input
                type="text"
                class="layui-input tool-time"
                data-type="time"
                data-format="HH:mm"
                name="begin_time[]"
                lay-verify="required"
                placeholder="请选择时间"
                lay-reqText="请选择时间"
                readonly
                value="{$val.begin_time}"
              />
            </td>
            <td style="text-align: left">
              <select
                name="need_begin_check[]"
                lay-verify="required"
                lay-reqText="请选择"
              >
                <option value="">请选择</option>
                                <option value="1" {eq name="1" value="$val.need_begin_check"} selected{/eq}>是</option>
                <option value="0" {eq name="0" value="$val.need_begin_check"} selected{/eq}>否</option>
              </select>
            </td>
            <td>
              <input
                type="text"
                class="layui-input tool-time"
                                data-type="time"
                data-format="HH:mm"
                name="end_time[]"
                lay-verify="required"
                placeholder="请选择时间"
                lay-reqText="请选择时间"
                readonly
                value="{$val.end_time}"
              />
            </td>
            <td style="text-align: left">
              <select
                name="need_end_check[]"
                lay-verify="required"
                lay-reqText="请选择"
              >
                <option value="">请选择</option>
                                <option value="1" {eq name="1" value="$val.need_end_check"} selected{/eq}>是</option>
                <option value="0" {eq name="0" value="$val.need_end_check"} selected{/eq}>否</option>
              </select>
            </td>
            <td style="text-align: left">
              <div
                style="
                  display: flex;
                  line-height: 36px;
                  gap: 10px;
                  margin-bottom: 10px;
                "
              >
                <span>上班前</span>
                <select
                  name="check_begin_start_time[]"
                  lay-reqText="请选择"
                >
                  <option value="">未设置</option>
                                    <option value="10" {eq name="10" value="$val.check_begin_start_time"} selected{/eq}>10分钟</option>
                  <option value="30" {eq name="30" value="$val.check_begin_start_time"} selected{/eq}>半小时</option>
                  <option value="60" {eq name="60" value="$val.check_begin_start_time"} selected{/eq}>一小时</option>
                </select>
                <span>→ 上班后</span>
                <select
                  name="check_begin_end_time[]"
                  lay-reqText="请选择"
                >
                  <option value="">未设置</option>
                                    <option value="10" {eq name="10" value="$val.check_begin_end_time"} selected{/eq}>10分钟</option>
                  <option value="30" {eq name="30" value="$val.check_begin_end_time"} selected{/eq}>半小时</option>
                  <option value="60" {eq name="60" value="$val.check_begin_end_time"} selected{/eq}>一小时</option>
                </select>
              </div>
              <div style="display: flex; line-height: 36px; gap: 10px">
                <span>下班前</span>
                <select
                  name="check_end_start_time[]"
                  lay-reqText="请选择"
                >
                  <option value="">未设置</option>
                                    <option value="10" {eq name="10" value="$val.check_end_start_time"} selected{/eq}>10分钟</option>
                  <option value="30" {eq name="30" value="$val.check_end_start_time"} selected{/eq}>半小时</option>
                  <option value="60" {eq name="60" value="$val.check_end_start_time"} selected{/eq}>一小时</option>
                </select>
                <span>→ 下班后</span>
                <select
                  name="check_end_end_time[]"
                  lay-reqText="请选择"
                >
                  <option value="">未设置</option>
                                    <option value="10" {eq name="10" value="$val.check_end_end_time"} selected{/eq}>10分钟</option>
                  <option value="30" {eq name="30" value="$val.check_end_end_time"} selected{/eq}>半小时</option>
                  <option value="60" {eq name="60" value="$val.check_end_end_time"} selected{/eq}>一小时</option>
                </select>
              </div>
            </td>
            <td>
                            <input type="hidden" name="time_id[]" class="layui-input" value="{$val.id}">
              <a
                class="layui-btn layui-btn-danger layui-btn-xs"
                data-id="{$val.id}"
                lay-event="del"
                >删除</a
              >
            </td>
          </tr>
                    {/volist}
        </table>
        <div class="pt-2">
          <button class="layui-btn layui-btn-sm" type="button" id="addTimeBtn">
            + 上下班时间选项
          </button>
        </div>
      </td>
    </tr>
    <tr>
      <td class="layui-td-gray">弹性打卡</td>
      <td colspan="3" style="display: flex; line-height: 36px; gap: 10px">
        <p>上班后</p>
        <select
          name="check_begin_bounce"
          lay-reqText="请选择"
        >
          <option value="">未设置</option>
                    <option value="5" {eq name="5" value="$detail.check_begin_bounce"} selected{/eq}>5分钟</option>
          <option value="10" {eq name="10" value="$detail.check_begin_bounce"} selected{/eq}>10分钟</option>
          <option value="30" {eq name="30" value="$detail.check_begin_bounce"} selected{/eq}>半小时</option>
        </select>
        <p>下班前</p>
        <select
          name="check_end_bounce"
          lay-reqText="请选择"
        >
          <option value="">未设置</option>
                    <option value="5" {eq name="5" value="$detail.check_end_bounce"} selected{/eq}>5分钟</option>
          <option value="10" {eq name="10" value="$detail.check_end_bounce"} selected{/eq}>10分钟</option>
          <option value="30" {eq name="30" value="$detail.check_end_bounce"} selected{/eq}>半小时</option>
        </select>
      </td>
    </tr>
  </table>
  {/if}
  <div class="pt-4">
    <input type="hidden" name="id" value="{$id}" />
    <button
      class="layui-btn layui-btn-normal"
      lay-submit=""
      lay-filter="webform"
    >
      立即提交
    </button>
    <button type="reset" class="layui-btn layui-btn-primary">重置</button>
  </div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
  const moduleInit = ["tool"];
  function gouguInit() {
        //添加报销信息表格
        $('#addTimeBtn').on('click',function(){
            var html = '';
            html += '<tr class="timeItem">\
            <td>\
              <input\
                type="text"\
                class="layui-input tool-time"\
                data-type="time"\
                data-format="HH:mm"\
                name="begin_time[]"\
                lay-verify="required"\
                placeholder="请选择时间"\
                lay-reqText="请选择时间"\
                readonly\
                value=""\
              />\
            </td>\
            <td style="text-align: left">\
              <select\
                name="need_begin_check[]"\
                lay-verify="required"\
                lay-reqText="请选择"\
              >\
                <option value="">请选择</option>\
                <option value="1">是</option>\
                <option value="0">否</option>\
              </select>\
            </td>\
            <td>\
              <input\
                type="text"\
                class="layui-input tool-time"\
                                data-type="time"\
                data-format="HH:mm"\
                name="end_time[]"\
                lay-verify="required"\
                placeholder="请选择时间"\
                lay-reqText="请选择时间"\
                readonly\
                value=""\
              />\
            </td>\
            <td style="text-align: left">\
              <select\
                name="need_end_check[]"\
                lay-verify="required"\
                lay-reqText="请选择"\
              >\
                <option value="">请选择</option>\
                <option value="1">是</option>\
                <option value="0">否</option>\
              </select>\
            </td>\
            <td style="text-align: left">\
              <div\
                style="\
                  display: flex;\
                  line-height: 36px;\
                  gap: 10px;\
                  margin-bottom: 10px;\
                "\
              >\
                <span>上班前</span>\
                <select\
                  name="check_begin_start_time[]"\
                  lay-reqText="请选择"\
                >\
                  <option value="">未设置</option>\
                  <option value="10">10分钟</option>\
                  <option value="30">半小时</option>\
                  <option value="60">一小时</option>\
                </select>\
                <span>→ 上班后</span>\
                <select\
                  name="check_begin_end_time[]"\
                  lay-reqText="请选择"\
                >\
                  <option value="">未设置</option>\
                  <option value="10">10分钟</option>\
                  <option value="30">半小时</option>\
                  <option value="60">一小时</option>\
                </select>\
              </div>\
              <div style="display: flex; line-height: 36px; gap: 10px">\
                <span>下班前</span>\
                <select\
                  name="check_end_start_time[]"\
                  lay-reqText="请选择"\
                >\
                  <option value="">未设置</option>\
                  <option value="10">10分钟</option>\
                  <option value="30">半小时</option>\
                  <option value="60">一小时</option>\
                </select>\
                <span>→ 下班后</span>\
                <select\
                  name="check_end_end_time[]"\
                  lay-reqText="请选择"\
                >\
                  <option value="">未设置</option>\
                  <option value="10">10分钟</option>\
                  <option value="30">半小时</option>\
                  <option value="60">一小时</option>\
                </select>\
              </div>\
            </td>\
            <td>\
                            <input type="hidden" name="time_id[]" class="layui-input" value="0">\
              <a\
                class="layui-btn layui-btn-danger layui-btn-xs"\
                data-id="0"\
                lay-event="del"\
                >删除</a\
              >\
            </td>\
          </tr>';
            $("#timeBox").append(html);
            form.render();
        });
        $('#timeBox').on('click', '[lay-event="del"]', function() {
            if($('.timeItem').length<2){
                layer.msg('至少保留一个时间设置');
                return false;
            }
            var that=$(this);
            var _id = that.data('id');
            if (_id > 0) {
                layer.confirm('确定删除该时间设置?', {
                    icon: 3,
                    title: '提示'
                }, function(index) {
                    $.ajax({
                        url: "/user/api/del_work_plan_time",
                        type:'post',
                        data: {id: _id},
                        success: function(res) {
                            layer.msg(res.msg);
                            if (res.code == 0) {
                                that.parents(".timeItem").remove();
                            }
                        }
                    })
                    layer.close(index);
                });
            } else {
                $(this).parents(".timeItem").remove();
            }
        });
    var form = layui.form,
      tool = layui.tool;
    form.on("submit(webform)", function (data) {
      let callback = function (e) {
        layer.msg(e.msg);
        if (e.code == 0) {
          setTimeout(function () {
            parent.location.reload();
          }, 1000);
        }
      };
      tool.post("/user/workPlan/add", data.field, callback);
      return false;
    });
    //监听提交
    form.on("submit(webform)", function (data) {
      let callback = function (e) {
        layer.msg(e.msg);
        if (e.code == 0) {
          tool.sideClose(1000);
        }
      };
      tool.post("/user/workPlan/add", data.field, callback);
      return false;
    });
  }
</script>
{/block}
<!-- /脚本 -->
app/user/view/work_plan/index.html
New file
@@ -0,0 +1,139 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
  <table class="layui-hide" id="test" lay-filter="test"></table>
</div>
<script type="text/html" id="status">
  <i
    class="layui-icon {{#  if(d.status == 1){ }}green layui-icon-ok{{#  } else { }}yellow layui-icon-close{{#  } }}"
  ></i>
</script>
<script type="text/html" id="toolbarDemo">
  <div class="layui-btn-container">
    <button class="layui-btn layui-btn-sm" lay-event="add">+ 添加班次</button>
  </div>
</script>
<script type="text/html" id="barDemo">
  <div class="layui-btn-group">
    <button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button
    ><button class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">
      删除
    </button>
  </div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
  const moduleInit = ["tool"];
  function gouguInit() {
    var table = layui.table,
      tool = layui.tool;
    layui.pageTable = table.render({
      elem: "#test",
      title: "班次列表",
      toolbar: "#toolbarDemo",
      defaultToolbar: false,
      url: "/user/workPlan/index", //数据接口
      page: false, //开启分页
      cols: [
        [
          {
            field: "name",
            title: "班次名称",
            align: "center",
            width: 300
          },
          {
            field: "times",
            title: "考勤时间",
            templet: function (d) {
              var html = "";
              if (d.times && d.times.length) {
                for (var i = 0; i < d.times.length; i++) {
                  html +=
                    "<span style='margin-right: 30px'>" +
                    d.times[i].begin_time +
                    " - " +
                    d.times[i].end_time +
                    "</span>";
                }
              } else {
                html = "-";
              }
              return html;
            }
          },
          {
            field: "create_time",
            title: "创建时间",
            align: "center",
            width: 200
          },
          {
            field: "update_time",
            title: "更新时间",
            align: "center",
            width: 200,
            templet: function (d) {
              if (d.update_time) {
                return d.update_time;
              } else {
                return "-";
              }
            }
          },
          {
            field: "right",
            title: "操作",
            toolbar: "#barDemo",
            width: 120,
            align: "center"
          }
        ]
      ]
    });
    //表头工具栏事件
    table.on("toolbar(test)", function (obj) {
      if (obj.event === "add") {
        tool.side("/user/workPlan/add");
        return;
      }
    });
    //监听行工具事件
    table.on("tool(test)", function (obj) {
      var data = obj.data;
      if (obj.event === "edit") {
        tool.side("/user/workPlan/add?id=" + data.id);
        return;
      }
      if (obj.event === "del") {
        layer.confirm(
          "您确定要删除该班次",
          {
            icon: 3,
            title: "提示"
          },
          function (index) {
            let callback = function (e) {
              layer.msg(e.msg);
              if (e.code == 0) {
                obj.del();
              }
            };
            tool.delete("/user/workPlan/delete", { id: obj.data.id }, callback);
            layer.close(index);
          }
        );
      }
    });
  }
</script>
{/block}
<!-- /脚本 -->