TEquipmentServiceImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. package com.szwl.service.impl;
  2. import cn.hutool.core.util.RandomUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.szwl.constant.OperationType;
  8. import com.szwl.feign.bean.SyncOldFeign;
  9. import com.szwl.mapper.TEquipmentMapper;
  10. import com.szwl.model.bo.R;
  11. import com.szwl.model.entity.*;
  12. import com.szwl.model.query.StatisticsParam;
  13. import com.szwl.model.utils.MailUtil;
  14. import com.szwl.model.utils.PushUtils;
  15. import com.szwl.model.utils.YunPianSms;
  16. import com.szwl.service.*;
  17. import com.szwl.util.WechatSendUtil;
  18. import org.apache.commons.lang.StringUtils;
  19. import org.springframework.amqp.core.AmqpTemplate;
  20. import org.springframework.amqp.core.MessageProperties;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.context.annotation.Lazy;
  23. import org.springframework.stereotype.Service;
  24. import javax.annotation.Resource;
  25. import java.io.IOException;
  26. import java.util.Date;
  27. import java.util.List;
  28. import java.util.Optional;
  29. import java.util.stream.Collectors;
  30. /**
  31. * <p>
  32. * 服务实现类
  33. * </p>
  34. *
  35. * @author wuhs
  36. * @since 2023-10-25
  37. */
  38. @Service
  39. public class TEquipmentServiceImpl extends ServiceImpl<TEquipmentMapper, TEquipment> implements TEquipmentService {
  40. @Autowired
  41. private AmqpTemplate amqpTemplate;
  42. @Resource
  43. TEquipmentMapper tEquipmentMapper;
  44. @Autowired
  45. TAdminService adminService;
  46. @Resource
  47. SyncOldFeign syncOldFeign;
  48. @Resource
  49. TEquipmentService equipmentService;
  50. @Autowired
  51. TEquipmentDescService equipmentDescService;
  52. @Resource
  53. TWechatService wechatService;
  54. // @Resource
  55. // private MqttService mqttService;
  56. private final MqttService mqttService;
  57. @Resource
  58. MessageLogService messageLogService;
  59. private static final String appid = "07784f5fedb508046c841b391005b7de";
  60. @Autowired
  61. public TEquipmentServiceImpl(@Lazy MqttService mqttService) {
  62. this.mqttService = mqttService;
  63. }
  64. @Override
  65. public String sentMessage(String clientId, String json) {
  66. LambdaQueryWrapper<TEquipment> query = Wrappers.lambdaQuery();
  67. query.eq(TEquipment::getClientId,clientId);
  68. List<TEquipment> equipmentList = tEquipmentMapper.selectList(query);
  69. if(equipmentList.size()==0){
  70. return "该设备不存在";
  71. }
  72. TEquipment equipment = equipmentList.get(0);
  73. if (equipment == null) {
  74. return "该设备不存在";
  75. }
  76. String channel = equipment.getChannel();
  77. String equimentType = equipment.getEquimentType();
  78. if(StringUtils.isEmpty(channel)||channel.equals("1")||StringUtils.isEmpty(equimentType)){
  79. //用个推
  80. PushUtils.push(equipment.getGtClientId(), "", "", json);
  81. }
  82. if(StringUtils.isNotEmpty(channel)&&channel.equals("2")&&StringUtils.isNotEmpty(equimentType)){
  83. //用Mq
  84. //1 创建消息
  85. MessageProperties messageProperties = new MessageProperties();
  86. messageProperties.setContentType("text/plain");
  87. org.springframework.amqp.core.Message message = new org.springframework.amqp.core.Message(json.getBytes(), messageProperties);
  88. amqpTemplate.send(equimentType, clientId, message);
  89. }
  90. return "success";
  91. }
  92. @Override
  93. public void sendRemoteMessage(String clientId, OperationType operationType, String message) {
  94. MessageLog messageLog = new MessageLog();
  95. messageLog.setMsgId(System.currentTimeMillis() + RandomUtil.randomNumbers(10));
  96. messageLog.setClientId(clientId);
  97. messageLog.setDirection(1);
  98. messageLog.setOperation(operationType.getCode());
  99. messageLog.setTimestamp(System.currentTimeMillis());
  100. messageLog.setDataContent(message);
  101. messageLog.setCreatedAt(new Date());
  102. messageLogService.save(messageLog);
  103. // 参数
  104. JSONObject data = new JSONObject();
  105. // 请求流水号
  106. data.put("msgId", messageLog.getMsgId());
  107. data.put("clientId", messageLog.getClientId());
  108. data.put("timestamp", messageLog.getTimestamp());
  109. data.put("dataContent", messageLog.getDataContent());
  110. mqttService.sendMessage(clientId, data.toJSONString(), 0);
  111. }
  112. @Override
  113. public String findMachineTotalNum(StatisticsParam param) {
  114. return tEquipmentMapper.findMachineTotalNum(param);
  115. }
  116. @Override
  117. public String findMachineUseNum(StatisticsParam param) {
  118. return tEquipmentMapper.findMachineUseNum(param);
  119. }
  120. @Override
  121. public String findMachineUseNumAdmin(StatisticsParam param) {
  122. return tEquipmentMapper.findMachineUseNumAdmin(param);
  123. }
  124. @Override
  125. public Optional<String> syncOneEquipmentByClientId(String clientId) {
  126. if (StringUtils.isNotEmpty(clientId)) {
  127. TEquipment oldEquipment = R.getDataIfSuccess(syncOldFeign.getEquipmentByClientId(clientId));
  128. Long id = oldEquipment.getId();
  129. Date createDate = oldEquipment.getCreateDate();
  130. Date modifyDate = oldEquipment.getModifyDate();
  131. Long adminId = oldEquipment.getAdminId();
  132. String adminLevel = oldEquipment.getAdminLevel();
  133. String adminPwd = oldEquipment.getAdminPwd();
  134. Long areaId = oldEquipment.getAreaId();
  135. String cabinetHd = oldEquipment.getCabinetHd();
  136. String cabinetTm = oldEquipment.getCabinetTm();
  137. // String clientId = oldEquipment.getClientId();
  138. String contactName = oldEquipment.getContactName();
  139. String contactPhone = oldEquipment.getContactPhone();
  140. String operationalPhone = oldEquipment.getOperationalPhone();
  141. String operationalName = oldEquipment.getOperationalName();
  142. String furnaceSp = oldEquipment.getFurnaceSp();
  143. String furnaceTm = oldEquipment.getFurnaceTm();
  144. String guestPwd = oldEquipment.getGuestPwd();
  145. Boolean isNetWork = oldEquipment.getIsNetWork();
  146. Boolean isUsing = oldEquipment.getIsUsing();
  147. Date lastUpdateTime = oldEquipment.getLastUpdateTime();
  148. Double latitude = oldEquipment.getLatitude();
  149. Double longitude = oldEquipment.getLongitude();
  150. String managerId = oldEquipment.getManagerId();
  151. String selfName = oldEquipment.getSelfName();
  152. String channel = oldEquipment.getChannel();
  153. String name = oldEquipment.getName();
  154. String netWorkingMode = oldEquipment.getNetWorkingMode();
  155. String operator = oldEquipment.getOperator();
  156. Integer payType = oldEquipment.getPayType();
  157. Integer productTotal = oldEquipment.getProductTotal();
  158. String simNo = oldEquipment.getSimNo();
  159. String sn = oldEquipment.getSn();
  160. String adminUserName = oldEquipment.getAdminUserName();
  161. Long agencyId = oldEquipment.getAgencyId();
  162. Long merchantId = oldEquipment.getMerchantId();
  163. String companyPhone = oldEquipment.getCompanyPhone();
  164. Long personageId = oldEquipment.getPersonageId();
  165. Integer type = oldEquipment.getType();
  166. String fullName = oldEquipment.getFullName();
  167. Date pushUpdateTime = oldEquipment.getPushUpdateTime();
  168. Long timeRuleId = oldEquipment.getTimeRuleId();
  169. String gtClientId = oldEquipment.getGtClientId();
  170. Integer eqeStatus = oldEquipment.getEqeStatus();
  171. Boolean isBlocked = oldEquipment.getIsBlocked();
  172. String messageReceiver = oldEquipment.getMessageReceiver();
  173. Boolean isSleep = oldEquipment.getIsSleep();
  174. String advancedParameters = oldEquipment.getAdvancedParameters();
  175. String volume = oldEquipment.getVolume();
  176. String commonParameters = oldEquipment.getCommonParameters();
  177. String network = oldEquipment.getNetwork();
  178. String offTime = oldEquipment.getOffTime();
  179. String bootTime = oldEquipment.getBootTime();
  180. String plcVersion = oldEquipment.getPlcVersion();
  181. String equipmentType = oldEquipment.getEquimentType();
  182. Date endDate = oldEquipment.getEndDate();
  183. String flowers = oldEquipment.getFlowers();
  184. String machineType = oldEquipment.getMachineType();
  185. // String apkVersion = oldEquipment.getApkVersion(); // 旧系统没有
  186. // String couponStatus = oldEquipment.getCouponStatus(); // 旧系统没有
  187. String paymentType = oldEquipment.getPaymentType();
  188. String companyType = oldEquipment.getCompanyType();
  189. TEquipment equipment = new TEquipment();
  190. equipment.setId(id);
  191. equipment.setCreateDate(createDate);
  192. equipment.setModifyDate(modifyDate);
  193. equipment.setAdminId(adminId);
  194. equipment.setAdminLevel(adminLevel);
  195. equipment.setAdminPwd(adminPwd);
  196. equipment.setAreaId(areaId);
  197. equipment.setCabinetHd(cabinetHd);
  198. equipment.setCabinetTm(cabinetTm);
  199. equipment.setClientId(clientId);
  200. equipment.setContactName(contactName);
  201. equipment.setContactPhone(contactPhone);
  202. equipment.setOperationalPhone(operationalPhone);
  203. equipment.setOperationalName(operationalName);
  204. equipment.setFurnaceSp(furnaceSp);
  205. equipment.setFurnaceTm(furnaceTm);
  206. equipment.setGuestPwd(guestPwd);
  207. equipment.setIsNetWork(isNetWork);
  208. equipment.setIsUsing(isUsing);
  209. equipment.setLastUpdateTime(lastUpdateTime);
  210. equipment.setLatitude(latitude);
  211. equipment.setLongitude(longitude);
  212. equipment.setManagerId(managerId);
  213. equipment.setSelfName(selfName);
  214. equipment.setChannel(channel);
  215. equipment.setName(name);
  216. equipment.setNetWorkingMode(netWorkingMode);
  217. equipment.setOperator(operator);
  218. equipment.setPayType(payType);
  219. equipment.setProductTotal(productTotal);
  220. equipment.setSimNo(simNo);
  221. equipment.setSn(sn);
  222. equipment.setAdminUserName(adminUserName);
  223. equipment.setAgencyId(agencyId);
  224. equipment.setMerchantId(merchantId);
  225. equipment.setCompanyPhone(companyPhone);
  226. equipment.setPersonageId(personageId);
  227. equipment.setType(type);
  228. equipment.setFullName(fullName);
  229. equipment.setPushUpdateTime(pushUpdateTime);
  230. equipment.setTimeRuleId(timeRuleId);
  231. equipment.setGtClientId(gtClientId);
  232. equipment.setEqeStatus(eqeStatus);
  233. equipment.setIsBlocked(isBlocked);
  234. equipment.setMessageReceiver(messageReceiver);
  235. equipment.setIsSleep(isSleep);
  236. equipment.setAdvancedParameters(advancedParameters);
  237. equipment.setVolume(volume);
  238. equipment.setCommonParameters(commonParameters);
  239. equipment.setNetwork(network);
  240. equipment.setOffTime(offTime);
  241. equipment.setBootTime(bootTime);
  242. equipment.setPlcVersion(plcVersion);
  243. equipment.setEquimentType(equipmentType);
  244. equipment.setEndDate(endDate);
  245. equipment.setFlowers(flowers);
  246. equipment.setMachineType(machineType);
  247. equipment.setCompanyType(companyType);
  248. equipment.setPaymentType(paymentType);
  249. equipmentService.save(equipment);
  250. return Optional.of("success");
  251. } else {
  252. return Optional.empty();
  253. }
  254. }
  255. @Override
  256. public int getForeignEquipmentCount(String area) {
  257. switch (area) {
  258. case "0":
  259. // 统计国内
  260. List<Long> domesticAdminIdList = adminService.lambdaQuery().eq(TAdmin::getIfForeign, "0").list().stream().map(TAdmin::getId).collect(Collectors.toList());
  261. return equipmentService.lambdaQuery().in(TEquipment::getAdminId, domesticAdminIdList).count();
  262. case "1":
  263. // 统计海外
  264. List<Long> overseasAdminIdList = adminService.lambdaQuery().eq(TAdmin::getIfForeign, "1").list().stream().map(TAdmin::getId).collect(Collectors.toList());
  265. return equipmentService.lambdaQuery().in(TEquipment::getAdminId, overseasAdminIdList).count();
  266. case "2":
  267. // 统计全球
  268. return equipmentService.list().size();
  269. default:
  270. return 0;
  271. }
  272. }
  273. @Override
  274. public void checkEquipmentStatus() {
  275. // 检查处于开机状态的机器
  276. LambdaQueryWrapper<TEquipment> query = Wrappers.lambdaQuery();
  277. query.eq(TEquipment::getEqeStatus, 1);
  278. List<TEquipment> equipmentList = equipmentService.list(query);
  279. if (!equipmentList.isEmpty()) {
  280. // 获取当前时间,并检查设备状态是否过期
  281. long nowTime = System.currentTimeMillis();
  282. for (TEquipment equipment : equipmentList) {
  283. if (equipment.getModifyDate() != null) {
  284. // 如果设备的最后刷新时间超过480秒前,则清除设备状态信息,更改为关机状态
  285. long updateTime = equipment.getModifyDate().getTime();
  286. if (nowTime > updateTime && (nowTime - updateTime) > 600000) {
  287. // 发送上传心跳信号
  288. equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("onoffstatus", "0").toString());
  289. // 添加标志
  290. TEquipmentDesc equipmentDesc = equipmentDescService.getById(equipment.getId());
  291. if (equipmentDesc != null) {
  292. equipmentDesc.setNote("1");
  293. equipmentDescService.updateById(equipmentDesc);
  294. } else {
  295. TEquipmentDesc newEquipmentDesc = new TEquipmentDesc();
  296. newEquipmentDesc.setEquipmentId(equipment.getId());
  297. newEquipmentDesc.setNote("1");
  298. equipmentDescService.save(newEquipmentDesc);
  299. }
  300. }
  301. }
  302. }
  303. }
  304. }
  305. @Override
  306. public void checkAgEquipmentStatus() {
  307. LambdaQueryWrapper<TEquipmentDesc> query = Wrappers.lambdaQuery();
  308. query.eq(TEquipmentDesc::getNote, "1");
  309. List<TEquipmentDesc> list = equipmentDescService.list(query);
  310. if (!list.isEmpty()) {
  311. // 获取当前时间,并检查设备状态是否过期
  312. long nowTime = System.currentTimeMillis();
  313. for (TEquipmentDesc equipmentDesc : list) {
  314. TEquipment equipment = equipmentService.getById(equipmentDesc.getEquipmentId());
  315. long updateTime = equipment.getModifyDate().getTime();
  316. if (nowTime > updateTime && (nowTime - updateTime) > 600000) {
  317. // 判断为异常关机或者断网,通知客户
  318. // equipment.setCabinetTm("0");
  319. // equipment.setCabinetHd("0");
  320. // equipment.setFurnaceTm("0");
  321. // equipment.setFurnaceSp("0");
  322. equipment.setEqeStatus(0);
  323. equipmentService.updateById(equipment);
  324. // 说明机器没有上传信号,判断为网络不好或者关机,发送信号通知客户 查机器归属国内还是国外
  325. TAdmin admin = adminService.getById(equipment.getAdminId());
  326. String ifForeign = admin.getIfForeign();
  327. String timeZone = admin.getTimeZone();
  328. timeZone = StringUtils.isEmpty(timeZone) ? "Asia/Shanghai" : timeZone;
  329. // 查询是申泽还是七云的
  330. String companyType = admin.getCompanyType();
  331. LambdaQueryWrapper<TWechat> wechatQuery = Wrappers.lambdaQuery();
  332. wechatQuery.eq(TWechat::getAdminId, equipment.getAdminId());
  333. TWechat wechat = wechatService.getOne(wechatQuery);
  334. // 设备名称
  335. String name = equipment.getName();
  336. // 如果为空就拿设备编号后六位
  337. if(StringUtils.isEmpty(name)) {
  338. name = equipment.getClientId().substring(equipment.getClientId().length() - 6);
  339. }
  340. String machineType = equipment.getMachineType();
  341. if (StringUtils.isNotEmpty(machineType)) {
  342. machineType = "0";
  343. }
  344. if(wechat != null) {
  345. // 有绑定微信的话发公众号
  346. String openId = wechat.getOpenId();
  347. wechatService.sendNetworkMessage(openId,equipment.getClientId(),name, ifForeign, companyType);
  348. if ("1".equals(ifForeign)) {
  349. // 国外再发邮件
  350. String messageReceiver = equipment.getMessageReceiver();
  351. if(StringUtils.isNotEmpty(messageReceiver)) {
  352. String[] split = messageReceiver.split(",");
  353. for (String s : split) {
  354. WechatSendUtil.sentEmail(s, name, timeZone, machineType);
  355. }
  356. } else {
  357. if(StringUtils.isNotEmpty(admin.getEmail())){
  358. WechatSendUtil.sentEmail(admin.getEmail(), name, timeZone, machineType);
  359. }
  360. }
  361. }
  362. } else {
  363. // 0或空:国内,1:国外
  364. if ("0".equals(ifForeign) || ifForeign.isEmpty()) {
  365. //TODO 国内发短信
  366. } else {
  367. // 国外发送邮件
  368. String messageReceiver = equipment.getMessageReceiver();
  369. if(StringUtils.isNotEmpty(messageReceiver)) {
  370. String[] split = messageReceiver.split(",");
  371. for (String s : split) {
  372. WechatSendUtil.sentEmail(s, name, timeZone, machineType);
  373. }
  374. } else {
  375. if(StringUtils.isNotEmpty(admin.getEmail())){
  376. WechatSendUtil.sentEmail(admin.getEmail(), name, timeZone, machineType);
  377. }
  378. }
  379. }
  380. }
  381. }
  382. equipmentDesc.setNote("0");
  383. equipmentDescService.updateById(equipmentDesc);
  384. }
  385. }
  386. }
  387. @Override
  388. public void informClient(Long adminId, String deviceId) {
  389. LambdaQueryWrapper<TAdmin> queryWrapper = Wrappers.lambdaQuery();
  390. queryWrapper.eq(TAdmin::getId, adminId);
  391. TAdmin admin = adminService.getOne(queryWrapper);
  392. String ifForeign = admin.getIfForeign();
  393. String phone = admin.getPhone();
  394. String email = admin.getEmail();
  395. switch (ifForeign) {
  396. case "0": { // 国内发短信
  397. if (StringUtils.isEmpty(phone)) {
  398. return;
  399. }
  400. try {
  401. String sms = YunPianSms.sendSms(appid, getInformText(deviceId), phone);
  402. System.out.println("短信已发送:" + sms);
  403. } catch (IOException e) {
  404. throw new RuntimeException(e);
  405. }
  406. break;
  407. }
  408. case "1": { // 海外发邮箱
  409. if (StringUtils.isEmpty(email)) {
  410. return;
  411. }
  412. String subject = "Reset the price of the flowers"; // 邮件标题
  413. String content = getInformContent(deviceId); // 邮件正文
  414. new MailUtil().send(email, subject, content);
  415. break;
  416. }
  417. default:
  418. System.out.println("无效的ifForeign");
  419. break;
  420. }
  421. }
  422. private String getInformContent(String deviceId) {
  423. String content;
  424. String str = "Dear customer:<br>" +
  425. "<br>" +
  426. "Your machine number is <" + deviceId + "> cotton candy machine, the number of flowers has been pushed, please reset the price of the flowers!" +
  427. "<br>" +
  428. "<br>" +
  429. "Best Regards.<br>" +
  430. "Sunzee Intelligent";
  431. content = String.format(str);
  432. return content;
  433. }
  434. private String getInformText(String deviceId) {
  435. String sms = "";
  436. if(StringUtils.isNotEmpty(deviceId)){
  437. sms = "【申泽智能】您好,您名下设备编号为" + deviceId + "的机器,花型数量已推送,请重新设置价格!";
  438. }
  439. return sms;
  440. }
  441. /**
  442. * 根据经度获取时区
  443. * @param currentLon 当前经度
  444. * @return
  445. */
  446. public static int lateTimeZone(double currentLon) {
  447. int timeZone ;
  448. int shangValue = (int)(currentLon / 15);
  449. double yushuValue = Math.abs(currentLon % 15);
  450. if (yushuValue <= 7.5) {
  451. timeZone = shangValue;
  452. } else {
  453. timeZone = shangValue +(currentLon > 0 ? 1 :-1);
  454. }
  455. return timeZone;
  456. }
  457. }