总结
自定义Operation接口
package com.spiov.cement.tanker.annotation;
import com.spiov.cement.tanker.system.vo.OperatorTypeEnum;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
/**
* 自定义注解类 定义controller方法的中文含义
*
* @author lvzy
* @date 2021/8/11
*/
@Target({METHOD, TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Operation {
/** 功能名称 */
String moduleName() default "";
/** 操作内容 */
String content() default "";
/** 操作类型 0:登录,1:退出,2:新增,3:删除,4:修改,5:查询,6:导入,7:导出 */
OperatorTypeEnum operateType();
}
在Controller使用
Enum类
package com.spiov.cement.tanker.system.vo;
/**
* 操作类型
*
* @author lvzy
* @date 2021/8/11
*/
public enum OperatorTypeEnum {
/** 登录 */
LOGIN("0"),
/** 退出 */
LOGOUT("1"),
/** 新增 */
INSERT("2"),
/** 删除 */
DELETE("3"),
/** 修改 */
UPDATE("4"),
/** 查询 */
SELECT("5"),
/** 导入 */
IMPORT("6"),
/** 导出 */
EXPORT("7");
private String operatorType;
OperatorTypeEnum(String operatorType) {
this.operatorType = operatorType;
}
public String getOperatorType() {
return operatorType;
}
public void setOperatorType(String operatorType) {
this.operatorType = operatorType;
}
}
LocalDate.now() 获取当前时间 DateTimeFormatter 类 格式化时间
LocalDate、LocalTime 的api是有2个方法,分别是:parse()、format()方法,时间类型的转换可以调用这2个来进行日期时间类型的转换
LocalDate.parse()方法–从作为参数传递的字符串 (例如“ 2018-10-23T17:19:33”)中获取 LocalDate Time的实例
LocalDate start = LocalDate.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDate end = LocalDate.parse(endTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDate.isAfter()方法用于检查作为参数传递的日期是否在此LocalDateTime实例之后
字符串转换成日期时间类型
日期转换为字符串
TemporalAdjusters类中预定义实现
TemporalAdjusters类有很多预定义的static方法返回TemporalAdjuster对象,使用不同方式调节Temporal对象而与Temporal实现无关。
下面列举部分方法及其定义描述:
这些方法的名称都是自解释的,更多TemporalAdjusters: 官方文档.
我们从简单实例开始————我们可以使用特定的日期,也可以使用LocalDate.now()获得当前日期。但对本例来说,我们使用固定日期,因为不希望后面期望结果变化造成测试不通过。下面看看如果通过TemporalAdjusters类获得2017-07-08之后的星期日:
再看如何获得当月的最后一天:
实现获取日期代码
根据统计图中的 x与y 轴 数据分别为 日期与在线数 做例子:
serviceImpl
public Map<String, Object> getVehicleOnlineStatistics(Integer flag) {
Map<String, Object> map = new HashMap<>();
List<String> dateList = new ArrayList<>();
List<Integer> onlineNumList = new ArrayList<>();
List<Map<String, Object>> list = new ArrayList<>();
String startTime;
String endTime;
int timeFlag = 0;
switch (flag) {
//本月
case 0:
startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).toString();
endTime = LocalDate.now().toString();
dateList = TimeUtils.getThisMonthDate();
list = homePageMapper.getVehicleOnlineStatistics(timeFlag, startTime, endTime);
break;
//上月
case 1:
startTime = LocalDate.now().minusMonths(1).with(TemporalAdjusters.firstDayOfMonth()).toString();
endTime = LocalDate.now().minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()).toString();
dateList = TimeUtils.getLastMonthDate();
list = homePageMapper.getVehicleOnlineStatistics(timeFlag, startTime, endTime);
break;
//本年
case 2:
timeFlag = 1;
startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfYear()).format(DateTimeFormatter.ofPattern("yyyy-MM"));
endTime = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM"));
dateList = TimeUtils.getThisYearMonth();
list = homePageMapper.getVehicleOnlineStatistics(timeFlag, startTime, endTime);
break;
default:
break;
}
for (String date : dateList) {
Long onlineNum = 0L;
for (Map<String, Object> statistics : list) {
if (date.equals(statistics.get("recordDate"))) {
onlineNum = (Long) statistics.get("onlineNum");
}
}
onlineNumList.add((int) (onlineNum != 0 ? onlineNum : 0));
System.out.println(onlineNum);
}
map.put("dateList", dateList);
map.put("onlineNumList",onlineNumList);
return map;
}
修改impl 考虑扩展性
public Map<String, Object> getVehicleOnlineStatistics(Integer flag,String startTime,String endTime) {
Map<String, Object> map = new HashMap<>(2);
List<Integer> onlineNumList = new ArrayList<>();
List<String> dateList = TimeUtils.getTimeList(startTime, endTime, flag);
List<Map<String, Object>> list = homePageMapper.getVehicleOnlineStatistics(flag, startTime, endTime);
for (String date : dateList) {
Long onlineNum = 0L;
for (Map<String, Object> statistics : list) {
if (date.equals(statistics.get("recordDate"))) {
onlineNum = (Long) statistics.get("onlineNum");
}
}
onlineNumList.add((int) (onlineNum != 0 ? onlineNum : 0));
System.out.println(onlineNum);
}
map.put("dateList", dateList);
map.put("onlineNumList",onlineNumList);
return map;
}
sql语句
<select id="getVehicleOnlineStatistics" resultType="java.util.Map">
SELECT DISTINCT
<if test="flag == 0">
DATE_FORMAT(ces.record_date,'%Y-%m-%d') recordDate,
</if>
<if test="flag == 1">
DATE_FORMAT(ces.record_date,'%Y-%m') recordDate,
</if>
COUNT(ces.is_online) onlineNum
FROM
ct_energy_statics ces
<where>
ces.is_online = 1
<if test="flag == 0">
and DATE_FORMAT(ces.record_date,'%Y-%m-%d') >= #{startTime} AND DATE_FORMAT(record_date,'%Y-%m-%d') <= #{endTime}
</if>
<if test="flag == 1">
and DATE_FORMAT(ces.record_date,'%Y-%m') >= #{startTime} AND DATE_FORMAT(record_date,'%Y-%m') <= #{endTime}
</if>
</where>
<if test="flag == 0">
GROUP BY DATE_FORMAT(ces.record_date,'%Y-%m-%d')
</if>
<if test="flag == 1">
GROUP BY DATE_FORMAT(ces.record_date,'%Y-%m')
</if>
ORDER BY ces.record_date
</select>
Controller
/**
* 首页-运营指标趋势
* @param flag 时间标志 (0本月 1上月 2本年)
* @return cn.iovnet.commons.utils.util.CommonResponse
* @author guozh
* @date 2021/12/13
*/
@PostMapping("/v1/getVehicleOnlineStatistics")
public CommonResponse getVehicleOnlineStatistics(Integer flag){
CommonResponse instance = CommonResponse.getInstance();
Map<String,Object> onlineStatistics = homePageService.getVehicleOnlineStatistics(flag);
instance.setResultData(onlineStatistics);
return instance;
}
MP和SpringBoot 做编辑信息时,先查后改
调用updateAllColumnById()方法更合适
serviceImpl 类
public void updateAddOilRecord(CtRealAddOilRecord vo) {
CtRealAddOilRecord oilRecord = ctRealAddOilRecordMapper.selectById(vo.getId());
CtVehicleInfo vehicleInfo = ctVehicleInfoMapper.selectById(vo.getVehicleId());
if (vehicleInfo != null) {
oilRecord.setVehicleId(vo.getVehicleId());
oilRecord.setAddOilNum(vo.getAddOilNum());
oilRecord.setAddOilPrice(vo.getAddOilPrice());
oilRecord.setOilPrice(vo.getOilPrice());
oilRecord.setOilCardBalance(vo.getOilCardBalance());
oilRecord.setMeterMileage(vo.getMeterMileage());
oilRecord.setTransactionTime(vo.getTransactionTime());
oilRecord.setOilCardCode(vo.getOilCardCode());
oilRecord.setStartTime(vo.getStartTime());
oilRecord.setEndTime(vo.getEndTime());
oilRecord.setTransactionSerialNumber(vo.getTransactionSerialNumber());
oilRecord.setAddOilBillUrl(vo.getAddOilBillUrl());
oilRecord.setCompanyId(vehicleInfo.getCompanyId());
oilRecord.setDeptId(vehicleInfo.getDeptId());
oilRecord.setBrandId(vehicleInfo.getBrandId());
oilRecord.setPlateNo(vehicleInfo.getPlateNo());
oilRecord.setModel(vehicleInfo.getModel());
oilRecord.setTankType(vehicleInfo.getTankType());
oilRecord.setTankLength(vehicleInfo.getTankLength());
oilRecord.setTankWidth(vehicleInfo.getTankWidth());
oilRecord.setTankHeight(vehicleInfo.getTankHeight());
oilRecord.setUpdateDate(new Date());
BusinessSqlParamVo paramVo = new BusinessSqlParamVo();
paramVo.setTableName(TableNameEnum.CT_OIL_BUSINESS_DATA);
paramVo.setDate(new SimpleDateFormat(DateUtil.YYYYMMDD).format(vo.getStartTime()));
paramVo.setWhereSql("vehicle_id = " + vo.getVehicleId() + " and send_time >= '" + new SimpleDateFormat(DateUtil.YYYYMMDDHHMMSS).format(vo.getStartTime())
+ "' and send_time <= '" + new SimpleDateFormat(DateUtil.YYYYMMDDHHMMSS).format(vo.getEndTime()) + "' and protocol_id = '18DF2717'");
List<CtOilBusinessData> list = businessSqlUtil.queryCtBusinessData(paramVo, CtOilBusinessData.class);
Double maxLiquidHigh = null;
Double minLiquidHigh = null;
if (CollectionUtils.isNotEmpty(list)) {
List<Double> liquidHighList = list.parallelStream().map(e -> ct18DF2717ParserService.parse(e.getProtocolValue()).getLiquidHigh()).distinct().sorted(Double::compareTo).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(liquidHighList)) {
minLiquidHigh = liquidHighList.get(0);
maxLiquidHigh = liquidHighList.get(liquidHighList.size() - 1);
}
}
if (maxLiquidHigh != null && minLiquidHigh != null && !maxLiquidHigh.equals(minLiquidHigh)) {
double tankArea = DataUtils.getDoubleNum(vo.getAddOilNum() / (maxLiquidHigh - minLiquidHigh), "0.00");
oilRecord.setTankArea(tankArea);
}
ctRealAddOilRecordMapper.updateAllColumnById(oilRecord);
}
}