22 changed files with 231 additions and 23 deletions
-
42src/src/main/java/com/my/graphiteDigesterBg/api/ApiOperationLog.java
-
8src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecord.java
-
2src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecordCriteria.java
-
3src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java
-
14src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java
-
11src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java
-
12src/src/main/java/com/my/graphiteDigesterBg/diframe/mapper/DiActiveRecordMapper.java
-
32src/src/main/java/com/my/graphiteDigesterBg/model/MdbOperationLog.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorClose.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorOpen.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java
-
2src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java
-
2src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskStopReset.java
-
4src/src/main/java/com/my/graphiteDigesterBg/task/TaskTubeMoveToErrorSlot.java
-
90src/web/src/pages/main/contents/History.vue
-
5src/web/src/utils/ApiClient.js
@ -0,0 +1,42 @@ |
|||
package com.my.graphiteDigesterBg.api; |
|||
import com.my.graphiteDigesterBg.diframe.DiActiveRecord; |
|||
import com.my.graphiteDigesterBg.diframe.DiActiveRecordCriteria; |
|||
import com.my.graphiteDigesterBg.diframe.DiApiControllerBase; |
|||
import com.my.graphiteDigesterBg.diframe.DiApiResponse; |
|||
import com.my.graphiteDigesterBg.diframe.model.DiMdbUser; |
|||
import com.my.graphiteDigesterBg.model.MdbDigestionTask; |
|||
import com.my.graphiteDigesterBg.model.MdbOperationLog; |
|||
import org.springframework.stereotype.Controller; |
|||
import org.springframework.web.bind.annotation.PostMapping; |
|||
import org.springframework.web.bind.annotation.RequestBody; |
|||
import org.springframework.web.bind.annotation.ResponseBody; |
|||
import java.util.ArrayList; |
|||
import java.util.Map; |
|||
@Controller |
|||
public class ApiOperationLog extends DiApiControllerBase { |
|||
@ResponseBody |
|||
@PostMapping("/api/operation-log/list") |
|||
public DiApiResponse list(@RequestBody Map<String,Object> params ) { |
|||
Integer offset = (Integer)params.get("offset"); |
|||
Integer limit = (Integer)params.get("limit"); |
|||
|
|||
var criteria = new DiActiveRecordCriteria(); |
|||
criteria.limit = limit == null ? 10 : limit; |
|||
criteria.offset = offset == null ? 0 : offset; |
|||
var logs = DiActiveRecord.find(MdbOperationLog.class, criteria); |
|||
|
|||
var list = new ArrayList<Map<String,Object>>(); |
|||
for ( var log : logs ) { |
|||
var map = log.toMap(); |
|||
map.put("user", null); |
|||
if ( 0 != log.userId ) { |
|||
var user = DiActiveRecord.findOne(DiMdbUser.class, log.userId); |
|||
map.put("user", user.toMap()); |
|||
} |
|||
list.add(map); |
|||
} |
|||
|
|||
var total = DiActiveRecord.count(MdbOperationLog.class, criteria); |
|||
return this.success(Map.of("list",list, "total", total)); |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
package com.my.graphiteDigesterBg.model; |
|||
import com.my.graphiteDigesterBg.diframe.ActiveRecordField; |
|||
import com.my.graphiteDigesterBg.diframe.DiActiveRecord; |
|||
import com.my.graphiteDigesterBg.diframe.model.DiMdbUser; |
|||
|
|||
public class MdbOperationLog extends DiActiveRecord { |
|||
@ActiveRecordField |
|||
public Integer id; |
|||
|
|||
@ActiveRecordField |
|||
public Integer userId; |
|||
|
|||
@ActiveRecordField |
|||
public String content; |
|||
|
|||
@ActiveRecordField |
|||
public Integer time; |
|||
|
|||
// get table name |
|||
public static String getTableName() { |
|||
return "app_operation_logs"; |
|||
} |
|||
|
|||
// log |
|||
public static void log(DiMdbUser user, String content, Object ... args ) { |
|||
var log = new MdbOperationLog(); |
|||
log.userId = user.id; |
|||
log.content = String.format(content, args); |
|||
log.time = (int)(System.currentTimeMillis() / 1000); |
|||
log.save(); |
|||
} |
|||
} |
@ -1,29 +1,75 @@ |
|||
<template> |
|||
<div class="p-1"> |
|||
<a-table :dataSource="dataSource" :columns="columns"></a-table> |
|||
</div> |
|||
</template> |
|||
<div class="p-1"> |
|||
<a-table |
|||
:pagination="pagination" |
|||
:dataSource="dataSource" |
|||
:columns="columns" |
|||
@change="actionTableChange" |
|||
> |
|||
<template #bodyCell="{ column, record }"> |
|||
<template v-if="column.key === 'user'"> |
|||
{{ record.user.account }} |
|||
</template> |
|||
<template v-else-if="column.key === 'time'"> |
|||
{{ formatTime(record.time) }} |
|||
</template> |
|||
</template> |
|||
</a-table> |
|||
</div> |
|||
</template> |
|||
<script setup> |
|||
import { ref } from 'vue'; |
|||
import ApiClient from '@/utils/ApiClient'; |
|||
import { onMounted, ref } from 'vue'; |
|||
/** @var {Array<Object>} */ |
|||
const columns = [ |
|||
{key:'account',dataIndex:'account',title:'用户',align:'center'}, |
|||
{key:'slot',dataIndex:'slot',title:'试管架',align:'center'}, |
|||
{key:'action',dataIndex:'action',title:'动作',align:'center'}, |
|||
{key:'createdAt',dataIndex: 'createdAt',title:'时间',align:'center'}, |
|||
{key:'user',dataIndex:'user',title:'用户',align:'left'}, |
|||
{key:'content',dataIndex:'content',title:'操作',align:'left'}, |
|||
{key:'time',dataIndex: 'time',title:'时间',align:'right'}, |
|||
]; |
|||
/** @var {Array<Object>} */ |
|||
const dataSource = ref([ |
|||
{account:'admin',slot:'A-1',action:'加入试管',createdAt:'2021-08-01 12:00:00'}, |
|||
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'}, |
|||
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'}, |
|||
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'}, |
|||
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'}, |
|||
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'}, |
|||
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'}, |
|||
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'}, |
|||
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'}, |
|||
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'}, |
|||
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'}, |
|||
]); |
|||
const dataSource = ref([]); |
|||
/** @var {Object} */ |
|||
const pagination = ref({ |
|||
current: 1, |
|||
pageSize: 10, |
|||
total: 0, |
|||
showSizeChanger: false, |
|||
}); |
|||
// on mounted |
|||
onMounted(mounted); |
|||
|
|||
// on mounted |
|||
async function mounted() { |
|||
await refresh(); |
|||
} |
|||
|
|||
// format time |
|||
function formatTime(time) { |
|||
let date = new Date(time * 1000); |
|||
let year = date.getFullYear(); |
|||
let month = (date.getMonth()+1).toString().padStart(2,'0'); |
|||
let day = (date.getDate()).toString().padStart(2,'0'); |
|||
let hour = (date.getHours()).toString().padStart(2,'0'); |
|||
let minute = (date.getMinutes()).toString().padStart(2,'0'); |
|||
let second = (date.getSeconds()).toString().padStart(2,'0'); |
|||
return `${year}-${month}-${day} ${hour}:${minute}:${second}`; |
|||
} |
|||
|
|||
// refresh |
|||
async function refresh() { |
|||
let client = ApiClient.getClient(); |
|||
let response = await client.operationLogList({ |
|||
offset : (pagination.value.current-1)*pagination.value.pageSize, |
|||
limit : pagination.value.pageSize, |
|||
}); |
|||
dataSource.value = response.list; |
|||
pagination.value.total = response.total; |
|||
} |
|||
|
|||
// action table change |
|||
async function actionTableChange(page) { |
|||
pagination.value.current = page.current; |
|||
pagination.value.pageSize = page.pageSize; |
|||
await refresh(); |
|||
} |
|||
</script> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue