| 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; | 
|   | 
| /** | 
|  * <p> | 
|  * 单位转换表 服务实现类 | 
|  * </p> | 
|  * | 
|  * @author moral | 
|  * @since 2021-05-11 | 
|  */ | 
| @Service | 
| public class UnitConversionServiceImpl extends ServiceImpl<UnitConversionMapper, UnitConversion> 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<UnitConversion> 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<UnitConversion> 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<UnitConversion> queryPage = new Page<>(page, size); | 
|         NullFilterWrapper<UnitConversion> 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<UnitConversion> resultPage = unitConversionMapper.selectPage(queryPage, wrapper); | 
|         List<UnitConversion> records = resultPage.getRecords(); | 
|         //查询每条数据对应的原单位对象和目标单位对象 | 
|         Map<String, SysDictData> dictDatas = sysDictDataService.getDictDatasByType(Constants.SYSTEM_DICT_TYPE_UNIT); | 
|         List<UnitConversionDTO> 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<UnitConversion> 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<UnitConversion> 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<UnitConversion> queryWrapper = new QueryWrapper<>(); | 
|         queryWrapper.eq("is_delete",Constants.NOT_DELETE); | 
|         List<UnitConversion> 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<String, SysDictData> 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<String, SysDictData> 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<String, SysDictData> 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); | 
|     } | 
| } |