perf: 优化工作汇报的搜索

This commit is contained in:
kuaifan 2022-04-07 19:45:03 +08:00
parent 9755c59687
commit d951a6057d
3 changed files with 68 additions and 86 deletions

View File

@ -32,8 +32,9 @@ class ReportController extends AbstractController
* @apiGroup report * @apiGroup report
* @apiName my * @apiName my
* *
* @apiParam {String} [type] 汇报类型weekly:周报daily:日报 * @apiParam {Object} [keys] 搜索条件
* @apiParam {Array} [created_at] 汇报时间 * - keys.type: 汇报类型weekly:周报daily:日报
* - keys.created_at: 汇报时间
* @apiParam {Number} [page] 当前页,默认:1 * @apiParam {Number} [page] 当前页,默认:1
* @apiParam {Number} [pagesize] 每页显示数量,默认:20,最大:50 * @apiParam {Number} [pagesize] 每页显示数量,默认:20,最大:50
* *
@ -44,17 +45,19 @@ class ReportController extends AbstractController
public function my(): array public function my(): array
{ {
$user = User::auth(); $user = User::auth();
// 搜索当前用户 //
$builder = Report::with(['receivesUser'])->whereUserid($user->userid); $builder = Report::with(['receivesUser'])->whereUserid($user->userid);
$type = trim(Request::input('type')); $keys = Request::input('keys');
$createAt = Request::input('created_at'); if (is_array($keys)) {
in_array($type, [Report::WEEKLY, Report::DAILY]) && $builder->whereType($type); if (in_array($keys['type'], [Report::WEEKLY, Report::DAILY])) {
$whereArray = []; $builder->whereType($keys['type']);
if (is_array($createAt)) {
if ($createAt[0] > 0) $whereArray[] = ['created_at', '>=', date('Y-m-d H:i:s', Base::dayTimeF($createAt[0]))];
if ($createAt[1] > 0) $whereArray[] = ['created_at', '<=', date('Y-m-d H:i:s', Base::dayTimeE($createAt[1]))];
} }
$list = $builder->where($whereArray)->orderByDesc('created_at')->paginate(Base::getPaginate(50, 20)); if (is_array($keys['created_at'])) {
if ($keys['created_at'][0] > 0) $builder->where('created_at', '>=', date('Y-m-d H:i:s', Base::dayTimeF($keys['created_at'][0])));
if ($keys['created_at'][1] > 0) $builder->where('created_at', '<=', date('Y-m-d H:i:s', Base::dayTimeE($keys['created_at'][1])));
}
}
$list = $builder->orderByDesc('created_at')->paginate(Base::getPaginate(50, 20));
return Base::retSuccess('success', $list); return Base::retSuccess('success', $list);
} }
@ -65,9 +68,10 @@ class ReportController extends AbstractController
* @apiGroup report * @apiGroup report
* @apiName receive * @apiName receive
* *
* @apiParam {String} [username] 会员名 * @apiParam {Object} [keys] 搜索条件
* @apiParam {String} [type] 汇报类型weekly:周报daily:日报 * - keys.key: 关键词
* @apiParam {Array} [created_at] 汇报时间 * - keys.type: 汇报类型weekly:周报daily:日报
* - keys.created_at: 汇报时间
* @apiParam {Number} [page] 当前页,默认:1 * @apiParam {Number} [page] 当前页,默认:1
* @apiParam {Number} [pagesize] 每页显示数量,默认:20,最大:50 * @apiParam {Number} [pagesize] 每页显示数量,默认:20,最大:50
* *
@ -82,21 +86,24 @@ class ReportController extends AbstractController
$builder->whereHas("receivesUser", function ($query) use ($user) { $builder->whereHas("receivesUser", function ($query) use ($user) {
$query->where("report_receives.userid", $user->userid); $query->where("report_receives.userid", $user->userid);
}); });
$type = trim(Request::input('type')); $keys = Request::input('keys');
$createAt = Request::input('created_at'); if (is_array($keys)) {
$username = trim(Request::input('username', '')); if ($keys['key']) {
$builder->whereHas('sendUser', function ($query) use ($username) { $builder->where(function($query) use ($keys) {
if (!empty($username)) { $query->whereHas('sendUser', function ($q2) use ($keys) {
$query->where("users.email", "LIKE", "%{$username}%"); $q2->where("users.email", "LIKE", "%{$keys['key']}%");
} })->orWhere("title", "LIKE", "%{$keys['key']}%");
}); });
in_array($type, [Report::WEEKLY, Report::DAILY]) && $builder->whereType($type);
$whereArray = [];
if (is_array($createAt)) {
if ($createAt[0] > 0) $whereArray[] = ['created_at', '>=', date('Y-m-d H:i:s', Base::dayTimeF($createAt[0]))];
if ($createAt[1] > 0) $whereArray[] = ['created_at', '<=', date('Y-m-d H:i:s', Base::dayTimeE($createAt[1]))];
} }
$list = $builder->where($whereArray)->orderByDesc('created_at')->paginate(Base::getPaginate(50, 20)); 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', '>=', date('Y-m-d H:i:s', Base::dayTimeF($keys['created_at'][0])));
if ($keys['created_at'][1] > 0) $builder->where('created_at', '<=', date('Y-m-d H:i:s', Base::dayTimeE($keys['created_at'][1])));
}
}
$list = $builder->orderByDesc('created_at')->paginate(Base::getPaginate(50, 20));
if ($list->items()) { if ($list->items()) {
foreach ($list->items() as $item) { foreach ($list->items() as $item) {
$item->receive_time = ReportReceive::query()->whereRid($item["id"])->whereUserid($user->userid)->value("receive_time"); $item->receive_time = ReportReceive::query()->whereRid($item["id"])->whereUserid($user->userid)->value("receive_time");

View File

@ -9,7 +9,7 @@
</div> </div>
<div class="search-content"> <div class="search-content">
<Select <Select
v-model="reportType" v-model="keys.type"
:placeholder="$L('全部')"> :placeholder="$L('全部')">
<Option v-for="item in reportTypeList" :value="item.value" :key="item.value">{{ item.label }}</Option> <Option v-for="item in reportTypeList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select> </Select>
@ -21,7 +21,7 @@
</div> </div>
<div class="search-content"> <div class="search-content">
<DatePicker <DatePicker
v-model="createAt" v-model="keys.created_at"
type="daterange" type="daterange"
split-panels split-panels
:placeholder="$L('请选择时间')"/> :placeholder="$L('请选择时间')"/>
@ -82,11 +82,14 @@ export default {
listPage: 1, listPage: 1,
listTotal: 0, listTotal: 0,
listPageSize: 20, listPageSize: 20,
noDataText: "", noDataText: "数据加载中.....",
createAt: [], keys: {},
reportType: '', reportTypeList: [
reportTypeList: [], {value: "", label: this.$L('全部')},
{value: "weekly", label: this.$L('周报')},
{value: "daily", label: this.$L('日报')},
],
} }
}, },
mounted() { mounted() {
@ -97,7 +100,6 @@ export default {
}, },
methods: { methods: {
initLanguage() { initLanguage() {
this.noDataText = this.noDataText || "数据加载中.....";
this.columns = [{ this.columns = [{
title: this.$L("名称"), title: this.$L("名称"),
key: 'title', key: 'title',
@ -108,7 +110,7 @@ export default {
key: 'type', key: 'type',
align: 'center', align: 'center',
sortable: true, sortable: true,
width: 80, width: 90,
}, { }, {
title: this.$L("汇报时间"), title: this.$L("汇报时间"),
key: 'created_at', key: 'created_at',
@ -147,11 +149,6 @@ export default {
}); });
}, },
}]; }];
this.reportTypeList = [
{value: "", label: this.$L('全部')},
{value: "weekly", label: this.$L('周报')},
{value: "daily", label: this.$L('日报')},
]
}, },
onSearch() { onSearch() {
@ -160,28 +157,26 @@ export default {
}, },
getLists() { getLists() {
this.loadIng = 1; this.loadIng++;
this.$store.dispatch("call", { this.$store.dispatch("call", {
url: 'report/my', url: 'report/my',
data: { data: {
keys: this.keys,
page: Math.max(this.listPage, 1), page: Math.max(this.listPage, 1),
pagesize: Math.max($A.runNum(this.listPageSize), 10), pagesize: Math.max($A.runNum(this.listPageSize), 10),
created_at: this.createAt,
type: this.reportType
}, },
}).then(({data, msg}) => { }).then(({data}) => {
// data // data
this.lists = data.data; this.lists = data.data;
this.listTotal = data.total; this.listTotal = data.total;
if (this.lists.length <= 0) { this.noDataText = "没有相关的数据";
this.noDataText = this.$L("无数据");
}
// msg // msg
}).catch(({msg}) => { }).catch(({msg}) => {
// msg // msg
$A.messageError(msg); $A.messageError(msg);
this.noDataText = '数据加载失败';
}).finally(() => { }).finally(() => {
this.loadIng = 0; this.loadIng--;
}); });
}, },
@ -197,17 +192,9 @@ export default {
} }
}, },
searchTab() {
this.getLists();
},
addReport() { addReport() {
this.$emit("on-edit", 0); this.$emit("on-edit", 0);
} }
} }
} }
</script> </script>
<style scoped>
</style>

