Merge pull request #616 from thexqn/optimize_history

feat: Add show_attr value column to operation history table
This commit is contained in:
pycook 2024-09-14 11:55:01 +08:00 committed by GitHub
commit afda71f135
4 changed files with 38 additions and 2 deletions

1
.gitignore vendored
View File

@ -78,3 +78,4 @@ cmdb-ui/npm-debug.log*
cmdb-ui/yarn-debug.log* cmdb-ui/yarn-debug.log*
cmdb-ui/yarn-error.log* cmdb-ui/yarn-error.log*
cmdb-ui/package-lock.json cmdb-ui/package-lock.json
start.sh

View File

@ -10,6 +10,7 @@ from api.extensions import db
from api.lib.cmdb.cache import AttributeCache from api.lib.cmdb.cache import AttributeCache
from api.lib.cmdb.cache import RelationTypeCache from api.lib.cmdb.cache import RelationTypeCache
from api.lib.cmdb.const import OperateType from api.lib.cmdb.const import OperateType
from api.lib.cmdb.cache import CITypeCache
from api.lib.cmdb.perms import CIFilterPermsCRUD from api.lib.cmdb.perms import CIFilterPermsCRUD
from api.lib.cmdb.resp_format import ErrFormat from api.lib.cmdb.resp_format import ErrFormat
from api.lib.perm.acl.cache import UserCache from api.lib.perm.acl.cache import UserCache
@ -22,6 +23,7 @@ from api.models.cmdb import CITypeHistory
from api.models.cmdb import CITypeTrigger from api.models.cmdb import CITypeTrigger
from api.models.cmdb import CITypeUniqueConstraint from api.models.cmdb import CITypeUniqueConstraint
from api.models.cmdb import OperationRecord from api.models.cmdb import OperationRecord
from api.lib.cmdb.utils import TableMap
class AttributeHistoryManger(object): class AttributeHistoryManger(object):
@ -59,8 +61,23 @@ class AttributeHistoryManger(object):
total = len(records) total = len(records)
res = {} res = {}
show_attr_set = {}
show_attr_cache = {}
for record in records: for record in records:
record_id = record.OperationRecord.id record_id = record.OperationRecord.id
type_id = record.OperationRecord.type_id
ci_id = record.AttributeHistory.ci_id
show_attr_set[ci_id] = None
show_attr = show_attr_cache.setdefault(
type_id,
AttributeCache.get(
CITypeCache.get(type_id).show_id or CITypeCache.get(type_id).unique_id) if CITypeCache.get(type_id) else None
)
if show_attr:
attr_table = TableMap(attr=show_attr).table
attr_record = attr_table.get_by(attr_id=show_attr.id, ci_id=ci_id, first=True, to_dict=False)
show_attr_set[ci_id] = attr_record.value if attr_record else None
attr_hist = record.AttributeHistory.to_dict() attr_hist = record.AttributeHistory.to_dict()
attr_hist['attr'] = AttributeCache.get(attr_hist['attr_id']) attr_hist['attr'] = AttributeCache.get(attr_hist['attr_id'])
if attr_hist['attr']: if attr_hist['attr']:
@ -76,6 +93,7 @@ class AttributeHistoryManger(object):
if record_id not in res: if record_id not in res:
record_dict = record.OperationRecord.to_dict() record_dict = record.OperationRecord.to_dict()
record_dict['show_attr_value'] = show_attr_set.get(ci_id)
record_dict["user"] = UserCache.get(record_dict.get("uid")) record_dict["user"] = UserCache.get(record_dict.get("uid"))
if record_dict["user"]: if record_dict["user"]:
record_dict['user'] = record_dict['user'].nickname record_dict['user'] = record_dict['user'].nickname

View File

@ -45,6 +45,7 @@
</template> </template>
</vxe-column> </vxe-column>
<vxe-column field="type_id" width="100px" :title="$t('cmdb.ciType.ciType')"></vxe-column> <vxe-column field="type_id" width="100px" :title="$t('cmdb.ciType.ciType')"></vxe-column>
<vxe-column field="show_attr_value" width="100px" :title="$t('cmdb.ciType.show')"></vxe-column>
<vxe-column field="operate_type" width="89px" :title="$t('operation')"> <vxe-column field="operate_type" width="89px" :title="$t('operation')">
<template #header="{ column }"> <template #header="{ column }">
<span>{{ column.title }}</span> <span>{{ column.title }}</span>
@ -314,7 +315,7 @@ export default {
} }
}, },
mergeRowMethod({ row, _rowIndex, column, visibleData }) { mergeRowMethod({ row, _rowIndex, column, visibleData }) {
const fields = ['created_at', 'user', 'type_id'] const fields = ['created_at', 'user', 'type_id', 'show_attr_value']
const cellValue = row[column.property] const cellValue = row[column.property]
const created_at = row['created_at'] const created_at = row['created_at']
if (column.property === 'created_at') { if (column.property === 'created_at') {
@ -365,6 +366,22 @@ export default {
} }
} }
} }
} else if (column.property === 'show_attr_value') {
if (cellValue && fields.includes(column.property)) {
const prevRow = visibleData[_rowIndex - 1]
let nextRow = visibleData[_rowIndex + 1]
if (prevRow && prevRow[column.property] === cellValue && prevRow['created_at'] === created_at) {
return { rowspan: 0, colspan: 0 }
} else {
let countRowspan = 1
while (nextRow && nextRow[column.property] === cellValue && nextRow['created_at'] === created_at) {
nextRow = visibleData[++countRowspan + _rowIndex]
}
if (countRowspan > 1) {
return { rowspan: countRowspan, colspan: 1 }
}
}
}
} }
}, },
filterUser() { filterUser() {

View File

@ -85,7 +85,7 @@
@change="onChange" @change="onChange"
format="YYYY-MM-DD HH:mm" format="YYYY-MM-DD HH:mm"
:placeholder="[$t('cmdb.history.startTime'), $t('cmdb.history.endTime')]" :placeholder="[$t('cmdb.history.startTime'), $t('cmdb.history.endTime')]"
v-else-if="attr.value_type === '3'" v-else-if="valueTypeMap[item.value_type] == 'date' || valueTypeMap[item.value_type] == 'datetime'"
:show-time="{ :show-time="{
hideDisabledOptions: true, hideDisabledOptions: true,
defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('23:59:59', 'HH:mm:ss')], defaultValue: [moment('00:00:00', 'HH:mm:ss'), moment('23:59:59', 'HH:mm:ss')],