package com.xy.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xy.annotation.Lock;
import com.xy.collections.list.JArrayList;
import com.xy.collections.map.JConcurrentHashMap;
import com.xy.collections.map.JHashMap;
import com.xy.collections.map.JMap;
import com.xy.dto.DeviceDataDto;
import com.xy.entity.DeviceData;
import com.xy.entity.SysDictRedis;
import com.xy.mapper.DeviceDataMapper;
import com.xy.utils.*;
import com.xy.utils.enums.DictEnum;
import com.xy.utils.enums.DictSonEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import static com.xy.utils.Beans.copy;
import static com.xy.utils.PlusBeans.toIPage;
import static com.xy.utils.PlusBeans.toPageBean;
/**
*
* 设备统计数据 服务实现类
*
*
* @author lijin
* @since 2023-01-11
*/
@Service
@AllArgsConstructor
@Api(tags = "设备统计数据")
public class DeviceDataServiceImpl extends ServiceImpl implements DeviceDataService {
@PostMapping("obj")
@ApiOperation("对象查询")
public R obj(@RequestBody DeviceDataDto.Vo vo) {
LambdaQueryWrapper lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(vo, DeviceData.class).build();
List list = list(lambdaQueryWrapper);
if (Emptys.check(list)) {
return R.ok(copy(DeviceDataDto.Vo.class, list).get(0));
}
return R.ok();
}
@PostMapping("page")
@ApiOperation("分页查询")
public R> page(@RequestBody DeviceDataDto.Page page) {
PageBean pageBean = page.getPage();
LambdaQueryWrapper lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceData.class)
.ge(DeviceData::getCreateTime, page.getBeginCreateTime())
.le(DeviceData::getCreateTime, page.getEndCreateTime())
.build()
.orderByDesc(!Emptys.check(pageBean.getOrders()), DeviceData::getCreateTime);
IPage iPage = page(toIPage(pageBean), lambdaQueryWrapper);
return R.ok(toPageBean(DeviceDataDto.Vo.class, iPage));
}
@PostMapping("saveOrAccum")
@ApiOperation("添加/累加")
@Lock(value = "saveOrAccum.deviceId", prefix = "data_save_accum_")
public R saveOrAccum(@RequestBody @Validated DeviceDataDto.SaveOrAccum saveOrAccum) {
LocalDateTime now = LocalDateTime.now();
String stringTime = DataTime.toString(now, "yyyyMMdd");
//获取字典
Map map = SysDictUtils.get(DictEnum.DEVICE_DATA_TYPE.getKey());
//查询已存在数据
List list = list(new LambdaQueryWrapper()
.eq(DeviceData::getDeviceId, saveOrAccum.getDeviceId())
.in(DeviceData::getType, new JHashMap<>(map).toList().key())
);
JMap typeMaps = new JArrayList<>(list).toMap(DeviceData::getType).cover();
//新增或修改的多线程桶map集合
JMap dbMaps = new JConcurrentHashMap<>(map.size());
//封装新增或修改对象
map.forEach((type, sysDictRedis) -> {
DeviceData deviceData = typeMaps.get(type);
//添加
if (deviceData == null) {
Integer dateValue = Integer.valueOf(stringTime.substring(0, Integer.valueOf(sysDictRedis.getValue())));
DeviceData saveOrUpdateInfo = copy(DeviceData.class, saveOrAccum)
.setCreateTime(now)
.setUpdateTime(now)
.setType(type)
.setDateValue(dateValue);
dbMaps.put(type, saveOrUpdateInfo);
return;
}
//累加
DeviceData updateDeviceData = new DeviceData().setId(deviceData.getId()).setUpdateTime(now)
.setSalesMoney(saveOrAccum.getSalesMoney() != null ? saveOrAccum.getSalesMoney() + deviceData.getSalesMoney() : null)
.setSalesCount(saveOrAccum.getSalesCount() != null ? saveOrAccum.getSalesCount() + deviceData.getSalesCount() : null)
.setGoodsCount(saveOrAccum.getGoodsCount() != null ? saveOrAccum.getGoodsCount() + deviceData.getGoodsCount() : null)
.setRefundMoney(saveOrAccum.getRefundMoney() != null ? saveOrAccum.getRefundMoney() + deviceData.getRefundMoney() : null)
.setRefundCount(saveOrAccum.getRefundCount() != null ? saveOrAccum.getRefundCount() + deviceData.getRefundCount() : null)
.setZeroCount(saveOrAccum.getZeroCount() != null ? saveOrAccum.getZeroCount() + deviceData.getZeroCount() : null)
.setDeviceFaultCount(saveOrAccum.getDeviceFaultCount() != null ? saveOrAccum.getDeviceFaultCount() + deviceData.getDeviceFaultCount() : null);
dbMaps.put(type, updateDeviceData);
});
saveOrUpdateBatch(dbMaps.toList().value());
return R.ok();
}
/**
* 集合查询
*
* @param dto
* @return
*/
public List list(DeviceDataDto.ListDTO dto) {
LambdaQueryWrapper lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(dto, DeviceData.class).build();
List list = list(lambdaQueryWrapper);
return copy(DeviceDataDto.Vo.class, list);
}
/**
* 指定查询商户某设备某天数据
*
* @param deviceId
* @param mercId
* @param dateValue
* @return
*/
public DeviceDataDto.Vo getByDay(Long deviceId, Long mercId, String dateValue) {
String type = SysDictUtils.getValue(DictEnum.DEVICE_DATA_TYPE.getKey(), DictSonEnum.DEVICE_DATA_TYPE_DAY.getKey(), String.class);
return getOneData(type, deviceId, mercId, dateValue);
}
/**
* 指定查询商户某设备某月数据
*
* @param deviceId
* @param mercId
* @param dateValue
* @return
*/
public DeviceDataDto.Vo getByMonth(Long deviceId, Long mercId, String dateValue) {
String type = SysDictUtils.getValue(DictEnum.DEVICE_DATA_TYPE.getKey(), DictSonEnum.DEVICE_DATA_TYPE_MONTH.getKey(), String.class);
return getOneData(type, deviceId, mercId, dateValue);
}
/**
* 指定查询商户某设备某年数据
*
* @param deviceId
* @param mercId
* @param dateValue
* @return
*/
public DeviceDataDto.Vo getByYear(Long deviceId, Long mercId, String dateValue) {
String type = SysDictUtils.getValue(DictEnum.DEVICE_DATA_TYPE.getKey(), DictSonEnum.DEVICE_DATA_TYPE_YEAR.getKey(), String.class);
return getOneData(type, deviceId, mercId, dateValue);
}
/**
* 指定查询商户某设备某年、月、日数据
*
* @param type
* @param deviceId
* @param mercId
* @param dateValue
* @return
*/
public DeviceDataDto.Vo getOneData(String type, Long deviceId, Long mercId, String dateValue) {
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(DeviceData::getType, type);
lambdaQueryWrapper.eq(DeviceData::getDeviceId, deviceId);
lambdaQueryWrapper.eq(DeviceData::getMercId, mercId);
lambdaQueryWrapper.eq(DeviceData::getDateValue, Integer.valueOf(dateValue));
DeviceData data = getOne(lambdaQueryWrapper);
return copy(DeviceDataDto.Vo.class, data);
}
}