TwinCalcDayYhjServiceImpl.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package com.jjt.calc.service.impl;
  2. import com.jjt.calc.domain.TwinCalcDayYhj;
  3. import com.jjt.calc.domain.TwinCalcHourYhj;
  4. import com.jjt.calc.mapper.TwinCalcDayYhjMapper;
  5. import com.jjt.calc.mapper.TwinCalcHourYhjMapper;
  6. import com.jjt.calc.service.ITwinCalcDayYhjService;
  7. import com.jjt.common.utils.DateUtils;
  8. import com.jjt.inventory.domain.TwinCalcHourBpOut;
  9. import com.jjt.inventory.service.ITwinCalcHourBpOutService;
  10. import org.apache.ibatis.session.ExecutorType;
  11. import org.apache.ibatis.session.SqlSession;
  12. import org.apache.ibatis.session.SqlSessionFactory;
  13. import org.springframework.stereotype.Service;
  14. import javax.annotation.Resource;
  15. import java.math.BigDecimal;
  16. import java.math.RoundingMode;
  17. import java.time.LocalDate;
  18. import java.time.LocalDateTime;
  19. import java.time.LocalTime;
  20. import java.util.*;
  21. import java.util.stream.Collectors;
  22. /**
  23. * 印花机日统计数据Service业务层处理
  24. *
  25. * @author wukai
  26. * @date 2025-03-07
  27. */
  28. @Service
  29. public class TwinCalcDayYhjServiceImpl implements ITwinCalcDayYhjService {
  30. @Resource
  31. private TwinCalcDayYhjMapper twinCalcDayYhjMapper;
  32. @Resource
  33. private TwinCalcHourYhjMapper hourYhjMapper;
  34. @Resource
  35. private ITwinCalcHourBpOutService bpOutService;
  36. @Resource
  37. private SqlSessionFactory factory;
  38. /**
  39. * 查询印花机日统计数据
  40. *
  41. * @param id 印花机日统计数据主键
  42. * @return 印花机日统计数据
  43. */
  44. @Override
  45. public TwinCalcDayYhj selectTwinCalcDayYhjById(Long id) {
  46. return twinCalcDayYhjMapper.selectTwinCalcDayYhjById(id);
  47. }
  48. /**
  49. * 查询印花机日统计数据列表
  50. *
  51. * @param twinCalcDayYhj 印花机日统计数据
  52. * @return 印花机日统计数据
  53. */
  54. @Override
  55. public List<TwinCalcDayYhj> selectTwinCalcDayYhjList(TwinCalcDayYhj twinCalcDayYhj) {
  56. return twinCalcDayYhjMapper.selectTwinCalcDayYhjList(twinCalcDayYhj);
  57. }
  58. /**
  59. * 新增印花机日统计数据
  60. *
  61. * @param twinCalcDayYhj 印花机日统计数据
  62. * @return 结果
  63. */
  64. @Override
  65. public int insertTwinCalcDayYhj(TwinCalcDayYhj twinCalcDayYhj) {
  66. return twinCalcDayYhjMapper.insertTwinCalcDayYhj(twinCalcDayYhj);
  67. }
  68. /**
  69. * 修改印花机日统计数据
  70. *
  71. * @param twinCalcDayYhj 印花机日统计数据
  72. * @return 结果
  73. */
  74. @Override
  75. public int updateTwinCalcDayYhj(TwinCalcDayYhj twinCalcDayYhj) {
  76. return twinCalcDayYhjMapper.updateTwinCalcDayYhj(twinCalcDayYhj);
  77. }
  78. /**
  79. * 批量删除印花机日统计数据
  80. *
  81. * @param ids 需要删除的印花机日统计数据主键
  82. * @return 结果
  83. */
  84. @Override
  85. public int deleteTwinCalcDayYhjByIds(Long[] ids) {
  86. return twinCalcDayYhjMapper.deleteTwinCalcDayYhjByIds(ids);
  87. }
  88. /**
  89. * 删除印花机日统计数据信息
  90. *
  91. * @param id 印花机日统计数据主键
  92. * @return 结果
  93. */
  94. @Override
  95. public int deleteTwinCalcDayYhjById(Long id) {
  96. return twinCalcDayYhjMapper.deleteTwinCalcDayYhjById(id);
  97. }
  98. /**
  99. * 统计指定日期的数据
  100. * 需要统计2种类型,1.按班组统计 2.按自然日统计
  101. *
  102. * @param localDate 日期
  103. */
  104. @Override
  105. public void day(LocalDate localDate) {
  106. //先删除当前日期数据
  107. twinCalcDayYhjMapper.delete4date(localDate.toString());
  108. //1.先按班组统计
  109. TwinCalcHourYhj search = new TwinCalcHourYhj();
  110. Map<String, Object> params = new HashMap<>(16);
  111. LocalDateTime st = LocalDateTime.of(localDate, LocalTime.MIN).plusHours(7);
  112. LocalDateTime ed = st.plusHours(23);
  113. params.put("sTime", DateUtils.toDate(st));
  114. params.put("eTime", DateUtils.toDate(ed));
  115. search.setParams(params);
  116. List<TwinCalcHourYhj> list = hourYhjMapper.selectTwinCalcHourYhjList(search);
  117. //设置班组
  118. list.forEach(TwinCalcHourYhj::setTeam);
  119. //先按ID分组
  120. Map<Integer, List<TwinCalcHourYhj>> calcMap = list.stream().collect(Collectors.groupingBy(TwinCalcHourYhj::getDeviceId, LinkedHashMap::new, Collectors.toList()));
  121. Map<Integer, TwinCalcDayYhj> resultMap = new HashMap<>(16);
  122. for (Integer deviceId : calcMap.keySet()) {
  123. //按班组统计
  124. Map<String, Integer> calcLength = calcMap.get(deviceId).stream().collect(Collectors.groupingBy(TwinCalcHourYhj::getTeam, Collectors.reducing(0, TwinCalcHourYhj::getLength, Integer::sum)));
  125. Map<String, BigDecimal> calcWeight = calcMap.get(deviceId).stream().collect(Collectors.groupingBy(TwinCalcHourYhj::getTeam, Collectors.mapping(item -> item.getWeight() == null ? BigDecimal.ZERO : item.getWeight(), Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
  126. TwinCalcDayYhj calc = new TwinCalcDayYhj();
  127. calc.setDeviceId(deviceId);
  128. calc.setTime(DateUtils.toDate(localDate));
  129. calc.setLength(calcLength.get("A"), calcLength.get("B"));
  130. calc.setWeight(calcWeight.get("A"), calcWeight.get("B"));
  131. resultMap.put(deviceId, calc);
  132. }
  133. // //按自然日统计
  134. // search = new TwinCalcHourYhj();
  135. // params = new HashMap<>(16);
  136. // params.put("beginDataDate", localDate.toString());
  137. // params.put("endDataDate", localDate.toString());
  138. // search.setParams(params);
  139. // list = hourYhjMapper.selectTwinCalcHourYhjList(search);
  140. //查询白坯投放量
  141. TwinCalcHourBpOut bpOut = new TwinCalcHourBpOut();
  142. bpOut.setParams(params);
  143. List<TwinCalcHourBpOut> bpOutList = bpOutService.selectTwinCalcHourBpOutList(bpOut);
  144. List<TwinCalcDayYhj> yhjList = new ArrayList<>();
  145. //按ID分组统计
  146. Map<Integer, List<TwinCalcHourBpOut>> bpOutMap = bpOutList.stream().collect(Collectors.groupingBy(TwinCalcHourBpOut::getDeviceId, Collectors.toList()));
  147. for (Integer deviceId : calcMap.keySet()) {
  148. TwinCalcDayYhj calc = resultMap.get(deviceId);
  149. List<TwinCalcHourBpOut> bpList = bpOutMap.get(deviceId);
  150. if (bpList != null && !bpList.isEmpty()) {
  151. // 计算白坯投放的总米数和总重量
  152. int totalLength = bpList.stream().mapToInt(TwinCalcHourBpOut::getLength).sum();
  153. int totalWeight = bpList.stream().mapToInt(TwinCalcHourBpOut::getWeight).sum();
  154. // 设置到日统计对象中
  155. calc.setDayLength(totalLength);
  156. calc.setDayWeight(BigDecimal.valueOf(totalWeight).divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP));
  157. } else {
  158. // 如果没有数据,设置为0
  159. calc.setDayLength(0);
  160. calc.setDayWeight(BigDecimal.ZERO);
  161. }
  162. yhjList.add(calc);
  163. }
  164. try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
  165. if (yhjList.size() > 0) {
  166. TwinCalcDayYhjMapper mapper = sqlSession.getMapper(TwinCalcDayYhjMapper.class);
  167. yhjList.forEach(mapper::insertTwinCalcDayYhj);
  168. sqlSession.commit();
  169. }
  170. }
  171. }
  172. }