DeviceDataServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. package com.xy.service;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.xy.annotation.Lock;
  7. import com.xy.collections.list.JArrayList;
  8. import com.xy.collections.map.JConcurrentHashMap;
  9. import com.xy.collections.map.JHashMap;
  10. import com.xy.collections.map.JMap;
  11. import com.xy.dto.DeviceDataDto;
  12. import com.xy.entity.DeviceData;
  13. import com.xy.entity.SysDictRedis;
  14. import com.xy.mapper.DeviceDataMapper;
  15. import com.xy.utils.*;
  16. import com.xy.utils.enums.DictEnum;
  17. import com.xy.utils.enums.DictSonEnum;
  18. import io.swagger.annotations.Api;
  19. import io.swagger.annotations.ApiOperation;
  20. import lombok.AllArgsConstructor;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.web.bind.annotation.PostMapping;
  23. import org.springframework.web.bind.annotation.RequestBody;
  24. import java.time.LocalDateTime;
  25. import java.util.List;
  26. import java.util.Map;
  27. import static com.xy.utils.Beans.copy;
  28. import static com.xy.utils.PlusBeans.toIPage;
  29. import static com.xy.utils.PlusBeans.toPageBean;
  30. /**
  31. * <p>
  32. * 设备统计数据 服务实现类
  33. * </p>
  34. *
  35. * @author lijin
  36. * @since 2023-01-11
  37. */
  38. @Service
  39. @AllArgsConstructor
  40. @Api(tags = "设备统计数据")
  41. public class DeviceDataServiceImpl extends ServiceImpl<DeviceDataMapper, DeviceData> implements DeviceDataService {
  42. @PostMapping("obj")
  43. @ApiOperation("对象查询")
  44. public R<DeviceDataDto.Vo> obj(@RequestBody DeviceDataDto.Vo vo) {
  45. LambdaQueryWrapper<DeviceData> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(vo, DeviceData.class).build();
  46. List<DeviceData> list = list(lambdaQueryWrapper);
  47. if (Emptys.check(list)) {
  48. return R.ok(copy(DeviceDataDto.Vo.class, list).get(0));
  49. }
  50. return R.ok();
  51. }
  52. @PostMapping("page")
  53. @ApiOperation("分页查询")
  54. public R<PageBean<DeviceDataDto.Vo>> page(@RequestBody DeviceDataDto.Page page) {
  55. PageBean pageBean = page.getPage();
  56. LambdaQueryWrapper<DeviceData> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(page, DeviceData.class)
  57. .ge(DeviceData::getCreateTime, page.getBeginCreateTime())
  58. .le(DeviceData::getCreateTime, page.getEndCreateTime())
  59. .build()
  60. .orderByDesc(!Emptys.check(pageBean.getOrders()), DeviceData::getCreateTime);
  61. IPage<DeviceData> iPage = page(toIPage(pageBean), lambdaQueryWrapper);
  62. return R.ok(toPageBean(DeviceDataDto.Vo.class, iPage));
  63. }
  64. @ApiOperation("添加/累加")
  65. @PostMapping("saveOrAccum")
  66. @Lock(value = "saveOrAccum.deviceId", prefix = "data_save_accum_")
  67. public R saveOrAccum(DeviceDataDto.SaveOrAccum saveOrAccum) {
  68. LocalDateTime now = LocalDateTime.now();
  69. String yyyyMMdd = DataTime.toString(now, "yyyyMMdd");
  70. //获取字典
  71. Map<String, SysDictRedis> map = SysDictUtils.get(DictEnum.DEVICE_DATA_TYPE.getKey());
  72. JMap<String, Integer> jMap = new JHashMap<>(map.size());
  73. map.forEach((type, sysDictRedis) -> {
  74. Integer dateValue = Integer.valueOf(yyyyMMdd.substring(0, Integer.valueOf(sysDictRedis.getValue())));
  75. jMap.put(type, dateValue);
  76. });
  77. //查询已存在数据
  78. List<DeviceData> list = list(new LambdaQueryWrapper<DeviceData>()
  79. .eq(DeviceData::getDeviceId, saveOrAccum.getDeviceId())
  80. .in(DeviceData::getDateValue, jMap.toList().value())
  81. );
  82. JMap<String, DeviceData> typeMaps = new JArrayList<>(list).toMap(DeviceData::getType).cover();
  83. //新增或修改的多线程桶map集合
  84. JMap<String, DeviceData> dbMaps = new JConcurrentHashMap<>(map.size());
  85. //封装新增或修改对象
  86. jMap.forEach((type, dateValue) -> {
  87. DeviceData deviceData = typeMaps.get(type);
  88. //添加
  89. if (deviceData == null) {
  90. DeviceData saveOrUpdateInfo = copy(DeviceData.class, saveOrAccum)
  91. .setCreateTime(now)
  92. .setUpdateTime(now)
  93. .setType(type)
  94. .setDateValue(dateValue);
  95. dbMaps.put(type, saveOrUpdateInfo);
  96. return;
  97. }
  98. //累加
  99. DeviceData updateDeviceData = new DeviceData().setId(deviceData.getId()).setUpdateTime(now)
  100. .setSalesMoney(saveOrAccum.getSalesMoney() != null ? saveOrAccum.getSalesMoney() + deviceData.getSalesMoney() : null)
  101. .setSalesCount(saveOrAccum.getSalesCount() != null ? saveOrAccum.getSalesCount() + deviceData.getSalesCount() : null)
  102. .setGoodsCount(saveOrAccum.getGoodsCount() != null ? saveOrAccum.getGoodsCount() + deviceData.getGoodsCount() : null)
  103. .setRefundMoney(saveOrAccum.getRefundMoney() != null ? saveOrAccum.getRefundMoney() + deviceData.getRefundMoney() : null)
  104. .setRefundCount(saveOrAccum.getRefundCount() != null ? saveOrAccum.getRefundCount() + deviceData.getRefundCount() : null)
  105. .setZeroCount(saveOrAccum.getZeroCount() != null ? saveOrAccum.getZeroCount() + deviceData.getZeroCount() : null)
  106. .setDeviceFaultCount(saveOrAccum.getDeviceFaultCount() != null ? saveOrAccum.getDeviceFaultCount() + deviceData.getDeviceFaultCount() : null);
  107. dbMaps.put(type, updateDeviceData);
  108. });
  109. saveOrUpdateBatch(dbMaps.toList().value());
  110. return R.ok();
  111. }
  112. /**
  113. * 集合查询
  114. *
  115. * @param dto
  116. * @return
  117. */
  118. public List<DeviceDataDto.Vo> list(DeviceDataDto.ListDTO dto) {
  119. LambdaQueryWrapper<DeviceData> lambdaQueryWrapper = new MybatisPlusQuery().eqWrapper(dto, DeviceData.class).build();
  120. List<DeviceData> list = list(lambdaQueryWrapper);
  121. return copy(DeviceDataDto.Vo.class, list);
  122. }
  123. /**
  124. * 指定查询商户某设备某天数据
  125. *
  126. * @param deviceId
  127. * @param mercId
  128. * @param dateValue
  129. * @return
  130. */
  131. public DeviceDataDto.Vo getByDay(Long deviceId, Long mercId, String dateValue) {
  132. String type = SysDictUtils.getValue(DictEnum.DEVICE_DATA_TYPE.getKey(), DictSonEnum.DEVICE_DATA_TYPE_DAY.getKey(), String.class);
  133. return getOneData(type, deviceId, mercId, dateValue);
  134. }
  135. /**
  136. * 指定查询商户所有设备某天数据
  137. *
  138. * @param mercId
  139. * @param dateValue
  140. * @return
  141. */
  142. public List<DeviceDataDto.Vo> getMercDataOneDay(Long mercId, String dateValue) {
  143. String type = SysDictUtils.getValue(DictEnum.DEVICE_DATA_TYPE.getKey(), DictSonEnum.DEVICE_DATA_TYPE_DAY.getKey(), String.class);
  144. return getMercListData(type, mercId, dateValue);
  145. }
  146. /**
  147. * 指定查询商户所有设备某月数据
  148. *
  149. * @param mercId
  150. * @param dateValue
  151. * @return
  152. */
  153. public List<DeviceDataDto.Vo> getMercDataOneMonth(Long mercId, String dateValue) {
  154. String type = SysDictUtils.getValue(DictEnum.DEVICE_DATA_TYPE.getKey(), DictSonEnum.DEVICE_DATA_TYPE_MONTH.getKey(), String.class);
  155. return getMercListData(type, mercId, dateValue);
  156. }
  157. /**
  158. * 指定查询商户某设备某月数据
  159. *
  160. * @param deviceId
  161. * @param mercId
  162. * @param dateValue
  163. * @return
  164. */
  165. public DeviceDataDto.Vo getByMonth(Long deviceId, Long mercId, String dateValue) {
  166. String type = SysDictUtils.getValue(DictEnum.DEVICE_DATA_TYPE.getKey(), DictSonEnum.DEVICE_DATA_TYPE_MONTH.getKey(), String.class);
  167. return getOneData(type, deviceId, mercId, dateValue);
  168. }
  169. /**
  170. * 指定查询商户某设备某年数据
  171. *
  172. * @param deviceId
  173. * @param mercId
  174. * @param dateValue
  175. * @return
  176. */
  177. public DeviceDataDto.Vo getByYear(Long deviceId, Long mercId, String dateValue) {
  178. String type = SysDictUtils.getValue(DictEnum.DEVICE_DATA_TYPE.getKey(), DictSonEnum.DEVICE_DATA_TYPE_YEAR.getKey(), String.class);
  179. return getOneData(type, deviceId, mercId, dateValue);
  180. }
  181. /**
  182. * 指定查询商户某设备某年、月、日数据
  183. *
  184. * @param type
  185. * @param deviceId
  186. * @param mercId
  187. * @param dateValue
  188. * @return
  189. */
  190. public DeviceDataDto.Vo getOneData(String type, Long deviceId, Long mercId, String dateValue) {
  191. LambdaQueryWrapper<DeviceData> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  192. lambdaQueryWrapper.eq(DeviceData::getType, type);
  193. lambdaQueryWrapper.eq(DeviceData::getDeviceId, deviceId);
  194. lambdaQueryWrapper.eq(DeviceData::getMercId, mercId);
  195. lambdaQueryWrapper.eq(DeviceData::getDateValue, Integer.valueOf(dateValue));
  196. DeviceData data = getOne(lambdaQueryWrapper);
  197. return copy(DeviceDataDto.Vo.class, data);
  198. }
  199. /**
  200. * 指定查询商户所有设备某年、月、日数据
  201. *
  202. * @param type
  203. * @param mercId
  204. * @param dateValue
  205. * @return
  206. */
  207. public List<DeviceDataDto.Vo> getMercListData(String type, Long mercId, String dateValue) {
  208. LambdaQueryWrapper<DeviceData> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  209. lambdaQueryWrapper.eq(DeviceData::getType, type);
  210. lambdaQueryWrapper.eq(DeviceData::getMercId, mercId);
  211. lambdaQueryWrapper.eq(DeviceData::getDateValue, Integer.valueOf(dateValue));
  212. List<DeviceData> list = list(lambdaQueryWrapper);
  213. return BeanUtil.copyToList(list, DeviceDataDto.Vo.class);
  214. }
  215. /**
  216. * 日范围内每天数据
  217. *
  218. * @param deviceId
  219. * @param startDateValue
  220. * @param endDateValue
  221. * @return
  222. */
  223. public List<DeviceDataDto.Vo> getListByDay(Long deviceId, Integer startDateValue, Integer endDateValue) {
  224. String type = SysDictUtils.getValue(DictEnum.DEVICE_DATA_TYPE.getKey(), DictSonEnum.DEVICE_DATA_TYPE_DAY.getKey(), String.class);
  225. return getListData(type, deviceId, startDateValue, endDateValue);
  226. }
  227. /**
  228. * 日期范围查询
  229. *
  230. * @param type
  231. * @param deviceId
  232. * @param startDateValue
  233. * @param endDateValue
  234. * @return
  235. */
  236. public List<DeviceDataDto.Vo> getListData(String type, Long deviceId, Integer startDateValue, Integer endDateValue) {
  237. LambdaQueryWrapper<DeviceData> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  238. lambdaQueryWrapper.eq(DeviceData::getType, type);
  239. lambdaQueryWrapper.eq(DeviceData::getDeviceId, deviceId);
  240. lambdaQueryWrapper.between(DeviceData::getDateValue, startDateValue, endDateValue);
  241. lambdaQueryWrapper.orderBy(true, true, DeviceData::getDateValue);
  242. List<DeviceData> list = list(lambdaQueryWrapper);
  243. return copy(DeviceDataDto.Vo.class, list);
  244. }
  245. }