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