| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- 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<MesMoldMaintenancePlanDao, MesMoldMaintenancePlan> {
- 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<MesMoldMaintenancePlan> findPage(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
- return super.findPage(mesMoldMaintenancePlan);
- }
- /**
- * 查询列表数据
- */
- @Override
- public List<MesMoldMaintenancePlan> 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;
- }
- }
- }
|