MesMoldMaintenancePlanService.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package com.jeesite.modules.mes.service;
  2. import java.util.Date;
  3. import java.util.List;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. import org.springframework.transaction.annotation.Transactional;
  9. import com.jeesite.common.entity.Page;
  10. import com.jeesite.common.service.CrudService;
  11. import com.jeesite.modules.mes.entity.MesMoldMaintenanceItem;
  12. import com.jeesite.modules.mes.entity.MesMoldMaintenancePlan;
  13. import com.jeesite.modules.mes.dao.MesMoldMaintenanceItemDao;
  14. import com.jeesite.modules.mes.dao.MesMoldMaintenancePlanDao;
  15. import com.jeesite.modules.mes.util.TencentSmsUtil;
  16. import com.jeesite.modules.tianHong.dao.RptProductionSummaryDao;
  17. /**
  18. * 模具维保计划Service
  19. * @author mes
  20. * @version 2026-07-10
  21. */
  22. @Service
  23. public class MesMoldMaintenancePlanService extends CrudService<MesMoldMaintenancePlanDao, MesMoldMaintenancePlan> {
  24. private static final Logger log = LoggerFactory.getLogger(MesMoldMaintenancePlanService.class);
  25. // TODO: 请在此处填写接收预警短信的手机号(多个用英文逗号分隔)
  26. private static final String SMS_PHONE_NUMBERS = "18461071125";
  27. // 短信发送开关:true允许发送,发送成功后置为false,执行保养后置为true
  28. private static volatile boolean smsAlertEnabled = false;
  29. @Autowired
  30. private MesMoldMaintenanceItemDao mesMoldMaintenanceItemDao;
  31. @Autowired
  32. private RptProductionSummaryDao rptProductionSummaryDao;
  33. /**
  34. * 获取单条数据
  35. */
  36. @Override
  37. public MesMoldMaintenancePlan get(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
  38. return super.get(mesMoldMaintenancePlan);
  39. }
  40. /**
  41. * 查询分页数据
  42. * 剩余批次生产数由定时任务实时计算并更新到数据库,此处直接返回数据库值
  43. */
  44. @Override
  45. public Page<MesMoldMaintenancePlan> findPage(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
  46. return super.findPage(mesMoldMaintenancePlan);
  47. }
  48. /**
  49. * 查询列表数据
  50. */
  51. @Override
  52. public List<MesMoldMaintenancePlan> findList(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
  53. return super.findList(mesMoldMaintenancePlan);
  54. }
  55. /**
  56. * 保存数据(插入或更新)
  57. */
  58. @Override
  59. @Transactional
  60. public void save(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
  61. super.save(mesMoldMaintenancePlan);
  62. }
  63. /**
  64. * 删除数据
  65. */
  66. @Override
  67. @Transactional
  68. public void delete(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
  69. super.delete(mesMoldMaintenancePlan);
  70. }
  71. /**
  72. * 执行保养:根据选中的保养项更新维保计划
  73. * 保养时记录bzh库当前FinishQTY作为上次保养生产完成数,保存初始批次生产数,并重新开启短信预警
  74. */
  75. @Transactional
  76. public void doUpkeep(MesMoldMaintenancePlan mesMoldMaintenancePlan, String itemId) {
  77. MesMoldMaintenanceItem item = new MesMoldMaintenanceItem();
  78. item.setId(itemId);
  79. item = mesMoldMaintenanceItemDao.get(item);
  80. if (item != null) {
  81. mesMoldMaintenancePlan.setMaintenanceItemId(item.getId());
  82. mesMoldMaintenancePlan.setRemainBatchProductionNum(item.getBatchProductionNum());
  83. // 保存初始批次生产数,供定时任务计算使用
  84. mesMoldMaintenancePlan.setInitialBatchProductionNum(item.getBatchProductionNum());
  85. mesMoldMaintenancePlan.setLastMaintenanceLevel(item.getMaintenanceLevel());
  86. mesMoldMaintenancePlan.setLastMaintenanceContent(item.getMaintenanceContent());
  87. mesMoldMaintenancePlan.setLastMaintenanceDate(new Date());
  88. // 查询bzh库当前FinishQTY,保存为上次保养生产完成数
  89. Integer finishQty = rptProductionSummaryDao.getFinishQtyByEqpId(mesMoldMaintenancePlan.getMoldCode());
  90. if (finishQty == null) {
  91. finishQty = 0;
  92. }
  93. mesMoldMaintenancePlan.setLastMaintenanceFinishQty(finishQty);
  94. }
  95. super.save(mesMoldMaintenancePlan);
  96. // 执行保养后重新开启短信预警
  97. smsAlertEnabled = true;
  98. }
  99. /**
  100. * 更新剩余批次生产数和批次完成数(供定时任务调用)
  101. * 使用 REQUIRES_NEW 传播:每次更新在独立新事务中提交,避免加入外层只读事务导致长事务持锁
  102. * @param id 维保计划ID
  103. * @param remainBatchProductionNum 计算后的剩余批次生产数
  104. * @param batchCompleteNum 批次完成数
  105. */
  106. @Transactional(propagation = org.springframework.transaction.annotation.Propagation.REQUIRES_NEW)
  107. public void updateRemainBatchProductionNum(String id, Integer remainBatchProductionNum, Integer batchCompleteNum) {
  108. dao.updateRemainBatchProductionNum(id, remainBatchProductionNum, batchCompleteNum);
  109. }
  110. /**
  111. * 发送剩余批次生产数预警短信
  112. * 仅当 smsAlertEnabled 为 true 时才发送,发送成功后置为 false
  113. * 短信发送失败不影响业务,仅记录日志
  114. */
  115. public void sendBatchAlertSms(MesMoldMaintenancePlan plan) {
  116. if (!smsAlertEnabled) {
  117. log.debug("短信预警已关闭,跳过发送。模具号={}, 剩余批次生产数={}",
  118. plan.getMoldCode(), plan.getRemainBatchProductionNum());
  119. return;
  120. }
  121. if (SMS_PHONE_NUMBERS == null || SMS_PHONE_NUMBERS.trim().isEmpty()) {
  122. log.warn("未配置预警短信接收手机号,跳过发送。模具号={}, 剩余批次生产数={}",
  123. plan.getMoldCode(), plan.getRemainBatchProductionNum());
  124. return;
  125. }
  126. String[] phones = SMS_PHONE_NUMBERS.split(",");
  127. boolean allSuccess = true;
  128. for (String phone : phones) {
  129. String trimmedPhone = phone.trim();
  130. if (trimmedPhone.isEmpty()) {
  131. continue;
  132. }
  133. try {
  134. TencentSmsUtil.sendSms(trimmedPhone);
  135. log.info("模具维保预警短信发送成功: 模具号={}, 剩余批次生产数={}, 手机号={}",
  136. plan.getMoldCode(), plan.getRemainBatchProductionNum(), trimmedPhone);
  137. } catch (Exception e) {
  138. allSuccess = false;
  139. log.error("模具维保预警短信发送失败: 模具号={}, 剩余批次生产数={}, 手机号={}",
  140. plan.getMoldCode(), plan.getRemainBatchProductionNum(), trimmedPhone, e);
  141. }
  142. }
  143. // 所有短信发送成功后,关闭短信预警,直到下次保养才重新开启
  144. if (allSuccess) {
  145. smsAlertEnabled = false;
  146. }
  147. }
  148. }