package com.moral.api.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.moral.api.config.mybatis.wrapper.NullFilterWrapper;
import com.moral.api.entity.Sensor;
import com.moral.api.entity.SysDictData;
import com.moral.api.entity.UnitConversion;
import com.moral.api.mapper.UnitConversionMapper;
import com.moral.api.pojo.dto.unitConversion.UnitConversionDTO;
import com.moral.api.pojo.dto.unitConversion.UnitConversionQueryDTO;
import com.moral.api.pojo.form.unitConversion.UnitConversionDeleteForm;
import com.moral.api.pojo.form.unitConversion.UnitConversionInsertForm;
import com.moral.api.pojo.form.unitConversion.UnitConversionQueryForm;
import com.moral.api.pojo.form.unitConversion.UnitConversionUpdateForm;
import com.moral.api.service.SensorService;
import com.moral.api.service.SysDictDataService;
import com.moral.api.service.UnitConversionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.api.util.CacheUtils;
import com.moral.api.util.LogUtils;
import com.moral.constant.Constants;
import com.moral.constant.RedisConstants;
import com.moral.constant.ResponseCodeEnum;
import com.moral.util.ConvertUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
*
* 单位转换表 服务实现类
*
*
* @author moral
* @since 2021-05-11
*/
@Service
public class UnitConversionServiceImpl extends ServiceImpl implements UnitConversionService {
@Autowired
UnitConversionMapper unitConversionMapper;
@Autowired
SysDictDataService sysDictDataService;
@Autowired
RedisTemplate redisTemplate;
@Autowired
SensorService sensorService;
@Override
@Transactional
public UnitConversionDTO insertUnitConversion(UnitConversionInsertForm form) {
//创建返回对象
UnitConversionDTO dto = new UnitConversionDTO();
//取参
UnitConversion unitConversion = form.formConvertEntity();
//判断原单位和目标单位计算公式是否已经存在于数据库
QueryWrapper existWrapper = new QueryWrapper();
existWrapper.eq("original_unit_key", unitConversion.getOriginalUnitKey());
existWrapper.eq("target_unit_key", unitConversion.getTargetUnitKey());
existWrapper.eq("is_delete", Constants.NOT_DELETE);
List unitConversions = unitConversionMapper.selectList(existWrapper);
if (ObjectUtils.isEmpty(unitConversion.getSensorCode())) {
if (!ObjectUtils.isEmpty(unitConversions)) {
dto.setCode(ResponseCodeEnum.UNIT_CONVERSION_EXIST.getCode());
dto.setMsg(ResponseCodeEnum.UNIT_CONVERSION_EXIST.getMsg());
return dto;
}
}
if (!ObjectUtils.isEmpty(unitConversion.getSensorCode())) {
for (UnitConversion conversion : unitConversions) {
if (ObjectUtils.isEmpty(conversion.getSensorCode())||conversion.getSensorCode().equals(unitConversion.getSensorCode())) {
dto.setCode(ResponseCodeEnum.UNIT_CONVERSION_EXIST.getCode());
dto.setMsg(ResponseCodeEnum.UNIT_CONVERSION_EXIST.getMsg());
return dto;
}
}
}
//插入数据
unitConversionMapper.insert(unitConversion);
//刷新缓存
refreshCache();
//插入日志
insertLog(unitConversion);
//封装返回数据
dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return dto;
}
@Override
public UnitConversionQueryDTO queryUnitConversion(UnitConversionQueryForm form) {
//创建返回对象
UnitConversionQueryDTO dto = new UnitConversionQueryDTO();
//取参
Integer page = form.getPage();
Integer size = form.getSize();
String order = form.getOrder();
String orderType = form.getOrderType();
Integer isDelete = form.getIsDelete();
Integer originalUnitKey = form.getOriginalUnitKey();
Integer targetUnitKey = form.getTargetUnitKey();
//组装查询条件
Page queryPage = new Page<>(page, size);
NullFilterWrapper wrapper = new NullFilterWrapper<>();
wrapper.eq("original_unit_key", originalUnitKey);
wrapper.eq("target_unit_key", targetUnitKey);
//排序顺序条件构造
if (!ObjectUtils.isEmpty(order) && !ObjectUtils.isEmpty(orderType)) {
if (orderType.equals(Constants.ORDER_ASC))
wrapper.orderByAsc(ConvertUtils.toLine(order));
else
wrapper.orderByDesc(ConvertUtils.toLine(order));
}
//逻辑删除条件构造
if (!ObjectUtils.isEmpty(isDelete))
wrapper.eq("is_delete", isDelete);
else
wrapper.eq("is_delete", Constants.NOT_DELETE);
//查询结果
Page resultPage = unitConversionMapper.selectPage(queryPage, wrapper);
List records = resultPage.getRecords();
//查询每条数据对应的原单位对象和目标单位对象
Map dictDatas = sysDictDataService.getDictDatasByType(Constants.SYSTEM_DICT_TYPE_UNIT);
List dtos = new ArrayList<>();
for (UnitConversion record : records) {
UnitConversionDTO unitConversionDTO = new UnitConversionDTO();
SysDictData originalUnit = dictDatas.get(record.getOriginalUnitKey());
SysDictData targetUnit = dictDatas.get(record.getTargetUnitKey());
unitConversionDTO.setUnitConversion(record);
unitConversionDTO.setOriginalUnit(originalUnit);
unitConversionDTO.setTargetUnit(targetUnit);
dtos.add(unitConversionDTO);
}
//封装返回对象
dto.setUnitConversionDTOs(dtos);
dto.setCurrent(resultPage.getCurrent());
dto.setPages(resultPage.getPages());
dto.setSize(resultPage.getSize());
dto.setTotal(resultPage.getTotal());
dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return dto;
}
@Override
@Transactional
public UnitConversionDTO updateUnitConversion(UnitConversionUpdateForm form) {
//创建返回对象
UnitConversionDTO dto = new UnitConversionDTO();
//取参
UnitConversion unitConversion = form.formConvertEntity();
//查找要更新的公式 用于插入日志
QueryWrapper oldWrapper = new QueryWrapper<>();
UnitConversion oldUnitConversion = new UnitConversion();
oldUnitConversion.setId(unitConversion.getId());
oldUnitConversion.setIsDelete(Constants.NOT_DELETE);
oldWrapper.setEntity(oldUnitConversion);
oldUnitConversion = unitConversionMapper.selectOne(oldWrapper);
//更新
unitConversionMapper.updateById(unitConversion);
//刷新缓存
refreshCache();
//操作插入日志
updateLog(oldUnitConversion,form.getFormula());
//封装返回结果
dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return dto;
}
@Override
@Transactional
public UnitConversionDTO deleteUnitConversion(UnitConversionDeleteForm form) {
//创建返回对象
UnitConversionDTO dto = new UnitConversionDTO();
//取参
Integer id = form.getId();
//查询要删除的公式用于插入日志
QueryWrapper oldWrapper = new QueryWrapper<>();
UnitConversion oldUnitConversion = new UnitConversion();
oldUnitConversion.setId(id);
oldUnitConversion.setIsDelete(Constants.NOT_DELETE);
oldWrapper.setEntity(oldUnitConversion);
oldUnitConversion = unitConversionMapper.selectOne(oldWrapper);
//执行逻辑删除
UpdateWrapper deleteWrapper = new UpdateWrapper();
deleteWrapper.set("is_delete", Constants.DELETE);
deleteWrapper.eq("id", id);
unitConversionMapper.update(null, deleteWrapper);
//刷新缓存
refreshCache();
//操作插入日志
deleteLog(oldUnitConversion);
//封装返回对象
dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
return dto;
}
/*刷新缓存*/
@Override
public void refreshCache(){
//刷新设备缓存
CacheUtils.refreshDeviceAlarmInfo();
redisTemplate.delete((RedisConstants.UNIT_CONVERSION));
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("is_delete",Constants.NOT_DELETE);
List unitConversions = unitConversionMapper.selectList(queryWrapper);
if(!ObjectUtils.isEmpty(unitConversions))
redisTemplate.opsForList().leftPushAll(RedisConstants.UNIT_CONVERSION,unitConversions);
}
/**
* @Description: 插入操作插入日志
* @Param: [unitConversion]
* @return: void
* @Author: 陈凯裕
* @Date: 2021/8/26
*/
private void insertLog(UnitConversion unitConversion){
//获取单位字典数据
Map units = sysDictDataService.getDictDatasByType("unit");
String originalUnitKey = unitConversion.getOriginalUnitKey();
String targetUnitKey = unitConversion.getTargetUnitKey();
SysDictData originalData = units.get(originalUnitKey);
SysDictData targetData = units.get(targetUnitKey);
String formula = unitConversion.getFormula();
//公式转换格式
formula = formula.replace(Constants.FORMULA_PLACEHOLDER, "源单位");
formula = "目标单位"+" = "+formula;
String sensorCode = unitConversion.getSensorCode();
StringBuilder content = new StringBuilder();
content.append("添加了单位转换数据;");
content.append("源单位:"+originalData.getDataValue()+";");
content.append("目标单位:"+targetData.getDataValue()+";");
content.append("转换公式:"+formula+";");
if(sensorCode!=null){
Sensor sensor = sensorService.getSensorByCode(sensorCode);
if(sensor!=null)
content.append("针对因子:"+sensor.getName()+";");
}
LogUtils.saveOperationForManage(content.toString(),Constants.INSERT_OPERATE_TYPE);
}
/**
* @Description: 删除操作插入日志
* @Param: [unitConversion]
* @return: void
* @Author: 陈凯裕
* @Date: 2021/8/26
*/
private void deleteLog(UnitConversion unitConversion){
//获取单位字典数据 源单位 目标单位名称
Map units = sysDictDataService.getDictDatasByType("unit");
String originalUnitKey = unitConversion.getOriginalUnitKey();
String targetUnitKey = unitConversion.getTargetUnitKey();
SysDictData originalData = units.get(originalUnitKey);
SysDictData targetData = units.get(targetUnitKey);
//公式转换格式
String formula = unitConversion.getFormula();
formula = formula.replace(Constants.FORMULA_PLACEHOLDER, "源单位");
formula = "目标单位"+" = "+formula;
StringBuilder content = new StringBuilder("删除了转换公式;");
content.append("源单位:"+originalData.getDataValue()+";");
content.append("目标单位:"+targetData.getDataValue()+";");
content.append("转换公式:"+formula+";");
//如果有针对因子则获取针对因子名称
String sensorCode = unitConversion.getSensorCode();
if(sensorCode!=null){
Sensor sensor = sensorService.getSensorByCode(sensorCode);
if(sensor!=null)
content.append("针对因子:"+sensor.getName()+";");
}
LogUtils.saveOperationForManage(content.toString(),Constants.DELETE_OPERATE_TYPE);
}
/**
* @Description: 更新操作插入日志
* @Param: [unitConversion]
* @return: void
* @Author: 陈凯裕
* @Date: 2021/8/26
*/
private void updateLog(UnitConversion oldUnitConversion,String newFormular){
StringBuilder content = new StringBuilder("修改了单位转换公式;");
//获取单位字典数据 源单位 目标单位名称
Map units = sysDictDataService.getDictDatasByType("unit");
String originalUnitKey = oldUnitConversion.getOriginalUnitKey();
String targetUnitKey = oldUnitConversion.getTargetUnitKey();
SysDictData originalData = units.get(originalUnitKey);
SysDictData targetData = units.get(targetUnitKey);
//新公式转换格式
newFormular = newFormular.replace(Constants.FORMULA_PLACEHOLDER, "源单位");
newFormular = "目标单位"+" = "+newFormular;
//旧公式转换
String oldFormula = oldUnitConversion.getFormula();
oldFormula = oldFormula.replace(Constants.FORMULA_PLACEHOLDER, "源单位");
oldFormula = "目标单位"+" = "+oldFormula;
content.append("源单位:"+originalData.getDataValue()+";");
content.append("目标单位:"+targetData.getDataValue()+";");
content.append("转换公式:"+oldFormula+"->"+newFormular+";");
//如果有针对因子则获取针对因子名称
String sensorCode = oldUnitConversion.getSensorCode();
if(sensorCode!=null){
Sensor sensor = sensorService.getSensorByCode(sensorCode);
if(sensor!=null)
content.append("针对因子:"+sensor.getName()+";");
}
LogUtils.saveOperationForManage(content.toString(),Constants.UPDATE_OPERATE_TYPE);
}
}