From b7d10a4c58e9e3e3294eba9b8785e2316d69a16b Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 14 Mar 2025 22:44:25 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/ReportController.php | 26 +++++++++++-- resources/assets/js/functions/web.js | 21 ++++++++++ resources/assets/js/pages/manage.vue | 18 +++++---- .../assets/js/pages/manage/application.vue | 13 +------ .../js/pages/manage/components/ReportMy.vue | 21 +++++++++- .../pages/manage/components/ReportReceive.vue | 39 +++++++++++++++++-- 6 files changed, 110 insertions(+), 28 deletions(-) diff --git a/app/Http/Controllers/Api/ReportController.php b/app/Http/Controllers/Api/ReportController.php index 0c29b6789..3dbbba000 100755 --- a/app/Http/Controllers/Api/ReportController.php +++ b/app/Http/Controllers/Api/ReportController.php @@ -33,6 +33,7 @@ class ReportController extends AbstractController * @apiName my * * @apiParam {Object} [keys] 搜索条件 + * - keys.key: 关键词 * - keys.type: 汇报类型,weekly:周报,daily:日报 * - keys.created_at: 汇报时间 * @apiParam {Number} [page] 当前页,默认:1 @@ -49,6 +50,15 @@ class ReportController extends AbstractController $builder = Report::with(['receivesUser'])->whereUserid($user->userid); $keys = Request::input('keys'); if (is_array($keys)) { + if ($keys['key']) { + if (str_contains($keys['key'], '@')) { + $builder->whereHas('sendUser', function ($q2) use ($keys) { + $q2->where("users.email", "LIKE", "%{$keys['key']}%"); + }); + } else { + $builder->where("title", "LIKE", "%{$keys['key']}%"); + } + } if (in_array($keys['type'], [Report::WEEKLY, Report::DAILY])) { $builder->whereType($keys['type']); } @@ -70,6 +80,7 @@ class ReportController extends AbstractController * * @apiParam {Object} [keys] 搜索条件 * - keys.key: 关键词 + * - keys.department_id: 部门ID * - keys.type: 汇报类型,weekly:周报,daily:日报 * - keys.status: 状态,unread:未读,read:已读 * - keys.created_at: 汇报时间 @@ -90,10 +101,19 @@ class ReportController extends AbstractController $keys = Request::input('keys'); if (is_array($keys)) { if ($keys['key']) { - $builder->where(function($query) use ($keys) { - $query->whereHas('sendUser', function ($q2) use ($keys) { + if (str_contains($keys['key'], '@')) { + $builder->whereHas('sendUser', function ($q2) use ($keys) { $q2->where("users.email", "LIKE", "%{$keys['key']}%"); - })->orWhere("title", "LIKE", "%{$keys['key']}%"); + }); + } elseif (Base::isNumber($keys['key'])) { + $builder->where("userid", intval($keys['key'])); + } else { + $builder->where("title", "LIKE", "%{$keys['key']}%"); + } + } + if ($keys['department_id']) { + $builder->whereHas('sendUser', function ($query) use ($keys) { + $query->where("users.department", "LIKE", "%,{$keys['department_id']},%"); }); } if (in_array($keys['type'], [Report::WEEKLY, Report::DAILY])) { diff --git a/resources/assets/js/functions/web.js b/resources/assets/js/functions/web.js index 1da6f67d8..314482522 100755 --- a/resources/assets/js/functions/web.js +++ b/resources/assets/js/functions/web.js @@ -662,6 +662,27 @@ import {convertLocalResourcePath} from "../components/Replace/utils"; }) } }) + }, + + /** + * 提取工作报告中的时间 + * @param text + * @returns {*|string} + */ + reportExtractTime(text) { + const regex = /(?:.*?)(?:\[([^\[\]]*)\]\s*)?(?:\[([^\[\]]*)\]\s*)?$/; + const match = text.match(regex); + if (!match) return ""; + const secondLast = `${match[1] || ""}`.replace(/^\s*\((.*)\)\s*$/, "$1"); + const last = `${match[2] || ""}`.replace(/^\s*\((.*)\)\s*$/, "$1"); + if (last && secondLast) { + return `${last} (${secondLast})`; + } else if (last) { + return last; + } else if (secondLast) { + return secondLast; + } + return ""; } }); diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 268fe2073..5b191350f 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -296,7 +296,7 @@ v-model="workReportShow" placement="right" :size="1200"> - + @@ -435,7 +435,6 @@ export default { visibleMenu: false, showMobileMenu: false, - workReportShow: false, allUserShow: false, allProjectShow: false, archivedProjectShow: false, @@ -443,7 +442,8 @@ export default { natificationReady: false, notificationManage: null, - reportTabs: "my", + workReportShow: false, + workReportTab: "my", operateStyles: {}, operateVisible: false, @@ -465,6 +465,7 @@ export default { emitter.on('createGroup', this.onCreateGroup); emitter.on('dialogMsgPush', this.addDialogMsg); emitter.on('approveDetails', this.openApproveDetails); + emitter.on('openReport', this.openReport); // document.addEventListener('keydown', this.shortcutEvent); }, @@ -487,6 +488,7 @@ export default { emitter.off('createGroup', this.onCreateGroup); emitter.off('dialogMsgPush', this.addDialogMsg); emitter.off('approveDetails', this.openApproveDetails); + emitter.off('openReport', this.openReport); // document.removeEventListener('keydown', this.shortcutEvent); }, @@ -801,10 +803,7 @@ export default { this.exportApproveShow = true; return; case 'workReport': - if (this.reportUnreadNumber > 0) { - this.reportTabs = "receive"; - } - this.workReportShow = true; + this.openReport(this.reportUnreadNumber > 0 ? 'receive' : 'my'); return; case 'version': emitter.emit('updateNotification', null); @@ -1144,6 +1143,11 @@ export default { }) }, + openReport(tab) { + this.workReportTab = tab; + this.workReportShow = true; + }, + handleLongpress(event, el) { const projectId = $A.getAttr(el, 'data-id') const projectItem = this.projectLists.find(item => item.id == projectId) diff --git a/resources/assets/js/pages/manage/application.vue b/resources/assets/js/pages/manage/application.vue index f4fa183c1..c1bb9c3da 100644 --- a/resources/assets/js/pages/manage/application.vue +++ b/resources/assets/js/pages/manage/application.vue @@ -40,11 +40,6 @@ - - - - -
@@ -244,7 +239,6 @@ import {mapState} from "vuex"; import DrawerOverlay from "../../components/DrawerOverlay"; import UserSelect from "../../components/UserSelect"; -import Report from "../manage/components/Report"; import SystemAibot from "./setting/components/SystemAibot"; import SystemCheckin from "./setting/components/SystemCheckin"; import Checkin from "./setting/checkin"; @@ -259,7 +253,6 @@ export default { components: { UserSelect, DrawerOverlay, - Report, SystemAibot, SystemCheckin, Checkin, @@ -273,9 +266,6 @@ export default { applyList: [], applyListTypes: ['base', 'admin'], // - workReportShow: false, - workReportTabs: "my", - // aibotList: AIBotList, aibotShow: false, aibotSettingShow: false, @@ -421,8 +411,7 @@ export default { }); break; case 'report': - this.workReportTabs = area == 'badge' ? 'receive' : 'my'; - this.workReportShow = true; + emitter.emit('openReport', area == 'badge' ? 'receive' : 'my'); break; case 'robot': this.getAITags(); diff --git a/resources/assets/js/pages/manage/components/ReportMy.vue b/resources/assets/js/pages/manage/components/ReportMy.vue index ec5b943df..b4457ca44 100644 --- a/resources/assets/js/pages/manage/components/ReportMy.vue +++ b/resources/assets/js/pages/manage/components/ReportMy.vue @@ -3,6 +3,14 @@
    +
  • +
    + {{ $L("关键词") }} +
    +
    + +
    +
  • {{ $L("汇报类型") }} @@ -77,11 +85,20 @@ export default { return { loadIng: 0, columns: [{ - title: this.$L("名称"), + title: this.$L("标题"), key: 'title', minWidth: 180, render: (h, {row}) => { - return h('AutoTip', row.title); + const displayTitle = `${row.title || ""}`.replace(/(\[([^\[\]]*)\]\s*){0,2}$/, ''); + return h('AutoTip', displayTitle); + } + }, { + title: this.$L("时间"), + key: 'time', + sortable: true, + minWidth: 180, + render: (h, {row}) => { + return h('AutoTip', $A.reportExtractTime(row.title) || '-'); } }, { title: this.$L("类型"), diff --git a/resources/assets/js/pages/manage/components/ReportReceive.vue b/resources/assets/js/pages/manage/components/ReportReceive.vue index 91a2ddc76..fb3fd27f1 100644 --- a/resources/assets/js/pages/manage/components/ReportReceive.vue +++ b/resources/assets/js/pages/manage/components/ReportReceive.vue @@ -10,6 +10,25 @@
  • +
  • +
    + {{ $L("汇报部门") }} +
    +
    + +
    +
  • {{ $L("汇报类型") }} @@ -113,7 +132,8 @@ export default { sortable: true, minWidth: 180, render: (h, {row}) => { - let arr = [] + const displayTitle = `${row.title || ""}`.replace(/(\[([^\[\]]*)\]\s*){0,2}$/, ''); + const arr = [] const myUser = row.receives_user.find(({userid}) => userid == this.userId) if (myUser && myUser.pivot.read == 0) { arr.push( @@ -125,11 +145,11 @@ export default { flexShrink: 0, } }, this.$L("未读")), - h('AutoTip', row.title) + h('AutoTip', displayTitle) ) } else { arr.push( - h('AutoTip', row.title) + h('AutoTip', displayTitle) ) } return h('div', { @@ -139,6 +159,14 @@ export default { } }, arr) } + }, { + title: this.$L("时间"), + key: 'time', + sortable: true, + minWidth: 180, + render: (h, {row}) => { + return h('AutoTip', $A.reportExtractTime(row.title) || '-'); + } }, { title: this.$L("类型"), key: 'type', @@ -209,10 +237,13 @@ export default { {value: "unread", label: this.$L('仅未读')}, {value: "read", label: this.$L('仅已读')}, ], + + departmentList: [], } }, - mounted() { + async mounted() { this.getLists(); + this.departmentList = await this.$store.dispatch("getDepartmentList") }, watch: { keyIs(v) {