From e786382e19c697c72c2b519d0acaa4085599e4cc Mon Sep 17 00:00:00 2001
From: YM <479443481@qq.com>
Date: 星期日, 09 三月 2025 19:52:33 +0800
Subject: [PATCH] 增加班次管理

---
 app/user/controller/WorkPlan.php    |  166 +++++++
 app/user/validate/WorkPlanCheck.php |   49 ++
 app/finance/controller/Expense.php  |  254 +++++-----
 app/user/controller/Api.php         |   11 
 app/user/view/work_plan/index.html  |  139 ++++++
 app/user/view/work_plan/add.html    |  572 ++++++++++++++++++++++++
 app/user/controller/Attendance.php  |  142 +++---
 7 files changed, 1,132 insertions(+), 201 deletions(-)

diff --git a/app/finance/controller/Expense.php b/app/finance/controller/Expense.php
index 6b6678d..260db98 100644
--- a/app/finance/controller/Expense.php
+++ b/app/finance/controller/Expense.php
@@ -10,8 +10,8 @@
 * @Author 鍕捐偂宸ヤ綔瀹� <hdm58@qq.com>
 +-----------------------------------------------------------------------------------------------
 */
- 
-declare (strict_types = 1);
+
+declare(strict_types=1);
 
 namespace app\finance\controller;
 