View File

@ -4,10 +4,10 @@
<ul> <ul>
<li> <li>
<div class="search-label"> <div class="search-label">
{{ $L("汇报人") }} {{ $L("关键词") }}
</div> </div>
<div class="search-content"> <div class="search-content">
<Input v-model="username" :placeholder="$L('请输入用户名')"/> <Input v-model="keys.key" :placeholder="$L('输入关键词搜索')" clearable/>
</div> </div>
</li> </li>
<li> <li>
@ -16,7 +16,7 @@
</div> </div>
<div class="search-content"> <div class="search-content">
<Select <Select
v-model="reportType" v-model="keys.type"
:placeholder="$L('全部')"> :placeholder="$L('全部')">
<Option v-for="item in reportTypeList" :value="item.value" :key="item.value">{{ item.label }}</Option> <Option v-for="item in reportTypeList" :value="item.value" :key="item.value">{{ item.label }}</Option>
</Select> </Select>
@ -28,7 +28,7 @@
</div> </div>
<div class="search-content"> <div class="search-content">
<DatePicker <DatePicker
v-model="createAt" v-model="keys.created_at"
type="daterange" type="daterange"
split-panels split-panels
:placeholder="$L('请选择时间')"/> :placeholder="$L('请选择时间')"/>
@ -85,12 +85,14 @@ export default {
listPage: 1, listPage: 1,
listTotal: 0, listTotal: 0,
listPageSize: 20, listPageSize: 20,
noDataText: "", noDataText: "数据加载中.....",
username: '', keys: {},
reportType: '', reportTypeList: [
createAt: [], {value: "", label: this.$L('全部')},
reportTypeList: [], {value: "weekly", label: this.$L('周报')},
{value: "daily", label: this.$L('日报')},
],
} }
}, },
mounted() { mounted() {
@ -101,7 +103,6 @@ export default {
}, },
methods: { methods: {
initLanguage() { initLanguage() {
this.noDataText = this.noDataText || "数据加载中.....";
this.columns = [{ this.columns = [{
title: this.$L("标题"), title: this.$L("标题"),
key: 'title', key: 'title',
@ -129,9 +130,8 @@ export default {
}, { }, {
title: this.$L("类型"), title: this.$L("类型"),
key: 'type', key: 'type',
align: 'center',
sortable: true, sortable: true,
width: 80, width: 90,
}, { }, {
title: this.$L("接收时间"), title: this.$L("接收时间"),
key: 'receive_time', key: 'receive_time',
@ -171,11 +171,6 @@ export default {
}); });
}, },
}]; }];
this.reportTypeList = [
{value: "", label: this.$L('全部')},
{value: "weekly", label: this.$L('周报')},
{value: "daily", label: this.$L('日报')},
]
}, },
onSearch() { onSearch() {
@ -184,29 +179,26 @@ export default {
}, },
getLists() { getLists() {
this.loadIng = 1; this.loadIng++;
this.$store.dispatch("call", { this.$store.dispatch("call", {
url: 'report/receive', url: 'report/receive',
data: { data: {
keys: this.keys,
page: Math.max(this.listPage, 1), page: Math.max(this.listPage, 1),
pagesize: Math.max($A.runNum(this.listPageSize), 10), pagesize: Math.max($A.runNum(this.listPageSize), 10),
username: this.username,
created_at: this.createAt,
type: this.reportType
}, },
}).then(({data, msg}) => { }).then(({data}) => {
// data // data
this.lists = data.data; this.lists = data.data;
this.listTotal = data.total; this.listTotal = data.total;
if (this.lists.length <= 0) { this.noDataText = "没有相关的数据";
this.noDataText = this.$L("无数据");
}
// msg // msg
}).catch(({msg}) => { }).catch(({msg}) => {
// msg // msg
$A.messageError(msg); $A.messageError(msg);
this.noDataText = '数据加载失败';
}).finally(() => { }).finally(() => {
this.loadIng = 0; this.loadIng--;
}); });
}, },
@ -224,7 +216,3 @@ export default {
} }
} }
</script> </script>
<style scoped>
</style>