CustomPointServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package com.tofly.dyrq.custom.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  5. import com.tofly.common.core.util.Date8Util;
  6. import com.tofly.dyrq.custom.entity.PointContent;
  7. import com.tofly.dyrq.custom.entity.UpdatePoint;
  8. import com.tofly.dyrq.custom.mapper.CustomPlanMapper;
  9. import com.tofly.dyrq.custom.mapper.CustomPointMapper;
  10. import com.tofly.dyrq.custom.mapper.PointContentMapper;
  11. import com.tofly.dyrq.custom.service.CustomPointService;
  12. import com.tofly.dyrq.entity.PlanChild;
  13. import com.tofly.dyrq.entity.PlanPointTemp;
  14. import com.tofly.dyrq.entity.SysDeviceType;
  15. import com.tofly.dyrq.entity.TfPlanPathTemp;
  16. import com.tofly.dyrq.service.PlanChildService;
  17. import com.tofly.dyrq.service.PlanPointTempService;
  18. import com.tofly.dyrq.service.SysDeviceTypeService;
  19. import com.tofly.dyrq.service.TfPlanPathTempService;
  20. import lombok.AllArgsConstructor;
  21. import lombok.extern.slf4j.Slf4j;
  22. import org.apache.commons.collections.CollectionUtils;
  23. import org.apache.commons.lang.StringUtils;
  24. import org.springframework.data.redis.core.RedisTemplate;
  25. import org.springframework.data.redis.core.ValueOperations;
  26. import org.springframework.scheduling.annotation.Async;
  27. import org.springframework.scheduling.annotation.Scheduled;
  28. import org.springframework.stereotype.Service;
  29. import org.springframework.transaction.annotation.Transactional;
  30. import java.math.BigDecimal;
  31. import java.text.SimpleDateFormat;
  32. import java.util.*;
  33. import java.util.stream.Collectors;
  34. import javax.annotation.PostConstruct;
  35. @Service
  36. @AllArgsConstructor
  37. @Slf4j
  38. public class CustomPointServiceImpl implements CustomPointService {
  39. private CustomPointMapper customPointMapper;
  40. private PlanPointTempService planPointTempService;
  41. private PlanChildService planChildService;
  42. private TfPlanPathTempService planPathTempService;
  43. private final CustomPlanMapper customPlanMapper;
  44. private final SysDeviceTypeService sysDeviceTypeService;
  45. private final ValueOperations<String, String> valueOperations;
  46. private final RedisTemplate redisTemplate;
  47. private PointContentMapper pointContentMapper;
  48. @Override
  49. @Transactional
  50. public Map<String, Long> updatePointOrPathIsover(List<UpdatePoint> updatePoints) {
  51. Map<String, Long> transfer = new HashMap<>();
  52. List<Long> childList = new ArrayList<>();
  53. HashSet<Long> childIds = new HashSet();
  54. for (UpdatePoint u : updatePoints) {
  55. if (u.getTempId() != null && u.getCheckTime() != null && u.getGpsSpeed() != null) {
  56. if ("0".equals(u.getType())) {
  57. String pointChildPlanState = customPointMapper.getStateByPointId(u.getTempId());
  58. if ("7".equals(pointChildPlanState)) {
  59. transfer.put("pointTempId", u.getTempId());
  60. continue;
  61. }
  62. PointContent pc =new PointContent();
  63. pc.setIsHandle(0);
  64. pc.setJsonContent(JSON.toJSONString(u));
  65. pc.setJsonType(1);
  66. pointContentMapper.insert(pc);
  67. //valueOperations.set("point_" + u.getTempId(), JSON.toJSONString(u));
  68. } else if ("1".equals(u.getType())) {
  69. String childPlanState = customPointMapper.getStateByPath(u.getTempId());
  70. if ("7".equals(childPlanState)) {
  71. transfer.put("pathTempId", u.getTempId());
  72. continue;
  73. } else {
  74. if (!childList.contains(u.getPlanChildId())) {
  75. childList.add(u.getPlanChildId());
  76. }
  77. }
  78. PointContent pc1 =new PointContent();
  79. pc1.setIsHandle(0);
  80. pc1.setJsonContent(JSON.toJSONString(u));
  81. pc1.setJsonType(2);
  82. pointContentMapper.insert(pc1);
  83. //valueOperations.set("path_" + u.getTempId(), JSON.toJSONString(u));
  84. }
  85. }
  86. childIds.add(u.getPlanChildId());
  87. }
  88. PointContent pc2 =new PointContent();
  89. pc2.setIsHandle(0);
  90. pc2.setJsonContent(StringUtils.join(childIds, ","));
  91. pc2.setJsonType(3);
  92. pointContentMapper.insert(pc2);
  93. // SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmssSSSSSSS");
  94. // valueOperations.set("child_" + Long.parseLong(sdf.format(new Date())), StringUtils.join(childIds, ","));
  95. return transfer;
  96. }
  97. // @Override
  98. @Async("asyncServiceExecutor")
  99. @PostConstruct
  100. @Scheduled(fixedDelay = 5000)
  101. public void executPoint() {
  102. try {
  103. List<PointContent> pcList= pointContentMapper.selectList(Wrappers.<PointContent>lambdaQuery()
  104. .eq(PointContent::getIsHandle, 0).eq(PointContent::getJsonType, 1));
  105. if (pcList.size()!=0) {
  106. for(PointContent pc : pcList) {
  107. String pointValue = pc.getJsonContent();
  108. JSONObject jsonObject = JSONObject.parseObject(pointValue);
  109. UpdatePoint u = JSON.toJavaObject(jsonObject,UpdatePoint.class);
  110. planPointTempService.update(Wrappers.<PlanPointTemp>lambdaUpdate()
  111. .set(PlanPointTemp::getIsover, "1")
  112. .set(PlanPointTemp::getOverDate, u.getCheckTime())
  113. .set(PlanPointTemp::getGpsSpeed, u.getGpsSpeed())
  114. .eq(PlanPointTemp::getId, u.getTempId()));
  115. pc.setIsHandle(1);
  116. pointContentMapper.updateById(pc);
  117. }
  118. }
  119. }catch (Exception e) {
  120. e.printStackTrace();
  121. }
  122. }
  123. @Override
  124. @Async("asyncServiceExecutor")
  125. @PostConstruct
  126. @Scheduled(fixedDelay = 5000)
  127. public void executPath() {
  128. try {
  129. List<PointContent> pcList= pointContentMapper.selectList(Wrappers.<PointContent>lambdaQuery()
  130. .eq(PointContent::getIsHandle, 0).eq(PointContent::getJsonType, 2));
  131. System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&"+pcList.size());
  132. if (pcList.size()!=0) {
  133. for(PointContent pc : pcList) {
  134. String pathValue = pc.getJsonContent();;
  135. JSONObject jsonObject = JSONObject.parseObject(pathValue);
  136. UpdatePoint up = JSON.toJavaObject(jsonObject,UpdatePoint.class);
  137. TfPlanPathTemp tppt = planPathTempService.getById(up.getTempId());
  138. if(null!=tppt) {
  139. boolean pathflag =planPathTempService.update(Wrappers.<TfPlanPathTemp>lambdaUpdate()
  140. .set(TfPlanPathTemp::getIsover, "1")
  141. .set(TfPlanPathTemp::getOverDate, up.getCheckTime())
  142. .set(TfPlanPathTemp::getGpsSpeed, up.getGpsSpeed())
  143. .eq(TfPlanPathTemp::getId, up.getTempId()));
  144. //更新完成点所属线的完成率
  145. Long pointTempId =tppt.getTempId();
  146. int isOverNum = planPathTempService.count(Wrappers.<TfPlanPathTemp>lambdaQuery().eq(TfPlanPathTemp::getTempId, pointTempId).eq(TfPlanPathTemp::getIsover, "1"));
  147. int allNum = planPathTempService.count(Wrappers.<TfPlanPathTemp>lambdaQuery().eq(TfPlanPathTemp::getTempId, pointTempId));
  148. double pathOver = new BigDecimal((float) isOverNum / allNum).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
  149. PlanPointTemp one = new PlanPointTemp();
  150. one.setId(pointTempId);
  151. one.setPathIsover(new BigDecimal(pathOver));
  152. planPointTempService.updateById(one);
  153. pc.setIsHandle(1);
  154. pointContentMapper.updateById(pc);
  155. }
  156. }
  157. }
  158. }catch (Exception e) {
  159. e.printStackTrace();
  160. }
  161. }
  162. @Override
  163. @Async("asyncServiceExecutor")
  164. @PostConstruct
  165. @Scheduled(fixedDelay = 6000)
  166. public void executChild() {
  167. try {
  168. List<PointContent> pcList= pointContentMapper.selectList(Wrappers.<PointContent>lambdaQuery()
  169. .eq(PointContent::getIsHandle, 0).eq(PointContent::getJsonType, 3));
  170. if (pcList.size()!=0) {
  171. for(PointContent pc : pcList) {
  172. String childValue = pc.getJsonContent();
  173. List<String> list = Arrays.asList(childValue.split(","));
  174. for (String sid : list) {
  175. Long childPlanId = Long.parseLong(sid);
  176. Date now = Date8Util.getCurrentDate();
  177. //查询当天的计划
  178. Map param1 = new HashMap();
  179. param1.put("now", now);
  180. int pointTotal = 0;
  181. int pointIsoverTotal = 0;
  182. int isOver = 0; //---------巡检点,巡检线isover个数,其他设备check个数
  183. int total = 0; //point_temp个数
  184. double percent = 0;
  185. double percent1 = 0;
  186. Map plan = null;
  187. if(customPlanMapper.getTodayPlan(childPlanId).size()!=0) {
  188. plan = customPlanMapper.getTodayPlan(childPlanId).get(0);
  189. }else {
  190. continue;
  191. }
  192. //查询包含巡检检查内容的类型
  193. List<SysDeviceType> devices = sysDeviceTypeService.list(Wrappers.<SysDeviceType>lambdaQuery().isNotNull(SysDeviceType::getCheckContent));
  194. Set<Long> checkTypes = new HashSet<>();
  195. devices.stream().filter(n -> !checkTypes.add(n.getPointTypeId()))
  196. .collect(Collectors.toSet());
  197. //更新巡检线录入状态
  198. if ("1".equals(plan.get("type"))) {
  199. List<Map> pathTotal = customPlanMapper.getPathTotalInfo(childPlanId);
  200. total = Integer.valueOf(pathTotal.get(0).get("total").toString());
  201. isOver = checkTypes.contains(plan.get("deviceTypeId")) ? Integer.valueOf(pathTotal.get(0).get("checkTotal").toString()) : Integer.valueOf(pathTotal.get(0).get("isovertotal").toString());
  202. pointTotal = Integer.valueOf(pathTotal.get(0).get("pointTotal").toString());
  203. pointIsoverTotal = Integer.valueOf(pathTotal.get(0).get("pointIsoverTotal").toString());
  204. percent = pointTotal == 0 ? 0 : new BigDecimal((float) isOver / total).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
  205. percent1 = pointTotal == 0 ? 0 : new BigDecimal ((float) pointIsoverTotal / pointTotal).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
  206. //更新到位条数
  207. PlanChild planChild = new PlanChild();
  208. planChild.setId(childPlanId);
  209. planChild.setPercent(percent);
  210. planChild.setPercent1(percent1);
  211. planChild.setTotal1(new BigDecimal(pointTotal));
  212. planChild.setIsovertototal(percent * total);
  213. planChild.setIsovertototal1(new BigDecimal(pointIsoverTotal));
  214. planChild.setIsovertototal0(new BigDecimal(isOver));
  215. planChildService.updateById(planChild);
  216. List<PlanPointTemp> pointTemps = new ArrayList<>();
  217. //更新录入状态
  218. List<Map> pathMax = customPlanMapper.getPathMaxSpeed(childPlanId);
  219. for (Map i : pathMax) {
  220. PlanPointTemp planPointTemp = new PlanPointTemp();
  221. planPointTemp.setIsover("1");
  222. planPointTemp.setGpsSpeed((BigDecimal) i.get("gpsSpeed"));
  223. planPointTemp.setState("1");
  224. planPointTemp.setId(Long.parseLong(i.get("tempId").toString()));
  225. planPointTemp.setOverDate((Date) i.get("overDate"));
  226. pointTemps.add(planPointTemp);
  227. }
  228. if(pointTemps.size()!=0) {
  229. planPointTempService.updateBatchById(pointTemps);
  230. }
  231. } else {
  232. //更新巡检点录入状态
  233. total = planPointTempService.count(Wrappers.<PlanPointTemp>lambdaQuery().eq(PlanPointTemp::getChildPlanId, childPlanId));
  234. int pointIsOver = planPointTempService.count(Wrappers.<PlanPointTemp>lambdaQuery().eq(PlanPointTemp::getChildPlanId, childPlanId).eq(PlanPointTemp::getIsover, "1"));
  235. int pointIsCheck = planPointTempService.count(Wrappers.<PlanPointTemp>lambdaQuery().eq(PlanPointTemp::getChildPlanId, childPlanId).eq(PlanPointTemp::getCheckState, "1"));
  236. isOver = checkTypes.contains(Long.parseLong(plan.get("deviceTypeId").toString())) ? pointIsCheck : pointIsOver;
  237. percent = isOver == 0 ? 0 : new BigDecimal((float) isOver / total).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
  238. //更新到位点数
  239. PlanChild planChild = new PlanChild();
  240. planChild.setId(childPlanId);
  241. planChild.setPercent(percent);
  242. planChild.setPercent1(percent);
  243. planChild.setTotal(Double.valueOf(total));
  244. planChild.setTotal1(new BigDecimal(total));
  245. planChild.setIsovertototal(Double.valueOf(isOver));
  246. planChild.setIsovertototal1(new BigDecimal(isOver));
  247. planChildService.updateById(planChild);
  248. }
  249. //更新计划状态 完成进度percent1为1 计划变成完成状态
  250. planChildService.update(Wrappers.<PlanChild>lambdaUpdate().set(PlanChild::getChildPlanState, "3")
  251. .eq(PlanChild::getPercent1, 1).eq(PlanChild::getId, childPlanId));
  252. }
  253. pc.setIsHandle(1);
  254. pointContentMapper.updateById(pc);
  255. }
  256. }
  257. }catch (Exception e) {
  258. // TODO: handle exception
  259. }
  260. }
  261. }