@@ -25,220 +25,216 @@
 class Expense extends BaseController
 {
 	/**
-     * 鏋勯�犲嚱鏁�
-     */
+	 * 鏋勯�犲嚱鏁�
+	 */
 	protected $model;
-    public function __construct()
-    {
+	public function __construct()
+	{
 		parent::__construct(); // 璋冪敤鐖剁被鏋勯�犲嚱鏁�
-        $this->model = new ExpenseModel();
-    }
-	
-    /**
-    * 鏁版嵁鍒楄〃
-    */
-    public function datalist()
-    {
+		$this->model = new ExpenseModel();
+	}
+
+	/**
+	 * 鏁版嵁鍒楄〃
+	 */
+	public function datalist()
+	{
 		$param = get_params();
-        if (request()->isAjax()) {
+		if (request()->isAjax()) {
 			$tab = isset($param['tab']) ? $param['tab'] : 0;
 			$uid = $this->uid;
-            $where = array();
-            $whereOr = array();
-			$where[]=['delete_time','=',0];
-			if($tab == 0){
+			$where = array();
+			$whereOr = array();
+			$where[] = ['delete_time', '=', 0];
+			if ($tab == 0) {
 				//鍏ㄩ儴
 				$whereOr[] = ['admin_id', '=', $this->uid];
 				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
 				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
 				$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
 				$auth = isAuthExpense($uid);
-				if($auth == 0){
-					$dids_a = get_leader_departments($uid);	
+				if ($auth == 0) {
+					$dids_a = get_leader_departments($uid);
 					$dids_b = get_role_departments($uid);
 					$dids = array_merge($dids_a, $dids_b);
-					if(!empty($dids)){
-						$whereOr[] = ['did','in',$dids];
+					if (!empty($dids)) {
+						$whereOr[] = ['did', 'in', $dids];
 					}
 				}
 			}
-			if($tab == 1){
+			if ($tab == 1) {
 				//鎴戝垱寤虹殑
 				$where[] = ['admin_id', '=', $this->uid];
 			}
-			if($tab == 2){
+			if ($tab == 2) {
 				//寰呮垜瀹℃牳鐨�
 				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")];
 			}
-			if($tab == 3){
+			if ($tab == 3) {
 				//鎴戝凡瀹℃牳鐨�
 				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")];
 			}
-			if($tab == 4){
+			if ($tab == 4) {
 				//鎶勯�佺粰鎴戠殑
 				$where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")];
 			}
-			if($tab == 5){
+			if ($tab == 5) {
 				//宸叉墦娆剧殑
 				$where[] = ['pay_status', '=', 1];
 				$auth = isAuthExpense($uid);
-				if($auth == 0){
-					$dids_a = get_leader_departments($uid);	
+				if ($auth == 0) {
+					$dids_a = get_leader_departments($uid);
 					$dids_b = get_role_departments($uid);
 					$dids = array_merge($dids_a, $dids_b);
-					if(!empty($dids)){
-						$whereOr[] = ['did','in',$dids];
+					if (!empty($dids)) {
+						$whereOr[] = ['did', 'in', $dids];
 					}
 				}
 			}
 			//鎸夋椂闂存绱�
 			if (!empty($param['diff_time'])) {
-				$diff_time =explode('~', $param['diff_time']);
-				$where[] = ['income_month', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+				$diff_time = explode('~', $param['diff_time']);
+				$where[] = ['income_month', 'between', [strtotime(urldecode($diff_time[0])), strtotime(urldecode($diff_time[1] . ' 23:59:59'))]];
 			}
-            if (isset($param['pay_status']) && $param['pay_status'] != "") {
-                $where[] = ['pay_status', '=', $param['pay_status']];
-            }
+			if (isset($param['pay_status']) && $param['pay_status'] != "") {
+				$where[] = ['pay_status', '=', $param['pay_status']];
+			}
 			if (isset($param['check_status']) && $param['check_status'] != "") {
-                $where[] = ['check_status', '=', $param['check_status']];
-            }
-            $list = $this->model->datalist($param,$where,$whereOr);
-            return table_assign(0, '', $list);
-        }
-        else{
-            return view();
-        }
-    }
-	
-    /**
-    * 娣诲姞/缂栬緫
-    */
-    public function add()
-    {
-		$param = get_params();	
-        if (request()->isAjax()) {
+				$where[] = ['check_status', '=', $param['check_status']];
+			}
+			$list = $this->model->datalist($param, $where, $whereOr);
+			return table_assign(0, '', $list);
+		} else {
+			return view();
+		}
+	}
+
+	/**
+	 * 娣诲姞/缂栬緫
+	 */
+	public function add()
+	{
+		$param = get_params();
+		if (request()->isAjax()) {
 			$param['income_month'] = isset($param['income_month']) ? strtotime(urldecode($param['income_month'])) : 0;
-            $param['expense_time'] = isset($param['expense_time']) ? strtotime(urldecode($param['expense_time'])) : 0;
+			$param['expense_time'] = isset($param['expense_time']) ? strtotime(urldecode($param['expense_time'])) : 0;
 			$amountData = isset($param['amount']) ? $param['amount'] : '0';
 			$cost = 0;
 			if ($amountData == 0) {
-				return to_assign(1,'鎶ラ攢閲戦涓嶅畬鍠�');
-			}
-			else{
+				return to_assign(1, '鎶ラ攢閲戦涓嶅畬鍠�');
+			} else {
 				foreach ($amountData as $key => $value) {
 					if ($value == 0) {
-						return to_assign(1,'绗�' . ($key + 1) . '鏉℃姤閿�閫夐」鐨勯噾棰濅笉鑳戒负闆�');
-					}
-					else{
-						$cost+=$value;
+						return to_assign(1, '绗�' . ($key + 1) . '鏉℃姤閿�閫夐」鐨勯噾棰濅笉鑳戒负闆�');
+					} else {
+						$cost += $value;
 					}
 				}
 			}
-			if($cost==0){
-				return to_assign(1,'鎶ラ攢閲戦涓嶈兘涓洪浂');
+			if ($cost == 0) {
+				return to_assign(1, '鎶ラ攢閲戦涓嶈兘涓洪浂');
 			}
 			$param['admin_id'] = $this->uid;
 			$param['did'] = $this->did;
 			$param['cost'] = $cost;
-            if (!empty($param['id']) && $param['id'] > 0) {
-                try {
-                    validate(ExpenseValidate::class)->scene('edit')->check($param);
-                } catch (ValidateException $e) {
-                    // 楠岃瘉澶辫触 杈撳嚭閿欒淇℃伅
-                    return to_assign(1, $e->getError());
-                }
+			if (!empty($param['id']) && $param['id'] > 0) {
+				try {
+					validate(ExpenseValidate::class)->scene('edit')->check($param);
+				} catch (ValidateException $e) {
+					// 楠岃瘉澶辫触 杈撳嚭閿欒淇℃伅
+					return to_assign(1, $e->getError());
+				}
 				$this->model->edit($param);
-            } else {
-                try {
-                    validate(ExpenseValidate::class)->scene('add')->check($param);
-                } catch (ValidateException $e) {
-                    // 楠岃瘉澶辫触 杈撳嚭閿欒淇℃伅
-                    return to_assign(1, $e->getError());
-                }
-                $this->model->add($param);
-            }	 
-        }else{
+			} else {
+				try {
+					validate(ExpenseValidate::class)->scene('add')->check($param);
+				} catch (ValidateException $e) {
+					// 楠岃瘉澶辫触 杈撳嚭閿欒淇℃伅
+					return to_assign(1, $e->getError());
+				}
+				$this->model->add($param);
+			}
+		} else {
 			$id = isset($param['id']) ? $param['id'] : 0;
-            View::assign('expense_cate', Db::name('ExpenseCate')->where(['status' => 1])->select()->toArray());
+			View::assign('expense_cate', Db::name('ExpenseCate')->where(['status' => 1])->select()->toArray());
 			View::assign('user', get_admin($this->uid));
-			if ($id>0) {
+			if ($id > 0) {
 				$detail = $this->model->getById($id);
 				View::assign('detail', $detail);
-				if(is_mobile()){
+				if (is_mobile()) {
 					return view('qiye@/finance/add_expense');
 				}
 				return view('edit');
 			}
-			if(is_mobile()){
+			if (is_mobile()) {
 				return view('qiye@/finance/add_expense');
 			}
 			return view();
 		}
-    }
-	
-    /**
-    * 鏌ョ湅
-    */
-    public function view($id)
-    {
+	}
+
+	/**
+	 * 鏌ョ湅
+	 */
+	public function view($id)
+	{
 		$detail = $this->model->getById($id);
 		if (!empty($detail)) {
-			$file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
+			$file_array = Db::name('File')->where('id', 'in', $detail['file_ids'])->select();
 			$detail['file_array'] = $file_array;
 			View::assign('detail', $detail);
 			View::assign('create_user', get_admin($detail['admin_id']));
-			if(is_mobile()){
+			if (is_mobile()) {
 				return view('qiye@/finance/view_expense');
 			}
 			return view();
+		} else {
+			return view(EEEOR_REPORTING, ['code' => 404, 'warning' => '鎵句笉鍒伴〉闈�']);
 		}
-		else{
-			return view(EEEOR_REPORTING,['code'=>404,'warning'=>'鎵句笉鍒伴〉闈�']);
-		}
-    }
-	
-   /**
-    * 鍒犻櫎
-    */
-    public function del()
-    {
+	}
+
+	/**
+	 * 鍒犻櫎
+	 */
+	public function del()
+	{
 		$param = get_params();
 		$id = isset($param['id']) ? $param['id'] : 0;
 		if (request()->isDelete()) {
 			$this->model->delById($id);
 		} else {
-            return to_assign(1, "閿欒鐨勮姹�");
-        }
-    }   
-	
+			return to_assign(1, "閿欒鐨勮姹�");
+		}
+	}
+
 	//鎶ラ攢璁板綍
-    public function record()
-    {
-        if (request()->isAjax()) {
+	public function record()
+	{
+		if (request()->isAjax()) {
 			$param = get_params();
 			$where = [];
-			$where[]=['delete_time','=',0];
-			$where[]=['check_status','=',2];
-			if(isAuthExpense($this->uid)==0){
+			$where[] = ['delete_time', '=', 0];
+			$where[] = ['check_status', '=', 2];
+			if (isAuthExpense($this->uid) == 0) {
 				$where[] = ['admin_id', '=', $this->uid];
 			}
 			//鎸夋椂闂存绱�
 			if (!empty($param['diff_time'])) {
-				$diff_time =explode('~', $param['diff_time']);
-				$where[] = ['expense_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]];
+				$diff_time = explode('~', $param['diff_time']);
+				$where[] = ['expense_time', 'between', [strtotime(urldecode($diff_time[0])), strtotime(urldecode($diff_time[1] . ' 23:59:59'))]];
 			}
-            if (isset($param['pay_status']) && $param['pay_status'] != "") {
-                $where[] = ['pay_status', '=', $param['pay_status']];
-            }
-			$list = $this->model->datalist($param,$where);
-			
-			$cost = $this->model::where($where)->sum('cost');					
-			$totalRow['cost'] = sprintf("%.2f",$cost);
-            return table_assign(0, '', $list);
-        } else {
-			View::assign('authExpense',isAuthExpense($this->uid));
-            return view();
-        }
-    }
+			if (isset($param['pay_status']) && $param['pay_status'] != "") {
+				$where[] = ['pay_status', '=', $param['pay_status']];
+			}
+			$list = $this->model->datalist($param, $where);
+
+			$cost = $this->model::where($where)->sum('cost');
+			$totalRow['cost'] = sprintf("%.2f", $cost);
+			return table_assign(0, '', $list);
+		} else {
+			View::assign('authExpense', isAuthExpense($this->uid));
+			return view();
+		}
+	}
 
 }
diff --git a/app/user/controller/Api.php b/app/user/controller/Api.php
index 956c6e0..61c6bfe 100644
--- a/app/user/controller/Api.php
+++ b/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, "鍒犻櫎澶辫触");
+		}
+    }
+
 }
diff --git a/app/user/controller/Attendance.php b/app/user/controller/Attendance.php
index 7bf1907..811f4f1 100644
--- a/app/user/controller/Attendance.php
+++ b/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,75 +34,72 @@
     {
         $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);
-            //         Db::name('PositionGroup')->where(['pid' => $param['id']])->delete();
-            //         foreach ($param['group_id'] as $k => $v) {
-            //             $data[$k] = [
-            //                 'pid' => $param['id'],
-            //                 'group_id' => $v,
-            //                 'create_time' => time(),
-            //             ];
-            //         }
-            //         Db::name('PositionGroup')->strict(false)->field(true)->insertAll($data);
-            //         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);
-            //         foreach ($param['group_id'] as $k => $v) {
-            //             $data[$k] = [
-            //                 'pid' => $uid,
-            //                 'group_id' => $v,
-            //                 'create_time' => time(),
-            //             ];
-            //         }
-            //         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());
-            //     }
-            // }
+            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] = [
+                    //         'pid' => $param['id'],
+                    //         'group_id' => $v,
+                    //         'create_time' => time(),
+                    //     ];
+                    // }
+                    // Db::name('PositionGroup')->strict(false)->field(true)->insertAll($data);
+                    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('AttendanceGroup')->strict(false)->field(true)->insertGetId($param);
+                    // foreach ($param['group_id'] as $k => $v) {
+                    //     $data[$k] = [
+                    //         'pid' => $uid,
+                    //         'group_id' => $v,
+                    //         'create_time' => time(),
+                    //     ];
+                    // }
+                    // 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());
+                }
+            }
             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();
         }
     }
diff --git a/app/user/controller/WorkPlan.php b/app/user/controller/WorkPlan.php
new file mode 100644
index 0000000..ec96f41
--- /dev/null
+++ b/app/user/controller/WorkPlan.php
@@ -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, "鍒犻櫎澶辫触");
+		}
+    }
+
+}
diff --git a/app/user/validate/WorkPlanCheck.php b/app/user/validate/WorkPlanCheck.php
new file mode 100644
index 0000000..a94cc4c
--- /dev/null
+++ b/app/user/validate/WorkPlanCheck.php
@@ -0,0 +1,49 @@
+<?php
+/**
++-----------------------------------------------------------------------------------------------
+* GouGuOPEN [ 宸︽墜鐮斿彂锛屽彸鎵嬪紑婧愶紝鏈潵鍙湡锛乚
++-----------------------------------------------------------------------------------------------
+* @Copyright (c) 2021~2024 http://www.gouguoa.com All rights reserved.
++-----------------------------------------------------------------------------------------------
+* @Licensed 鍕捐偂OA锛屽紑婧愪笖鍙厤璐逛娇鐢紝浣嗗苟涓嶆槸鑷敱杞欢锛屾湭缁忔巿鏉冭鍙笉鑳藉幓闄ゅ嬀鑲A鐨勭浉鍏崇増鏉冧俊鎭�
++-----------------------------------------------------------------------------------------------
+* @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'],
+    ];
+}
diff --git a/app/user/view/work_plan/add.html b/app/user/view/work_plan/add.html
new file mode 100644
index 0000000..6ba0331
--- /dev/null
+++ b/app/user/view/work_plan/add.html
@@ -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}
+<!-- /鑴氭湰 -->
diff --git a/app/user/view/work_plan/index.html b/app/user/view/work_plan/index.html
new file mode 100644
index 0000000..4ab9698
--- /dev/null
+++ b/app/user/view/work_plan/index.html
@@ -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}
+<!-- /鑴氭湰 -->

--
Gitblit v1.9.1