package com.jeesite.modules.mes.service; import java.util.Date; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.jeesite.common.entity.Page; import com.jeesite.common.service.CrudService; import com.jeesite.modules.mes.entity.MesMoldMaintenanceItem; import com.jeesite.modules.mes.entity.MesMoldMaintenancePlan; import com.jeesite.modules.mes.dao.MesMoldMaintenanceItemDao; import com.jeesite.modules.mes.dao.MesMoldMaintenancePlanDao; import com.jeesite.modules.mes.util.TencentSmsUtil; import com.jeesite.modules.tianHong.dao.RptProductionSummaryDao; /** * 模具维保计划Service * @author mes * @version 2026-07-10 */ @Service public class MesMoldMaintenancePlanService extends CrudService { private static final Logger log = LoggerFactory.getLogger(MesMoldMaintenancePlanService.class); // TODO: 请在此处填写接收预警短信的手机号(多个用英文逗号分隔) private static final String SMS_PHONE_NUMBERS = "18461071125"; // 短信发送开关:true允许发送,发送成功后置为false,执行保养后置为true private static volatile boolean smsAlertEnabled = false; @Autowired private MesMoldMaintenanceItemDao mesMoldMaintenanceItemDao; @Autowired private RptProductionSummaryDao rptProductionSummaryDao; /** * 获取单条数据 */ @Override public MesMoldMaintenancePlan get(MesMoldMaintenancePlan mesMoldMaintenancePlan) { return super.get(mesMoldMaintenancePlan); } /** * 查询分页数据 * 剩余批次生产数由定时任务实时计算并更新到数据库,此处直接返回数据库值 */ @Override public Page findPage(MesMoldMaintenancePlan mesMoldMaintenancePlan) { return super.findPage(mesMoldMaintenancePlan); } /** * 查询列表数据 */ @Override public List findList(MesMoldMaintenancePlan mesMoldMaintenancePlan) { return super.findList(mesMoldMaintenancePlan); } /** * 保存数据(插入或更新) */ @Override @Transactional public void save(MesMoldMaintenancePlan mesMoldMaintenancePlan) { super.save(mesMoldMaintenancePlan); } /** * 删除数据 */ @Override @Transactional public void delete(MesMoldMaintenancePlan mesMoldMaintenancePlan) { super.delete(mesMoldMaintenancePlan); } /** * 执行保养:根据选中的保养项更新维保计划 * 保养时记录bzh库当前FinishQTY作为上次保养生产完成数,保存初始批次生产数,并重新开启短信预警 */ @Transactional public void doUpkeep(MesMoldMaintenancePlan mesMoldMaintenancePlan, String itemId) { MesMoldMaintenanceItem item = new MesMoldMaintenanceItem(); item.setId(itemId); item = mesMoldMaintenanceItemDao.get(item); if (item != null) { mesMoldMaintenancePlan.setMaintenanceItemId(item.getId()); mesMoldMaintenancePlan.setRemainBatchProductionNum(item.getBatchProductionNum()); // 保存初始批次生产数,供定时任务计算使用 mesMoldMaintenancePlan.setInitialBatchProductionNum(item.getBatchProductionNum()); mesMoldMaintenancePlan.setLastMaintenanceLevel(item.getMaintenanceLevel()); mesMoldMaintenancePlan.setLastMaintenanceContent(item.getMaintenanceContent()); mesMoldMaintenancePlan.setLastMaintenanceDate(new Date()); // 查询bzh库当前FinishQTY,保存为上次保养生产完成数 Integer finishQty = rptProductionSummaryDao.getFinishQtyByEqpId(mesMoldMaintenancePlan.getMoldCode()); if (finishQty == null) { finishQty = 0; } mesMoldMaintenancePlan.setLastMaintenanceFinishQty(finishQty); } super.save(mesMoldMaintenancePlan); // 执行保养后重新开启短信预警 smsAlertEnabled = true; } /** * 更新剩余批次生产数和批次完成数(供定时任务调用) * 使用 REQUIRES_NEW 传播:每次更新在独立新事务中提交,避免加入外层只读事务导致长事务持锁 * @param id 维保计划ID * @param remainBatchProductionNum 计算后的剩余批次生产数 * @param batchCompleteNum 批次完成数 */ @Transactional(propagation = org.springframework.transaction.annotation.Propagation.REQUIRES_NEW) public void updateRemainBatchProductionNum(String id, Integer remainBatchProductionNum, Integer batchCompleteNum) { dao.updateRemainBatchProductionNum(id, remainBatchProductionNum, batchCompleteNum); } /** * 发送剩余批次生产数预警短信 * 仅当 smsAlertEnabled 为 true 时才发送,发送成功后置为 false * 短信发送失败不影响业务,仅记录日志 */ public void sendBatchAlertSms(MesMoldMaintenancePlan plan) { if (!smsAlertEnabled) { log.debug("短信预警已关闭,跳过发送。模具号={}, 剩余批次生产数={}", plan.getMoldCode(), plan.getRemainBatchProductionNum()); return; } if (SMS_PHONE_NUMBERS == null || SMS_PHONE_NUMBERS.trim().isEmpty()) { log.warn("未配置预警短信接收手机号,跳过发送。模具号={}, 剩余批次生产数={}", plan.getMoldCode(), plan.getRemainBatchProductionNum()); return; } String[] phones = SMS_PHONE_NUMBERS.split(","); boolean allSuccess = true; for (String phone : phones) { String trimmedPhone = phone.trim(); if (trimmedPhone.isEmpty()) { continue; } try { TencentSmsUtil.sendSms(trimmedPhone); log.info("模具维保预警短信发送成功: 模具号={}, 剩余批次生产数={}, 手机号={}", plan.getMoldCode(), plan.getRemainBatchProductionNum(), trimmedPhone); } catch (Exception e) { allSuccess = false; log.error("模具维保预警短信发送失败: 模具号={}, 剩余批次生产数={}, 手机号={}", plan.getMoldCode(), plan.getRemainBatchProductionNum(), trimmedPhone, e); } } // 所有短信发送成功后,关闭短信预警,直到下次保养才重新开启 if (allSuccess) { smsAlertEnabled = false; } } }