用一个字段显示近七天是否做核酸
一、数据库设计
check_flag |
varchar |
核酸检测标识 |
query_date |
datetime |
最新查询时间 |
check_time |
datetime |
最新核酸检测时间 |
假设check_flag为“0111111”,“0”表示未做核酸,“1”表示已做核酸,字符串的第一位表示今天,第二位是昨天,第三位前天,依次地推,表示近七天有没有做核酸。
二、后台逻辑实现
我把这段逻辑分为三种情况:
1、今天第一次查询,已做核酸,这是最理想的情况,之后的查询已经无关紧要,我们不再做任何处理。
2、今天第一次查询,未做核酸,第二次查询已做核酸,之后的查询已经无关紧要,我们不再做任何处理。
3、今天第一次查询,未做核酸,第二次查询未做核酸,第三次查询已做核酸,之后的查询已经无关紧要,我们不再做任何处理。
public void checkHeSuan(){
int dayLength = 7;
String l = configService.selectConfigByKey("personInfo.check.checkValue");
if (StringUtils.isNotBlank(l)){
dayLength = Integer.valueOf(l);
}
int finalDayLength = dayLength;
String currentDate = DateUtils.getDate();
List<ReturnPerson> list = returnPersonService.selectList(new ReturnPerson());
list.stream().forEach(e -> {
String checkFlag = e.getReturnInfo().getCheckFlag() != null ? e.getReturnInfo().getCheckFlag() : "";
try {
String todayFlag = "0"; //今天默认为未做核酸
String queryDate = DateUtils.formatDate(e.getReturnInfo().getQueryDate(), DateUtils.YYYY_MM_DD);
if(currentDate.equals(queryDate)){
//如果今天非第一次查询&&之前的查询都未做核酸
if(checkFlag.startsWith("0")){
Registers registers = registersService.getRegistersByCard(e.getIdcard());
if (registers != null) {
//今天做过核酸
e.getReturnInfo().setCheckTime(DateUtils.parseDate( registers.getGatherTime()));
todayFlag = "1";
checkFlag = todayFlag + checkFlag.substring(1);
e.getReturnInfo().setCheckFlag(dealCheckFlag(checkFlag , finalDayLength));
returnInfoMapper.update(e.getReturnInfo());
}
}
}else {
//如果今天第一次查询
e.getReturnInfo().setQueryDate(new Date());
Registers registers = registersService.getRegistersByCard(e.getIdcard());
if (registers != null) {
//今天做过核酸
todayFlag = "1";
e.getReturnInfo().setCheckTime(DateUtils.parseDate( registers.getGatherTime()));
}
checkFlag = todayFlag + checkFlag;
e.getReturnInfo().setCheckFlag(dealCheckFlag(checkFlag , finalDayLength));
returnInfoMapper.update(e.getReturnInfo());
}
}catch (Exception ex) {
ex.printStackTrace();
}
});
}
public String dealCheckFlag(String checkFlag, int len){
if(StringUtils.isNotBlank(checkFlag) && checkFlag.length() > len){
checkFlag = checkFlag.substring(0, len);
}
return checkFlag;
}
三、前台展示
<template>
<div>
<el-table-column label="每日进行核酸检测(绿色已做,红色未做)" align="left" prop="checkFlag" width="330">
<template slot-scope="scope">
<template v-for="(item, index) in scope.row.checkFlag.split('')">
<el-tag type="success" v-if="item == '1'" style="margin: 3px;">{{ getDateStr(index) }}</el-tag>
<el-tag type="danger" v-if="item == '0'" style="margin: 3px;">{{ getDateStr(index) }}</el-tag>
</template>
</template>
</el-table-column>
</div>
</template>
<script>
export default {
data() {
return {
days:[],
};
},
created() {
this.getNearlyDay(30);
},
methods: {
getDateStr(index){
return this.days[index];
},
getNearlyDay(len){
let date = new Date();
for (let i = 0; i < len; i++) {
//今天加上前6天
let dateItem = new Date(date.getTime() - i * 24 * 60 * 60 * 1000) //使用当天时间戳减去以前的时间毫秒(小时*分*秒*毫秒)
// let y = dateItem.getFullYear() //获取年份
let m = dateItem.getMonth() + 1 //获取月份js月份从0开始,需要+1
let d = dateItem.getDate() //获取日期
m = this.addDate0(m) //给为单数的月份补零
d = this.addDate0(d) //给为单数的日期补零
let valueItem = m + '-' + d //组合
this.days.push(valueItem) //添加至数组
}
},
//给日期加0
addDate0(time) {
if (time.toString().length == 1) {
time = '0' + time.toString()
}
return time
}
}
}
</script>