fix:修改添加设备模块及模具模块-维修单、工单管理推送站内信功能

main
HuangHuiKang 1 day ago
parent 0beec525a8
commit d68ac810c0

@ -45,14 +45,14 @@ public class MoldPressureNetRecordController {
@PostMapping("/create")
@Operation(summary = "创建子模具压网记录")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:create')")
@PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:create')")
public CommonResult<Long> createMoldPressureNetRecord(@Valid @RequestBody MoldPressureNetRecordSaveReqVO createReqVO) {
return success(moldPressureNetRecordService.createMoldPressureNetRecord(createReqVO));
}
@PostMapping("/batch-create")
@Operation(summary = "批量创建子模具压网记录")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:create')")
@PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:create')")
public CommonResult<Boolean> createMoldPressureNetRecordBatch(@Valid @RequestBody List<MoldPressureNetRecordSaveReqVO> createReqVOList) {
moldPressureNetRecordService.createBatchMoldPressureNetRecord(createReqVOList);
return success(true);
@ -60,7 +60,7 @@ public class MoldPressureNetRecordController {
@PutMapping("/update")
@Operation(summary = "更新子模具压网记录")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:update')")
@PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:update')")
public CommonResult<Boolean> updateMoldPressureNetRecord(@Valid @RequestBody MoldPressureNetRecordSaveReqVO updateReqVO) {
moldPressureNetRecordService.updateMoldPressureNetRecord(updateReqVO);
return success(true);
@ -69,7 +69,7 @@ public class MoldPressureNetRecordController {
@DeleteMapping("/delete")
@Operation(summary = "删除子模具压网记录")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('erp:mold-brand:delete')")
@PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:delete')")
public CommonResult<Boolean> deleteMoldPressureNetRecord(@RequestParam("id") Long id) {
moldPressureNetRecordService.deleteMoldPressureNetRecord(id);
return success(true);
@ -78,7 +78,7 @@ public class MoldPressureNetRecordController {
@GetMapping("/get")
@Operation(summary = "获得子模具压网记录")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:query')")
@PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:query')")
public CommonResult<MoldPressureNetRecordRespVO> getMoldPressureNetRecord(@RequestParam("id") Long id) {
MoldPressureNetRecordDO record = moldPressureNetRecordService.getMoldPressureNetRecord(id);
return success(BeanUtils.toBean(record, MoldPressureNetRecordRespVO.class));
@ -86,7 +86,7 @@ public class MoldPressureNetRecordController {
@GetMapping("/page")
@Operation(summary = "获得子模具压网记录分页")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:query')")
@PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:query')")
public CommonResult<PageResult<MoldPressureNetRecordRespVO>> getMoldPressureNetRecordPage(@Valid MoldPressureNetRecordPageReqVO pageReqVO) {
PageResult<MoldPressureNetRecordDO> pageResult = moldPressureNetRecordService.getMoldPressureNetRecordPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, MoldPressureNetRecordRespVO.class));
@ -94,7 +94,7 @@ public class MoldPressureNetRecordController {
@GetMapping("/export-excel")
@Operation(summary = "导出子模具压网记录 Excel")
@PreAuthorize("@ss.hasPermission('erp:mold-brand:query')")
@PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportMoldPressureNetRecordExcel(@Valid MoldPressureNetRecordPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {

@ -9,7 +9,8 @@ import lombok.Getter;
public enum TaskTypeEnum {
DEVICE("DEVICE", "设备数据采集"),
WORK_ORDER("WORK_ORDER", "工单生成");
WORK_ORDER("WORK_ORDER", "工单生成"),
MOLD_WORK_ORDER("MOLD_WORK_ORDER", "模具工单生成");
/**
*
@ -53,8 +54,10 @@ public enum TaskTypeEnum {
return 1000000L + baseId;
case WORK_ORDER:
return 2000000L + baseId;
case MOLD_WORK_ORDER:
return 3000000L + baseId;
default:
return 9000000L + baseId;
}
}
}
}

@ -278,4 +278,28 @@ public class TaskSchedulerManager {
return stopTask(taskId);
}
}
/**
*
*/
public boolean startMoldWorkOrderTask(Long configId, String cronExpression) {
Long taskId = TaskTypeEnum.MOLD_WORK_ORDER.generateTaskId(configId);
return startCronTask(taskId, TaskTypeEnum.MOLD_WORK_ORDER.getCode(),
"moldWorkOrder:" + configId, cronExpression);
}
/**
*
*/
public boolean stopMoldWorkOrderTask(Long configId) {
if (configId == null) {
logger.warn("模具工单配置ID不能为空");
return false;
}
Long taskId = TaskTypeEnum.MOLD_WORK_ORDER.generateTaskId(configId);
logger.info("停止模具工单任务配置ID: {}, 生成的任务ID: {}", configId, taskId);
return stopTask(taskId);
}
}

@ -145,6 +145,14 @@ public class MoldTaskManagementController {
return success(true);
}
@PutMapping("/update-enabled")
@Operation(summary = "更新模具任务管理启用状态")
@PreAuthorize("@ss.hasPermission('mes:mold-task-management:update')")
public CommonResult<Boolean> updateMoldTaskManagementEnabled(@Valid @RequestBody MoldTaskManagementUpdateEnabledReqVO updateEnabledReqVO) {
moldtaskManagementService.updateMoldTaskManagementEnabled(updateEnabledReqVO);
return success(true);
}
private PageResult<MoldTaskManagementRespVO> buildPageCreatorName(PageResult<MoldTaskManagementRespVO> planMaintenanceRespVOPageResult) {
for (MoldTaskManagementRespVO planMaintenanceRespVO : planMaintenanceRespVOPageResult.getList()) {

@ -0,0 +1,151 @@
package cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.scheduled.coretask;
import cn.iocoder.yudao.module.common.dal.dataobject.mold.MoldBrandDO;
import cn.iocoder.yudao.module.common.dal.dataobject.moldticketmanagement.MoldTicketManagementDO;
import cn.iocoder.yudao.module.common.dal.dataobject.moldticketresults.MoldTicketResultsDO;
import cn.iocoder.yudao.module.common.dal.mysql.mold.MoldBrandMapper;
import cn.iocoder.yudao.module.common.dal.mysql.moldticketmanagement.MoldTicketManagementMapper;
import cn.iocoder.yudao.module.common.dal.mysql.moldticketresults.MoldTicketResultsMapper;
import cn.iocoder.yudao.module.iot.controller.admin.device.enums.TaskTypeEnum;
import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.core.Task;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldsubject.MoldSubjectDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldtaskmanagement.MoldTaskManagementDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.subjectmoldplan.SubjectMoldPlanDO;
import cn.iocoder.yudao.module.mes.dal.mysql.moldsubject.MoldSubjectMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.moldtaskmanagement.MoldTaskManagementMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.subjectmoldplan.SubjectMoldPlanMapper;
import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Random;
import java.util.stream.Collectors;
@Component
public class GenerateMoldWorkOrderTask implements Task {
private static final Logger logger = LoggerFactory.getLogger(GenerateMoldWorkOrderTask.class);
private static final String MOLD_TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE = "mes_mold_task_ticket_create";
@Resource
private MoldTaskManagementMapper moldTaskManagementMapper;
@Resource
private MoldBrandMapper moldBrandMapper;
@Resource
private MoldTicketManagementMapper moldTicketManagementMapper;
@Resource
private SubjectMoldPlanMapper subjectMoldPlanMapper;
@Resource
private MoldSubjectMapper moldSubjectMapper;
@Resource
private MoldTicketResultsMapper moldTicketResultsMapper;
@Resource
private MesNotifyMessageService mesNotifyMessageService;
@Override
public String getTaskType() {
return TaskTypeEnum.MOLD_WORK_ORDER.getCode();
}
@Override
public void execute(Long taskId, String taskParam) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
logger.info("执行模具工单生成任务任务ID: {}, 参数: {}, 时间: {}",
taskId, taskParam, sdf.format(new Date()));
generateMoldWorkOrder(taskId);
} catch (Exception e) {
logger.error("执行模具工单生成任务异常任务ID: {}", taskId, e);
}
}
private void generateMoldWorkOrder(Long taskId) {
Long id = taskId - 3000000L;
MoldTaskManagementDO moldTaskManagementDO = moldTaskManagementMapper.selectById(id);
if (moldTaskManagementDO == null) {
return;
}
List<Long> moldIds = Arrays.stream(moldTaskManagementDO.getMoldList().split(","))
.map(String::trim)
.map(Long::valueOf)
.collect(Collectors.toList());
List<SubjectMoldPlanDO> subjectMoldPlanDOList = subjectMoldPlanMapper.selectList(
Wrappers.<SubjectMoldPlanDO>lambdaQuery().eq(SubjectMoldPlanDO::getPlanId, moldTaskManagementDO.getProjectForm()));
List<MoldSubjectDO> moldSubjectDOList = subjectMoldPlanDOList.stream()
.map(subjectMoldPlanDO -> moldSubjectMapper.selectById(subjectMoldPlanDO.getSubjectId()))
.filter(Objects::nonNull)
.collect(Collectors.toList());
for (Long moldId : moldIds) {
MoldBrandDO moldDO = moldBrandMapper.selectById(moldId);
if (moldDO == null) {
continue;
}
MoldTicketManagementDO moldTicketManagementDO = new MoldTicketManagementDO();
moldTicketManagementDO.setTaskId(moldTaskManagementDO.getId());
moldTicketManagementDO.setPlanNo(generatePrefixedOrderNo());
moldTicketManagementDO.setPlanId(moldTaskManagementDO.getProjectForm());
moldTicketManagementDO.setMoldName(moldDO.getName());
moldTicketManagementDO.setPlanType(moldTaskManagementDO.getTaskType());
moldTicketManagementDO.setConfigName(moldTaskManagementDO.getName());
moldTicketManagementDO.setTaskEndTime(moldTaskManagementDO.getEndDate() != null
? moldTaskManagementDO.getEndDate().atStartOfDay() : null);
moldTicketManagementDO.setCreator("1");
moldTicketManagementDO.setUpdater("1");
moldTicketManagementMapper.insert(moldTicketManagementDO);
sendMoldTicketCreateNotifyMessage(moldTaskManagementDO, moldTicketManagementDO);
for (MoldSubjectDO moldSubjectDO : moldSubjectDOList) {
MoldTicketResultsDO moldTicketResultsDO = new MoldTicketResultsDO();
moldTicketResultsDO.setInspectionItemName(moldSubjectDO.getSubjectName());
moldTicketResultsDO.setInspectionMethod(moldSubjectDO.getInspectionMethod());
moldTicketResultsDO.setJudgmentCriteria(moldSubjectDO.getJudgmentCriteria());
moldTicketResultsDO.setManagementId(moldTicketManagementDO.getId());
moldTicketResultsDO.setMoldId(moldId);
moldTicketResultsDO.setValueType(moldSubjectDO.getValueType());
moldTicketResultsDO.setCreator("1");
moldTicketResultsDO.setUpdater("1");
moldTicketResultsMapper.insert(moldTicketResultsDO);
}
}
}
private void sendMoldTicketCreateNotifyMessage(MoldTaskManagementDO moldTaskManagementDO,
MoldTicketManagementDO moldTicketManagementDO) {
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("ticketId", moldTicketManagementDO.getId());
templateParams.put("planNo", Objects.toString(moldTicketManagementDO.getPlanNo(), ""));
templateParams.put("configName", Objects.toString(moldTicketManagementDO.getConfigName(), ""));
templateParams.put("moldName", Objects.toString(moldTicketManagementDO.getMoldName(), ""));
templateParams.put("taskEndTime", formatNotifyDateTime(moldTicketManagementDO.getTaskEndTime()));
mesNotifyMessageService.sendToAdmins(moldTaskManagementDO.getOperableUsers(), MOLD_TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "模具工单", moldTicketManagementDO.getId());
}
private String formatNotifyDateTime(LocalDateTime dateTime) {
return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
public static String generatePrefixedOrderNo() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String date = sdf.format(new Date());
String randomNum = String.format("%06d", new Random().nextInt(1000000));
return "E" + date + randomNum;
}
}

@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Schema(description = "模具任务管理 - 更新启用状态 Request VO")
@Data
public class MoldTaskManagementUpdateEnabledReqVO {
@Schema(description = "任务ID", required = true, example = "1024")
@NotNull(message = "任务ID不能为空")
private Long id;
@Schema(description = "是否启用", required = true, example = "true")
@NotNull(message = "启用状态不能为空")
private Boolean enabled;
}

@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.mes.dal.mysql.subjectplan.SubjectPlanMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.taskmanagement.TaskManagementMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.ticketmanagement.TicketManagementMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper;
import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -22,9 +23,14 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Random;
import java.util.stream.Collectors;
@ -33,6 +39,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
@Component
public class GenerateWorkOrderTask implements Task {
private static final Logger logger = LoggerFactory.getLogger(GenerateWorkOrderTask.class);
private static final String TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE = "mes_task_ticket_create";
@Resource
private TaskManagementMapper taskManagementMapper;
@ -52,6 +59,9 @@ public class GenerateWorkOrderTask implements Task {
@Resource
private TicketResultsMapper ticketResultsMapper;
@Resource
private MesNotifyMessageService mesNotifyMessageService;
@Override
public String getTaskType() {
@ -109,6 +119,7 @@ public class GenerateWorkOrderTask implements Task {
ticketManagementDO.setCreator("1");
ticketManagementDO.setUpdater("1");
ticketManagementMapper.insert(ticketManagementDO);
sendTicketCreateNotifyMessage(taskManagementDO, ticketManagementDO);
List<SubjectPlanDO> subjectPlanDOList = subjectPlanMapper.selectList(Wrappers.<SubjectPlanDO>lambdaQuery().eq(SubjectPlanDO::getPlanId, ticketManagementDO.getPlanId()));
for (SubjectPlanDO subjectPlanDO : subjectPlanDOList) {
@ -130,6 +141,22 @@ public class GenerateWorkOrderTask implements Task {
}
}
private void sendTicketCreateNotifyMessage(TaskManagementDO taskManagementDO, TicketManagementDO ticketManagementDO) {
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("ticketId", ticketManagementDO.getId());
templateParams.put("planNo", Objects.toString(ticketManagementDO.getPlanNo(), ""));
templateParams.put("configName", Objects.toString(ticketManagementDO.getConfigName(), ""));
templateParams.put("deviceName", Objects.toString(ticketManagementDO.getDeviceName(), ""));
templateParams.put("taskEndTime", formatNotifyDateTime(ticketManagementDO.getTaskEndTime()));
mesNotifyMessageService.sendToAdmins(taskManagementDO.getOperableUsers(), TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "设备工单", ticketManagementDO.getId());
}
private String formatNotifyDateTime(LocalDateTime dateTime) {
return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
/**
*
*/
@ -140,4 +167,4 @@ public class GenerateWorkOrderTask implements Task {
return "E" + date + randomNum;
}
}
}

@ -16,8 +16,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.deviceledger.DeviceLedgerMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.dvrepair.DvRepairLineMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.dvrepair.DvRepairMapper;
import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService;
import com.alibaba.excel.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@ -56,7 +55,7 @@ public class DvRepairServiceImpl implements DvRepairService {
@Resource
private DvRepairLineMapper dvRepairLineMapper;
@Resource
private NotifyMessageSendApi notifyMessageSendApi;
private MesNotifyMessageService mesNotifyMessageService;
@Resource
@ -90,17 +89,6 @@ public class DvRepairServiceImpl implements DvRepairService {
}
private void sendCreateNotifyMessage(DvRepairDO dvRepair) {
if (StringUtils.isBlank(dvRepair.getAcceptedBy())) {
return;
}
Long acceptedUserId;
try {
acceptedUserId = Long.valueOf(dvRepair.getAcceptedBy().trim());
} catch (NumberFormatException ex) {
log.warn("[sendCreateNotifyMessage][维修人员({})不是有效用户编号,跳过站内信发送]", dvRepair.getAcceptedBy());
return;
}
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("repairId", dvRepair.getId());
templateParams.put("repairCode", Objects.toString(dvRepair.getRepairCode(), ""));
@ -111,15 +99,8 @@ public class DvRepairServiceImpl implements DvRepairService {
templateParams.put("faultDescription", Objects.toString(dvRepair.getFaultDescription(), ""));
templateParams.put("requireDate", formatNotifyDateTime(dvRepair.getRequireDate()));
NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
reqDTO.setUserId(acceptedUserId);
reqDTO.setTemplateCode(DV_REPAIR_CREATE_NOTIFY_TEMPLATE_CODE);
reqDTO.setTemplateParams(templateParams);
try {
notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
} catch (Exception ex) {
log.warn("[sendCreateNotifyMessage][维修单({})站内信发送失败,跳过通知]", dvRepair.getId(), ex);
}
mesNotifyMessageService.sendToAdmin(dvRepair.getAcceptedBy(), DV_REPAIR_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "设备维修单", dvRepair.getId());
}
private String formatNotifyDateTime(LocalDateTime dateTime) {

@ -20,6 +20,7 @@ import cn.iocoder.yudao.module.common.dal.dataobject.moldrepair.MoldRepairLineDO
import cn.iocoder.yudao.module.common.dal.mysql.moldrepair.MoldRepairLineMapper;
import cn.iocoder.yudao.module.common.dal.mysql.moldrepair.MoldRepairMapper;
import cn.iocoder.yudao.module.common.dal.mysql.mold.MoldMapper;
import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService;
import com.alibaba.excel.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -55,6 +56,8 @@ import cn.iocoder.yudao.framework.common.exception.ServiceException;
@Validated
public class MoldRepairServiceImpl implements MoldRepairService {
private static final String MOLD_REPAIR_CREATE_NOTIFY_TEMPLATE_CODE = "mes_mold_repair_create";
@Resource
private MoldRepairMapper moldRepairMapper;
@Resource
@ -65,6 +68,8 @@ public class MoldRepairServiceImpl implements MoldRepairService {
private MoldBrandMapper moldBrandMapper;
@Resource
private AutoCodeUtil autoCodeUtil;
@Resource
private MesNotifyMessageService mesNotifyMessageService;
@Override
@Transactional(rollbackFor = Exception.class)
@ -84,6 +89,7 @@ public class MoldRepairServiceImpl implements MoldRepairService {
// 插入
MoldRepairDO moldRepair = BeanUtils.toBean(createReqVO, MoldRepairDO.class);
moldRepairMapper.insert(moldRepair);
sendCreateNotifyMessage(moldRepair);
// 插入子表
createMoldRepairLineList(moldRepair.getId(), createReqVO.getMoldRepairLines());
@ -91,6 +97,25 @@ public class MoldRepairServiceImpl implements MoldRepairService {
return moldRepair.getId();
}
private void sendCreateNotifyMessage(MoldRepairDO moldRepair) {
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("repairId", moldRepair.getId());
templateParams.put("repairCode", Objects.toString(moldRepair.getRepairCode(), ""));
templateParams.put("repairName", Objects.toString(moldRepair.getRepairName(), ""));
templateParams.put("moldCode", Objects.toString(moldRepair.getMoldCode(), ""));
templateParams.put("moldName", Objects.toString(moldRepair.getMoldName(), ""));
templateParams.put("faultPhenomenon", Objects.toString(moldRepair.getFaultPhenomenon(), ""));
templateParams.put("faultDescription", Objects.toString(moldRepair.getFaultDescription(), ""));
templateParams.put("requireDate", formatNotifyDateTime(moldRepair.getRequireDate()));
mesNotifyMessageService.sendToAdmin(moldRepair.getAcceptedBy(), MOLD_REPAIR_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "模具维修单", moldRepair.getId());
}
private String formatNotifyDateTime(LocalDateTime dateTime) {
return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateMoldRepair(MoldRepairSaveReqVO updateReqVO) {

@ -55,4 +55,6 @@ public interface MoldTaskManagementService {
void createMoldTicket(Long id);
void createMoldTicketDirect(@Valid MoldTaskManagementCreateTicketReqVO createReqVO);
void updateMoldTaskManagementEnabled(@Valid MoldTaskManagementUpdateEnabledReqVO updateEnabledReqVO);
}

@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.scheduler.TaskSchedulerManager;
import cn.iocoder.yudao.module.common.controller.admin.moldticketresults.vo.MoldTicketResultsSaveReqVO;
import cn.iocoder.yudao.module.common.dal.dataobject.mold.MoldBrandDO;
import cn.iocoder.yudao.module.common.dal.dataobject.moldticketmanagement.MoldTicketManagementDO;
@ -14,6 +15,7 @@ import cn.iocoder.yudao.module.common.dal.mysql.moldticketresults.MoldTicketResu
import cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.vo.MoldTaskManagementCreateTicketReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.vo.MoldTaskManagementPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.vo.MoldTaskManagementSaveReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.vo.MoldTaskManagementUpdateEnabledReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.moldticketresults.enums.MoldJobResultEnum;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldplanmaintenance.MoldPlanMaintenanceDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.moldsubject.MoldSubjectDO;
@ -23,7 +25,14 @@ import cn.iocoder.yudao.module.mes.dal.mysql.moldplanmaintenance.MoldPlanMainten
import cn.iocoder.yudao.module.mes.dal.mysql.moldsubject.MoldSubjectMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.moldtaskmanagement.MoldTaskManagementMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.subjectmoldplan.SubjectMoldPlanMapper;
import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.cronutils.model.Cron;
import com.cronutils.model.CronType;
import com.cronutils.model.definition.CronDefinitionBuilder;
import com.cronutils.model.time.ExecutionTime;
import com.cronutils.parser.CronParser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@ -31,17 +40,24 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Random;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TASK_CORN_NOT_EXISTS;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TASK_CORN_NOT_LE_HOUR;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TASK_MANAGEMENT_NOT_EXISTS;
@Service
@ -49,6 +65,8 @@ import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TASK_MANAGEME
@Validated
public class MoldTaskManagementServiceImpl implements MoldTaskManagementService {
private static final String MOLD_TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE = "mes_mold_task_ticket_create";
@Resource
private MoldTaskManagementMapper moldtaskManagementMapper;
@Resource
@ -64,13 +82,44 @@ public class MoldTaskManagementServiceImpl implements MoldTaskManagementService
@Resource
private MoldSubjectMapper moldSubjectMapper;
@Resource
private TaskSchedulerManager taskSchedulerManager;
@Resource
private MesNotifyMessageService mesNotifyMessageService;
@Override
public Long createMoldTaskManagement(MoldTaskManagementSaveReqVO createReqVO) {
isCronIntervalAtLeastOneHour(createReqVO.getCronExpression());
MoldTaskManagementDO moldtaskManagement = BeanUtils.toBean(createReqVO, MoldTaskManagementDO.class);
moldtaskManagementMapper.insert(moldtaskManagement);
return moldtaskManagement.getId();
}
private void isCronIntervalAtLeastOneHour(String cronExpr) {
try {
if (StringUtils.isBlank(cronExpr)) {
return;
}
CronParser parser = new CronParser(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ));
Cron cron = parser.parse(cronExpr);
cron.validate();
ExecutionTime executionTime = ExecutionTime.forCron(cron);
ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime next1 = executionTime.nextExecution(now).get();
ZonedDateTime next2 = executionTime.nextExecution(next1).get();
Duration duration = Duration.between(next1, next2);
if (duration.toHours() < 1) {
throw exception(TASK_CORN_NOT_LE_HOUR);
}
} catch (Exception e) {
throw exception(TASK_CORN_NOT_LE_HOUR);
}
}
@Override
public void updateMoldTaskManagement(MoldTaskManagementSaveReqVO updateReqVO) {
validateMoldTaskManagementExists(updateReqVO.getId());
@ -170,6 +219,7 @@ public class MoldTaskManagementServiceImpl implements MoldTaskManagementService
moldticketManagementDO.setConfigName(configName);
moldticketManagementDO.setTaskEndTime(endDate !=null ? endDate.atStartOfDay(): null);
moldticketManagementMapper.insert(moldticketManagementDO);
sendMoldTicketCreateNotifyMessage(taskId, moldticketManagementDO);
List<MoldTicketResultsDO> createdResults = new ArrayList<>();
for (int index = 0; index < moldSubjectDOList.size(); index++) {
@ -191,6 +241,85 @@ public class MoldTaskManagementServiceImpl implements MoldTaskManagementService
}
}
private void sendMoldTicketCreateNotifyMessage(Long taskId, MoldTicketManagementDO moldticketManagementDO) {
MoldTaskManagementDO moldtaskManagementDO = moldtaskManagementMapper.selectById(taskId);
if (moldtaskManagementDO == null) {
return;
}
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("ticketId", moldticketManagementDO.getId());
templateParams.put("planNo", Objects.toString(moldticketManagementDO.getPlanNo(), ""));
templateParams.put("configName", Objects.toString(moldticketManagementDO.getConfigName(), ""));
templateParams.put("moldName", Objects.toString(moldticketManagementDO.getMoldName(), ""));
templateParams.put("taskEndTime", formatNotifyDateTime(moldticketManagementDO.getTaskEndTime()));
mesNotifyMessageService.sendToAdmins(moldtaskManagementDO.getOperableUsers(), MOLD_TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "模具工单", moldticketManagementDO.getId());
}
private String formatNotifyDateTime(LocalDateTime dateTime) {
return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
@Override
public void updateMoldTaskManagementEnabled(MoldTaskManagementUpdateEnabledReqVO updateEnabledReqVO) {
MoldTaskManagementDO task = moldtaskManagementMapper.selectById(updateEnabledReqVO.getId());
if (task == null) {
throw exception(TASK_MANAGEMENT_NOT_EXISTS);
}
if (StringUtils.isBlank(task.getCronExpression())) {
throw exception(TASK_CORN_NOT_EXISTS);
}
if (Objects.equals(task.getEnabled(), updateEnabledReqVO.getEnabled())) {
return;
}
updateMoldTaskStatusInDB(task.getId(), updateEnabledReqVO.getEnabled());
if (updateEnabledReqVO.getEnabled()) {
enableMoldTaskSchedule(task);
} else {
disableMoldTaskSchedule(task);
}
}
private void enableMoldTaskSchedule(MoldTaskManagementDO task) {
if (StringUtils.isBlank(task.getCronExpression())) {
log.warn("模具任务{}没有配置Cron表达式无法启用调度", task.getId());
return;
}
try {
boolean success = taskSchedulerManager.startMoldWorkOrderTask(task.getId(), task.getCronExpression());
if (success) {
log.info("模具任务{}调度启动成功", task.getId());
} else {
log.error("模具任务{}调度启动失败", task.getId());
}
} catch (Exception e) {
log.error("模具任务{}调度启动异常", task.getId(), e);
}
}
private void disableMoldTaskSchedule(MoldTaskManagementDO task) {
try {
boolean success = taskSchedulerManager.stopMoldWorkOrderTask(task.getId());
if (success) {
log.info("模具任务{}调度停止成功", task.getId());
} else {
log.warn("模具任务{}调度停止失败,可能任务不存在或已停止", task.getId());
}
} catch (Exception e) {
log.error("模具任务{}调度停止异常", task.getId(), e);
}
}
private void updateMoldTaskStatusInDB(Long taskId, Boolean enabled) {
MoldTaskManagementDO updateObj = new MoldTaskManagementDO();
updateObj.setId(taskId);
updateObj.setEnabled(enabled);
moldtaskManagementMapper.updateById(updateObj);
}
private MoldTicketResultsSaveReqVO findMatchedTicketResult(List<MoldTicketResultsSaveReqVO> ticketResultsList,
String subjectName, int index) {
if (CollectionUtils.isEmpty(ticketResultsList)) {

@ -0,0 +1,61 @@
package cn.iocoder.yudao.module.mes.service.notify;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi;
import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Map;
@Service
@Slf4j
public class MesNotifyMessageService {
@Resource
private NotifyMessageSendApi notifyMessageSendApi;
public void sendToAdmins(String userIds, String templateCode, Map<String, Object> templateParams,
String businessName, Object businessId) {
if (StrUtil.isBlank(userIds)) {
return;
}
Arrays.stream(userIds.split(","))
.map(String::trim)
.filter(StrUtil::isNotBlank)
.distinct()
.forEach(userId -> sendToAdmin(userId, templateCode, templateParams, businessName, businessId));
}
public void sendToAdmin(String userId, String templateCode, Map<String, Object> templateParams,
String businessName, Object businessId) {
if (StrUtil.isBlank(userId)) {
return;
}
if (StrUtil.isBlank(templateCode)) {
log.warn("[sendToAdmin][{}({})站内信模板编码为空,跳过通知]", businessName, businessId);
return;
}
Long adminUserId;
try {
adminUserId = Long.valueOf(userId.trim());
} catch (NumberFormatException ex) {
log.warn("[sendToAdmin][{}({})接收人({})不是有效用户编号,跳过通知]", businessName, businessId, userId);
return;
}
NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO();
reqDTO.setUserId(adminUserId);
reqDTO.setTemplateCode(templateCode);
reqDTO.setTemplateParams(templateParams);
try {
notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO);
} catch (Exception ex) {
log.warn("[sendToAdmin][{}({})站内信发送失败,跳过通知]", businessName, businessId, ex);
}
}
}

@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.mes.dal.mysql.planmaintenance.PlanMaintenanceMapp
import cn.iocoder.yudao.module.mes.dal.mysql.subjectplan.SubjectPlanMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.ticketmanagement.TicketManagementMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper;
import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.cronutils.model.Cron;
@ -31,7 +32,9 @@ import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@ -56,6 +59,8 @@ import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
@Slf4j
public class TaskManagementServiceImpl implements TaskManagementService {
private static final String TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE = "mes_task_ticket_create";
@Resource
private TaskManagementMapper taskManagementMapper;
@ -80,6 +85,9 @@ public class TaskManagementServiceImpl implements TaskManagementService {
@Resource
private TaskSchedulerManager taskSchedulerManager;
@Resource
private MesNotifyMessageService mesNotifyMessageService;
@Override
public Long createTaskManagement(TaskManagementSaveReqVO createReqVO) {
String cronExpr = createReqVO.getCronExpression();
@ -215,6 +223,7 @@ public class TaskManagementServiceImpl implements TaskManagementService {
ticketManagementDO.setConfigName(taskManagementDO.getName());
ticketManagementDO.setTaskEndTime(taskManagementDO.getEndDate().atStartOfDay());
ticketManagementMapper.insert(ticketManagementDO);
sendTicketCreateNotifyMessage(taskManagementDO, ticketManagementDO);
List<SubjectPlanDO> subjectPlanDOList = subjectPlanMapper.selectList(Wrappers.<SubjectPlanDO>lambdaQuery().eq(SubjectPlanDO::getPlanId, ticketManagementDO.getPlanId()));
for (SubjectPlanDO subjectPlanDO : subjectPlanDOList) {
@ -234,6 +243,22 @@ public class TaskManagementServiceImpl implements TaskManagementService {
}
private void sendTicketCreateNotifyMessage(TaskManagementDO taskManagementDO, TicketManagementDO ticketManagementDO) {
Map<String, Object> templateParams = new HashMap<>();
templateParams.put("ticketId", ticketManagementDO.getId());
templateParams.put("planNo", Objects.toString(ticketManagementDO.getPlanNo(), ""));
templateParams.put("configName", Objects.toString(ticketManagementDO.getConfigName(), ""));
templateParams.put("deviceName", Objects.toString(ticketManagementDO.getDeviceName(), ""));
templateParams.put("taskEndTime", formatNotifyDateTime(ticketManagementDO.getTaskEndTime()));
mesNotifyMessageService.sendToAdmins(taskManagementDO.getOperableUsers(), TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE,
templateParams, "设备工单", ticketManagementDO.getId());
}
private String formatNotifyDateTime(LocalDateTime dateTime) {
return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
@Override
public void updateTaskManagementEnabled(TaskManagementUpdateEnabledReqVO updateEnabledReqVO) {
// 1. 校验任务是否存在
@ -336,4 +361,4 @@ public class TaskManagementServiceImpl implements TaskManagementService {
String randomNum = String.format("%06d", new Random().nextInt(1000000));
return "E" + date + randomNum;
}
}
}

Loading…
Cancel
Save