whereUserid($user->userid); $keys = Request::input('keys'); if (is_array($keys)) { if (in_array($keys['type'], [Report::WEEKLY, Report::DAILY])) { $builder->whereType($keys['type']); } if (is_array($keys['created_at'])) { if ($keys['created_at'][0] > 0) $builder->where('created_at', '>=', Base::newCarbon($keys['created_at'][0])->startOfDay()); if ($keys['created_at'][1] > 0) $builder->where('created_at', '<=', Base::newCarbon($keys['created_at'][1])->endOfDay()); } } $list = $builder->orderByDesc('created_at')->paginate(Base::getPaginate(50, 20)); return Base::retSuccess('success', $list); } /** * @api {get} api/report/receive 02. 我接收的汇报 * * @apiVersion 1.0.0 * @apiGroup report * @apiName receive * * @apiParam {Object} [keys] 搜索条件 * - keys.key: 关键词 * - keys.type: 汇报类型,weekly:周报,daily:日报 * - keys.created_at: 汇报时间 * @apiParam {Number} [page] 当前页,默认:1 * @apiParam {Number} [pagesize] 每页显示数量,默认:20,最大:50 * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {Object} data 返回数据 */ public function receive(): array { $user = User::auth(); $builder = Report::with(['receivesUser']); $builder->whereHas("receivesUser", function ($query) use ($user) { $query->where("report_receives.userid", $user->userid); }); $keys = Request::input('keys'); if (is_array($keys)) { if ($keys['key']) { $builder->where(function($query) use ($keys) { $query->whereHas('sendUser', function ($q2) use ($keys) { $q2->where("users.email", "LIKE", "%{$keys['key']}%"); })->orWhere("title", "LIKE", "%{$keys['key']}%"); }); } if (in_array($keys['type'], [Report::WEEKLY, Report::DAILY])) { $builder->whereType($keys['type']); } if (is_array($keys['created_at'])) { if ($keys['created_at'][0] > 0) $builder->where('created_at', '>=', Base::newCarbon($keys['created_at'][0])->startOfDay()); if ($keys['created_at'][1] > 0) $builder->where('created_at', '<=', Base::newCarbon($keys['created_at'][1])->endOfDay()); } } $list = $builder->orderByDesc('created_at')->paginate(Base::getPaginate(50, 20)); if ($list->items()) { foreach ($list->items() as $item) { $item->receive_at = ReportReceive::query()->whereRid($item["id"])->whereUserid($user->userid)->value("receive_at"); } } return Base::retSuccess('success', $list); } /** * @api {get} api/report/store 03. 保存并发送工作汇报 * * @apiVersion 1.0.0 * @apiGroup report * @apiName store * * @apiParam {Number} id 汇报ID,0为新建 * @apiParam {String} [sign] 唯一签名,通过[api/report/template]接口返回 * @apiParam {String} title 汇报标题 * @apiParam {Array} type 汇报类型,weekly:周报,daily:日报 * @apiParam {Number} content 内容 * @apiParam {Number} [receive] 汇报对象 * @apiParam {Number} offset 时间偏移量 * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {Object} data 返回数据 */ public function store(): array { $user = User::auth(); // $input = [ "id" => Request::input("id", 0), "sign" => Request::input("sign"), "title" => Request::input("title"), "type" => Request::input("type"), "content" => Request::input("content"), "receive" => Request::input("receive"), // 以当前日期为基础的周期偏移量。例如选择了上一周那么就是 -1,上一天同理。 "offset" => Request::input("offset", 0), ]; $validator = Validator::make($input, [ 'id' => 'numeric', 'title' => 'required', 'type' => ['required', Rule::in([Report::WEEKLY, Report::DAILY])], 'content' => 'required', 'offset' => ['numeric', 'max:0'], ], [ 'id.numeric' => 'ID只能是数字', 'title.required' => '请填写标题', 'type.required' => '请选择汇报类型', 'type.in' => '汇报类型错误', 'content.required' => '请填写汇报内容', 'offset.numeric' => '工作汇报周期格式错误,只能是数字', 'offset.max' => '只能提交当天/本周或者之前的的工作汇报', ]); if ($validator->fails()) return Base::retError($validator->errors()->first()); // 接收人 if (is_array($input["receive"])) { // 删除当前登录人 $input["receive"] = array_diff($input["receive"], [$user->userid]); // 查询用户是否存在 if (count($input["receive"]) !== User::whereIn("userid", $input["receive"])->count()) return Base::retError("用户不存在"); foreach ($input["receive"] as $userid) { $input["receive_content"][] = [ "receive_at" => Carbon::now()->toDateTimeString(), "userid" => $userid, "read" => 0, ]; } } // 在事务中运行 return AbstractModel::transaction(function () use ($input, $user) { $id = $input["id"]; if ($id) { // 编辑 $report = Report::getOne($id); $report->updateInstance([ "title" => $input["title"], "type" => $input["type"], "content" => htmlspecialchars($input["content"]), ]); } else { // 生成唯一标识 $sign = Base::isNumber($input["sign"]) ? $input["sign"] : Report::generateSign($input["type"], $input["offset"]); // 检查唯一标识是否存在 if (empty($input["id"]) && Report::query()->whereSign($sign)->whereType($input["type"])->count() > 0) { throw new ApiException("请勿重复提交工作汇报"); } $report = Report::createInstance([ "sign" => $sign, "title" => $input["title"], "type" => $input["type"], "userid" => $user->userid, "content" => htmlspecialchars($input["content"]), ]); } $report->save(); // 删除关联 $report->Receives()->delete(); if ($input["receive_content"]) { // 保存接收人 $report->Receives()->createMany($input["receive_content"]); } // 推送消息 $userids = []; foreach ($input["receive_content"] as $item) { $userids[] = $item['userid']; } if ($userids) { $params = [ 'ignoreFd' => Request::header('fd'), 'userid' => $userids, 'msg' => [ 'type' => 'report', 'action' => 'unreadUpdate', ] ]; Task::deliver(new PushTask($params, false)); } // return Base::retSuccess('保存成功', $report); }); } /** * @api {get} api/report/template 04. 生成汇报模板 * * @apiVersion 1.0.0 * @apiGroup report * @apiName template * * @apiParam {Array} [type] 汇报类型,weekly:周报,daily:日报 * @apiParam {Number} [offset] 偏移量 * @apiParam {String} [date] 时间 * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) * @apiSuccess {Object} data 返回数据 */ public function template(): array { $user = User::auth(); $type = trim(Request::input("type")); $offset = abs(intval(Request::input("offset", 0))); $id = intval(Request::input("offset", 0)); $now_dt = trim(Request::input("date")) ? Carbon::parse(Request::input("date")) : Carbon::now(); // 获取开始时间 if ($type === Report::DAILY) { $start_time = Carbon::today(); if ($offset > 0) { // 将当前时间调整为偏移量当天结束 $now_dt->subDays($offset)->endOfDay(); // 开始时间偏移量计算 $start_time->subDays($offset); } $end_time = Carbon::instance($start_time)->endOfDay(); } else { $start_time = Carbon::now(); if ($offset > 0) { // 将当前时间调整为偏移量当周结束 $now_dt->subWeeks($offset)->endOfDay(); // 开始时间偏移量计算 $start_time->subWeeks($offset); } $start_time->startOfWeek(); $end_time = Carbon::instance($start_time)->endOfWeek(); } // 生成唯一标识 $sign = Report::generateSign($type, 0, Carbon::instance($start_time)); $one = Report::whereSign($sign)->whereType($type)->first(); // 如果已经提交了相关汇报 if ($one && $id > 0) { return Base::retSuccess('success', [ "id" => $one->id, "sign" => $one->sign, "title" => $one->title, "content" => $one->content, ]); } // 表格头部 $labels = [ Doo::translate('项目'), Doo::translate('任务'), Doo::translate('负责人'), Doo::translate('备注'), ]; // 已完成的任务 $completeDatas = []; $complete_task = ProjectTask::query() ->whereNotNull("complete_at") ->whereBetween("complete_at", [$start_time->toDateTimeString(), $end_time->toDateTimeString()]) ->whereHas("taskUser", function ($query) use ($user) { $query->where("userid", $user->userid); }) ->orderByDesc("id") ->get(); if ($complete_task->isNotEmpty()) { foreach ($complete_task as $task) { $complete_at = Carbon::parse($task->complete_at); $remark = $type == Report::WEEKLY ? ('
'; $contents[] = '
'; $contents[] = "