Browse Source

处理isc_materials_check_plan

车车 4 months ago
parent
commit
466f5f37a7

+ 8 - 2
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/materialscheckplan/vo/MaterialsCheckPlanSaveReqVO.java

@@ -1,10 +1,12 @@
 package cn.iocoder.yudao.module.iscs.controller.admin.materialscheckplan.vo;
 package cn.iocoder.yudao.module.iscs.controller.admin.materialscheckplan.vo;
 
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.Data;
 
 
-import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
 
 
 @Schema(description = "管理后台 - 物资检查计划新增/修改 Request VO")
 @Schema(description = "管理后台 - 物资检查计划新增/修改 Request VO")
 @Data
 @Data
@@ -20,8 +22,9 @@ public class MaterialsCheckPlanSaveReqVO {
     private Long workstationId;
     private Long workstationId;
 
 
     @Schema(description = "计划日期", requiredMode = Schema.RequiredMode.REQUIRED)
     @Schema(description = "计划日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @JsonFormat(timezone="GMT+8", pattern = "yyyy-MM-dd")
     @NotNull(message = "计划日期不能为空")
     @NotNull(message = "计划日期不能为空")
-    private LocalDate planDate;
+    private Date planDate;
 
 
     @Schema(description = "检察员", example = "15814")
     @Schema(description = "检察员", example = "15814")
     private Long checkUserId;
     private Long checkUserId;
@@ -29,4 +32,7 @@ public class MaterialsCheckPlanSaveReqVO {
     @Schema(description = "备注", example = "你说的对")
     @Schema(description = "备注", example = "你说的对")
     private String remark;
     private String remark;
 
 
+    @Schema(description = "物资柜ID")
+    private List<Long> cabinetIds;
+
 }
 }

+ 67 - 63
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/mailsendtaskitem/MailSendTaskItemService.java

@@ -1,63 +1,67 @@
-package cn.iocoder.yudao.module.iscs.service.mailsendtaskitem;
-
-import java.util.*;
-import jakarta.validation.*;
-import cn.iocoder.yudao.module.iscs.controller.admin.mailsendtaskitem.vo.*;
-import cn.iocoder.yudao.module.iscs.dal.dataobject.mailsendtaskitem.MailSendTaskItemDO;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- * 系统邮件任务 Service 接口
- *
- * @author 芋道源码
- */
-public interface MailSendTaskItemService extends IService<MailSendTaskItemDO> {
-
-    /**
-     * 创建系统邮件任务
-     *
-     * @param createReqVO 创建信息
-     * @return 编号
-     */
-    Long createMailSendTaskItem(@Valid MailSendTaskItemSaveReqVO createReqVO);
-
-    /**
-     * 更新系统邮件任务
-     *
-     * @param updateReqVO 更新信息
-     */
-    void updateMailSendTaskItem(@Valid MailSendTaskItemSaveReqVO updateReqVO);
-
-    /**
-     * 删除系统邮件任务
-     *
-     * @param id 编号
-     */
-    void deleteMailSendTaskItem(Long id);
-
-    /**
-    * 批量删除系统邮件任务
-    *
-    * @param ids 编号
-    */
-    void deleteMailSendTaskItemListByIds(List<Long> ids);
-
-    /**
-     * 获得系统邮件任务
-     *
-     * @param id 编号
-     * @return 系统邮件任务
-     */
-    MailSendTaskItemDO getMailSendTaskItem(Long id);
-
-    /**
-     * 获得系统邮件任务分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 系统邮件任务分页
-     */
-    PageResult<MailSendTaskItemDO> getMailSendTaskItemPage(MailSendTaskItemPageReqVO pageReqVO);
-
-}
+package cn.iocoder.yudao.module.iscs.service.mailsendtaskitem;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.iscs.controller.admin.mailsendtaskitem.vo.MailSendTaskItemPageReqVO;
+import cn.iocoder.yudao.module.iscs.controller.admin.mailsendtaskitem.vo.MailSendTaskItemSaveReqVO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.mailsendtaskitem.MailSendTaskItemDO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import jakarta.validation.Valid;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 系统邮件任务 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface MailSendTaskItemService extends IService<MailSendTaskItemDO> {
+
+    /**
+     * 创建系统邮件任务
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createMailSendTaskItem(@Valid MailSendTaskItemSaveReqVO createReqVO);
+
+    /**
+     * 更新系统邮件任务
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateMailSendTaskItem(@Valid MailSendTaskItemSaveReqVO updateReqVO);
+
+    /**
+     * 删除系统邮件任务
+     *
+     * @param id 编号
+     */
+    void deleteMailSendTaskItem(Long id);
+
+    /**
+    * 批量删除系统邮件任务
+    *
+    * @param ids 编号
+    */
+    void deleteMailSendTaskItemListByIds(List<Long> ids);
+
+    /**
+     * 获得系统邮件任务
+     *
+     * @param id 编号
+     * @return 系统邮件任务
+     */
+    MailSendTaskItemDO getMailSendTaskItem(Long id);
+
+    /**
+     * 获得系统邮件任务分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 系统邮件任务分页
+     */
+    PageResult<MailSendTaskItemDO> getMailSendTaskItemPage(MailSendTaskItemPageReqVO pageReqVO);
+
+    Boolean insertIsMailSendTaskItem(MailSendTaskItemDO mailSendTaskItemDO, HashMap<String, String> map);
+
+}

+ 29 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/mailsendtaskitem/MailSendTaskItemServiceImpl.java

@@ -1,17 +1,23 @@
 package cn.iocoder.yudao.module.iscs.service.mailsendtaskitem;
 package cn.iocoder.yudao.module.iscs.service.mailsendtaskitem;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.mailsendtaskitem.vo.MailSendTaskItemPageReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.mailsendtaskitem.vo.MailSendTaskItemPageReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.mailsendtaskitem.vo.MailSendTaskItemSaveReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.mailsendtaskitem.vo.MailSendTaskItemSaveReqVO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.mailsendtaskitem.MailSendTaskItemDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.mailsendtaskitem.MailSendTaskItemDO;
 import cn.iocoder.yudao.module.iscs.dal.mysql.mailsendtaskitem.MailSendTaskItemMapper;
 import cn.iocoder.yudao.module.iscs.dal.mysql.mailsendtaskitem.MailSendTaskItemMapper;
+import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
+import cn.iocoder.yudao.module.system.service.mail.MailTemplateService;
+import cn.iocoder.yudao.module.system.service.user.AdminUserService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import jakarta.annotation.Resource;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -25,6 +31,10 @@ public class MailSendTaskItemServiceImpl extends ServiceImpl<MailSendTaskItemMap
 
 
     @Resource
     @Resource
     private MailSendTaskItemMapper mailSendTaskItemMapper;
     private MailSendTaskItemMapper mailSendTaskItemMapper;
+    @Resource
+    private AdminUserService adminUserService;
+    @Resource
+    private MailTemplateService mailTemplateService;
 
 
     @Override
     @Override
     public Long createMailSendTaskItem(MailSendTaskItemSaveReqVO createReqVO) {
     public Long createMailSendTaskItem(MailSendTaskItemSaveReqVO createReqVO) {
@@ -84,4 +94,23 @@ public class MailSendTaskItemServiceImpl extends ServiceImpl<MailSendTaskItemMap
         return mailSendTaskItemMapper.selectPage(pageReqVO);
         return mailSendTaskItemMapper.selectPage(pageReqVO);
     }
     }
 
 
+    @Override
+    public Boolean insertIsMailSendTaskItem(MailSendTaskItemDO taskItem, HashMap<String, String> map) {
+        // 1.断言告警
+        Assert.notNull(taskItem.getSendToUserId(), "收取用户不能为空");
+        Assert.notNull(taskItem.getEmailTemplateId(), "邮件模板不能为空");
+        Assert.notNull(taskItem.getScheduledSendTime(), "计划发送时间不能为空");
+        AdminUserDO user = adminUserService.getUser(taskItem.getSendToUserId());
+        Assert.isFalse(user == null, "接收人不存在!");
+        // 2.根据模板获取邮件内容
+        MailTemplateDO template = mailTemplateService.getById(taskItem.getEmailTemplateId());
+        map.keySet().forEach(key -> {
+            template.setTitle(template.getTitle().replace(key, map.get(key)));
+            template.setContent(template.getContent().replace(key, map.get(key)));
+        });
+        taskItem.setTitle(template.getTitle());
+        taskItem.setContent(template.getContent());
+        return save(taskItem);
+    }
+
 }
 }

+ 159 - 7
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/service/materialscheckplan/MaterialsCheckPlanServiceImpl.java

@@ -1,18 +1,39 @@
 package cn.iocoder.yudao.module.iscs.service.materialscheckplan;
 package cn.iocoder.yudao.module.iscs.service.materialscheckplan;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialscheckplan.vo.MaterialsCheckPlanPageReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialscheckplan.vo.MaterialsCheckPlanPageReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialscheckplan.vo.MaterialsCheckPlanSaveReqVO;
 import cn.iocoder.yudao.module.iscs.controller.admin.materialscheckplan.vo.MaterialsCheckPlanSaveReqVO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.attribute.AttributeDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.mailnotifyconfig.MailNotifyConfigDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.mailsendtaskitem.MailSendTaskItemDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscabinet.MaterialsCabinetDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscheckplan.MaterialsCheckPlanDO;
 import cn.iocoder.yudao.module.iscs.dal.dataobject.materialscheckplan.MaterialsCheckPlanDO;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.materialsplancabinet.MaterialsPlanCabinetDO;
 import cn.iocoder.yudao.module.iscs.dal.mysql.materialscheckplan.MaterialsCheckPlanMapper;
 import cn.iocoder.yudao.module.iscs.dal.mysql.materialscheckplan.MaterialsCheckPlanMapper;
+import cn.iocoder.yudao.module.iscs.service.attribute.AttributeService;
+import cn.iocoder.yudao.module.iscs.service.mailnotifyconfig.MailNotifyConfigService;
+import cn.iocoder.yudao.module.iscs.service.mailsendtaskitem.MailSendTaskItemService;
+import cn.iocoder.yudao.module.iscs.service.materialscabinet.MaterialsCabinetService;
+import cn.iocoder.yudao.module.iscs.service.materialsplancabinet.MaterialsPlanCabinetService;
+import cn.iocoder.yudao.module.iscs.utils.DateUtils;
+import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
+import cn.iocoder.yudao.module.system.service.mail.MailTemplateService;
+import cn.iocoder.yudao.module.system.service.user.AdminUserService;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import jakarta.annotation.Resource;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 /**
 /**
  * 物资检查计划 Service 实现类
  * 物资检查计划 Service 实现类
@@ -25,24 +46,139 @@ public class MaterialsCheckPlanServiceImpl extends ServiceImpl<MaterialsCheckPla
 
 
     @Resource
     @Resource
     private MaterialsCheckPlanMapper materialsCheckPlanMapper;
     private MaterialsCheckPlanMapper materialsCheckPlanMapper;
+    @Resource
+    private MaterialsPlanCabinetService materialsPlanCabinetService;
+    @Resource
+    private AttributeService attributeService;
+    @Resource
+    private MailTemplateService mailTemplateService;
+    @Resource
+    private MailNotifyConfigService mailNotifyConfigService;
+    @Resource
+    private MailSendTaskItemService mailSendTaskItemService;
+    @Resource
+    private MaterialsCabinetService materialsCabinetService;
+    @Resource
+    private AdminUserService adminUserService;
+
 
 
     @Override
     @Override
     public Long createMaterialsCheckPlan(MaterialsCheckPlanSaveReqVO createReqVO) {
     public Long createMaterialsCheckPlan(MaterialsCheckPlanSaveReqVO createReqVO) {
+        // 1.断言检测
+        Assert.notNull(createReqVO.getPlanDate(), "检查日期不可为空!");
+        Assert.notNull(createReqVO.getCheckUserId(), "检查员不可为空!");
+        Assert.isFalse(createReqVO.getCabinetIds().isEmpty(), "请选择需要检查的柜子!");
+        // 2.开始新增计划
         // 插入
         // 插入
         MaterialsCheckPlanDO materialsCheckPlan = BeanUtils.toBean(createReqVO, MaterialsCheckPlanDO.class);
         MaterialsCheckPlanDO materialsCheckPlan = BeanUtils.toBean(createReqVO, MaterialsCheckPlanDO.class);
-        materialsCheckPlanMapper.insert(materialsCheckPlan);
-
+        // 2.1开始生成文件名称尾缀
+        String jobName = materialsCheckPlan.getPlanName();
+        int counter = 1;
+        String rname = materialsCheckPlan.getPlanName();
+        while (!list(Wrappers.<MaterialsCheckPlanDO>lambdaQuery().eq(MaterialsCheckPlanDO::getPlanName, jobName)).isEmpty()) {
+            jobName = rname + "(" + counter + ")";
+            counter++;
+        }
+        materialsCheckPlan.setPlanName(jobName);
+        save(materialsCheckPlan);
+        // 3.开始新增计划和物资柜的关联关系
+        List<MaterialsPlanCabinetDO> isMaterialsPlanCabinets = new ArrayList<>();
+        for (Long cabinetId : createReqVO.getCabinetIds()) {
+            MaterialsPlanCabinetDO isMaterialsPlanCabinet = new MaterialsPlanCabinetDO();
+            isMaterialsPlanCabinet.setId(materialsCheckPlan.getId());
+            isMaterialsPlanCabinet.setCabinetId(cabinetId);
+            isMaterialsPlanCabinets.add(isMaterialsPlanCabinet);
+        }
+        materialsPlanCabinetService.saveBatch(isMaterialsPlanCabinets);
+        // 4.开始计算倒计时,给检查员发送邮件
+        addMail(createReqVO, materialsCheckPlan);
         // 返回
         // 返回
         return materialsCheckPlan.getId();
         return materialsCheckPlan.getId();
     }
     }
 
 
+    private Boolean addMail(MaterialsCheckPlanSaveReqVO dto, MaterialsCheckPlanDO materialsCheckPlan) {
+        // 4.1获取模板
+        AttributeDO isSystemAttributeByKey = attributeService.getAttributeByKey("sys.template.check_plan");
+        Assert.isFalse(isSystemAttributeByKey == null, "请在基础数据中配置物资检查计划模板!");
+        MailTemplateDO template = mailTemplateService.getOne(Wrappers.<MailTemplateDO>lambdaQuery()
+                .eq(MailTemplateDO::getCode, isSystemAttributeByKey.getSysAttrValue()));
+        // 4.2获取配置的时间
+        MailNotifyConfigDO notifyConfig = mailNotifyConfigService.getOne(Wrappers.<MailNotifyConfigDO>lambdaQuery()
+                .eq(MailNotifyConfigDO::getTemplateCode, isSystemAttributeByKey.getSysAttrValue()));
+        // 4.2.1无论是不是新增都先查一下有没有邮件,有邮件看下发了没有,没有发也没取消就删掉重新增
+        if (template != null) {
+            List<MailSendTaskItemDO> notSendMails = mailSendTaskItemService.list(Wrappers.<MailSendTaskItemDO>lambdaQuery()
+                    .eq(MailSendTaskItemDO::getEmailTemplateId, template.getId())
+                    .eq(MailSendTaskItemDO::getBelongId, materialsCheckPlan.getId())
+                    .eq(MailSendTaskItemDO::getSendStatus, "0")
+                    .eq(MailSendTaskItemDO::getIsCancelled, "0"));
+            if (!notSendMails.isEmpty()) {
+                List<Long> notSendMailIds = notSendMails.stream().map(MailSendTaskItemDO::getId).collect(Collectors.toList());
+                mailSendTaskItemService.removeBatchByIds(notSendMailIds);
+            }
+        }
+        // 4.3判断柜子是否激活,激活才有效
+        if (template != null && notifyConfig != null && "1".equals(notifyConfig.getStatus())) {
+            // 5.1新增预发送邮件到数据库
+            // 理应的发送时间计算
+            Date newDateTime = DateUtils.getNewDateTime(dto.getPlanDate(), notifyConfig.getReminderTime());
+            // 5.1.1柜子的详情
+            List<MaterialsCabinetDO> cabinets = materialsCabinetService.list(Wrappers.<MaterialsCabinetDO>lambdaQuery()
+                    .in(MaterialsCabinetDO::getId, dto.getCabinetIds()));
+            String cabinetNameStr = cabinets.stream().map(MaterialsCabinetDO::getCabinetName).collect(Collectors.joining(","));
+            // 5.1.2检察员信息
+            AdminUserDO user = adminUserService.getUser(dto.getCheckUserId());
+            // 5.3新增邮件任务
+            // 5.4整理可配置的字段
+            HashMap<String, String> map = new HashMap<>();
+            map.put("[计划名称]", dto.getPlanName());
+            map.put("[计划日期]", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, dto.getPlanDate()));
+            map.put("[物资柜]", cabinetNameStr);
+            map.put("[检察员]", user.getNickname());
+            map.put("[发件人]", attributeService.getAttributeByKey("info.mail.name").getSysAttrValue());
+            map.put("[公司名称]", attributeService.getAttributeByKey("info.mail.company").getSysAttrValue());
+            map.put("[邮件发送时间]", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, newDateTime));
+            // 邮件实体
+            MailSendTaskItemDO taskItem = new MailSendTaskItemDO();
+            taskItem.setSendToUserId(dto.getCheckUserId());
+            taskItem.setEmailTemplateId(template.getId());
+            taskItem.setScheduledSendTime(DateUtils.dateToLocalDateTime(newDateTime));
+            taskItem.setBelongId(materialsCheckPlan.getId());
+            taskItem.setSendStatus(0);
+            taskItem.setIsCancelled(0);
+            mailSendTaskItemService.insertIsMailSendTaskItem(taskItem, map);
+        }
+        return true;
+    }
+
     @Override
     @Override
     public void updateMaterialsCheckPlan(MaterialsCheckPlanSaveReqVO updateReqVO) {
     public void updateMaterialsCheckPlan(MaterialsCheckPlanSaveReqVO updateReqVO) {
-        // 校验存在
-        validateMaterialsCheckPlanExists(updateReqVO.getId());
-        // 更新
-        MaterialsCheckPlanDO updateObj = BeanUtils.toBean(updateReqVO, MaterialsCheckPlanDO.class);
-        materialsCheckPlanMapper.updateById(updateObj);
+        // 1.断言检测
+        Assert.notNull(updateReqVO.getId(), "主键ID不可为空!");
+        Assert.notNull(updateReqVO.getPlanDate(), "检查日期不可为空!");
+        Assert.notNull(updateReqVO.getCheckUserId(), "检查员不可为空!");
+        Assert.isFalse(updateReqVO.getCabinetIds().isEmpty(), "请选择需要检查的柜子!");
+        List<MaterialsCheckPlanDO> list = list(Wrappers.<MaterialsCheckPlanDO>lambdaQuery()
+                .eq(MaterialsCheckPlanDO::getPlanName, updateReqVO.getPlanName())
+                .ne(MaterialsCheckPlanDO::getId, updateReqVO.getId()));
+        Assert.isTrue(list.isEmpty(), "该名称已被使用!");
+        // 2.开始新增计划
+        MaterialsCheckPlanDO materialsCheckPlan = BeanUtils.toBean(updateReqVO, MaterialsCheckPlanDO.class);
+        updateById(materialsCheckPlan);
+        // 3.开始新增计划和物资柜的关联关系
+        // 3.1先删除,再新增
+        materialsPlanCabinetService.remove(Wrappers.<MaterialsPlanCabinetDO>lambdaQuery()
+                .eq(MaterialsPlanCabinetDO::getId, updateReqVO.getId()));
+        List<MaterialsPlanCabinetDO> isMaterialsPlanCabinets = new ArrayList<>();
+        for (Long cabinetId : updateReqVO.getCabinetIds()) {
+            MaterialsPlanCabinetDO materialsPlanCabinetDO = new MaterialsPlanCabinetDO();
+            materialsPlanCabinetDO.setId(materialsCheckPlan.getId());
+            materialsPlanCabinetDO.setCabinetId(cabinetId);
+            isMaterialsPlanCabinets.add(materialsPlanCabinetDO);
+        }
+        materialsPlanCabinetService.saveBatch(isMaterialsPlanCabinets);
+        // 4.邮件也是先删除再新增
+        addMail(updateReqVO, materialsCheckPlan);
     }
     }
 
 
     @Override
     @Override
@@ -55,6 +191,22 @@ public class MaterialsCheckPlanServiceImpl extends ServiceImpl<MaterialsCheckPla
 
 
     @Override
     @Override
         public void deleteMaterialsCheckPlanListByIds(List<Long> ids) {
         public void deleteMaterialsCheckPlanListByIds(List<Long> ids) {
+        Assert.isFalse(ids.isEmpty(), "请选择需要删除的数据!");
+        removeBatchByIds(ids);
+        // 开始删除关联的物资柜数据
+        materialsPlanCabinetService.remove(Wrappers.<MaterialsPlanCabinetDO>lambdaQuery()
+                .in(MaterialsPlanCabinetDO::getId, ids));
+        // 取消关联的发送邮件
+        MailTemplateDO template = mailTemplateService.getOne(Wrappers.<MailTemplateDO>lambdaQuery()
+                .eq(MailTemplateDO::getCode, attributeService.getAttributeByKey("sys.template.check_plan").getSysAttrValue()));
+        if (template != null) {
+            mailSendTaskItemService.update(Wrappers.<MailSendTaskItemDO>lambdaUpdate()
+                    .eq(MailSendTaskItemDO::getEmailTemplateId, template.getId())
+                    .in(MailSendTaskItemDO::getBelongId, ids)
+                    .eq(MailSendTaskItemDO::getSendStatus, "0")
+                    .set(MailSendTaskItemDO::getIsCancelled, "1")
+                    .set(MailSendTaskItemDO::getCancelTime, new Date()));
+        }
         // 校验存在
         // 校验存在
         validateMaterialsCheckPlanExists(ids);
         validateMaterialsCheckPlanExists(ids);
         // 删除
         // 删除

+ 237 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/utils/DateUtils.java

@@ -0,0 +1,237 @@
+package cn.iocoder.yudao.module.iscs.utils;
+
+import org.apache.commons.lang3.time.DateFormatUtils;
+
+import java.lang.management.ManagementFactory;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+
+/**
+ * 时间工具类
+ *
+ * @author ruoyi
+ */
+public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
+    public static String YYYY = "yyyy";
+
+    public static String YYYY_MM = "yyyy-MM";
+
+    public static String YYYY_MM_DD = "yyyy-MM-dd";
+
+    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
+
+    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+
+    private static String[] parsePatterns = {
+            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
+            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
+            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
+
+    /**
+     * 获取当前Date型日期
+     *
+     * @return Date() 当前日期
+     */
+    public static Date getNowDate() {
+        return new Date();
+    }
+
+    /**
+     * 获取当前日期, 默认格式为yyyy-MM-dd
+     *
+     * @return String
+     */
+    public static String getDate() {
+        return dateTimeNow(YYYY_MM_DD);
+    }
+
+    public static final String getTime() {
+        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
+    }
+
+    public static final String dateTimeNow() {
+        return dateTimeNow(YYYYMMDDHHMMSS);
+    }
+
+    public static final String dateTimeNow(final String format) {
+        return parseDateToStr(format, new Date());
+    }
+
+    public static final String dateTime(final Date date) {
+        return parseDateToStr(YYYY_MM_DD, date);
+    }
+
+    public static final String parseDateToStr(final String format, final Date date) {
+        return new SimpleDateFormat(format).format(date);
+    }
+
+    public static final Date dateTime(final String format, final String ts) {
+        try {
+            return new SimpleDateFormat(format).parse(ts);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 日期路径 即年/月/日 如2018/08/08
+     */
+    public static final String datePath() {
+        Date now = new Date();
+        return DateFormatUtils.format(now, "yyyy/MM/dd");
+    }
+
+    /**
+     * 日期路径 即年/月/日 如20180808
+     */
+    public static final String dateTime() {
+        Date now = new Date();
+        return DateFormatUtils.format(now, "yyyyMMdd");
+    }
+
+    /**
+     * 日期型字符串转化为日期 格式
+     */
+    public static Date parseDate(Object str) {
+        if (str == null) {
+            return null;
+        }
+        try {
+            return parseDate(str.toString(), parsePatterns);
+        } catch (ParseException e) {
+            return null;
+        }
+    }
+
+    /**
+     * 获取服务器启动时间
+     */
+    public static Date getServerStartDate() {
+        long time = ManagementFactory.getRuntimeMXBean().getStartTime();
+        return new Date(time);
+    }
+
+    /**
+     * 计算相差天数
+     */
+    public static int differentDaysByMillisecond(Date date1, Date date2) {
+        return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
+    }
+
+    /**
+     * 计算两个时间差
+     */
+    public static String getDatePoor(Date endDate, Date nowDate) {
+        long nd = 1000 * 24 * 60 * 60;
+        long nh = 1000 * 60 * 60;
+        long nm = 1000 * 60;
+        // long ns = 1000;
+        // 获得两个时间的毫秒时间差异
+        long diff = endDate.getTime() - nowDate.getTime();
+        // 计算差多少天
+        long day = diff / nd;
+        // 计算差多少小时
+        long hour = diff % nd / nh;
+        // 计算差多少分钟
+        long min = diff % nd % nh / nm;
+        // 计算差多少秒//输出结果
+        // long sec = diff % nd % nh % nm / ns;
+        return day + "天" + hour + "小时" + min + "分钟";
+    }
+
+
+    /**
+     * 计算设定时间和当前时间相差秒数
+     *
+     * @param endDate
+     * @return
+     */
+    public static Long getDatePoorSec(Date endDate) {
+        // 定义日期时间格式
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        // 设定时间 planTime
+        String planTimeStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", endDate);
+        LocalDateTime planTime = LocalDateTime.parse(planTimeStr, formatter);
+        // 获取当前时间
+        LocalDateTime currentTime = LocalDateTime.now();
+        // 计算两个时间点之间的持续时间
+        Duration duration = Duration.between(currentTime, planTime);
+        // 获取秒数差
+        long secondsDifference = duration.getSeconds();
+        return secondsDifference;
+    }
+
+    /**
+     * 根据时间和需要的秒数,生成新的时间
+     *
+     * @param date
+     * @param additionalSeconds
+     * @return
+     */
+    public static Date getNewDateTime(Date date, long additionalSeconds) {
+
+        // 将Date对象转换为毫秒数
+        long milliseconds = date.getTime();
+        // 将毫秒数转换为秒数
+        long seconds = milliseconds / 1000;
+        // 加上一定的秒数,例如加60秒
+        long newSeconds = seconds + additionalSeconds;
+        // 将新的秒数转换回毫秒数
+        long newMilliseconds = newSeconds * 1000;
+        // 创建一个新的Date对象
+        return new Date(newMilliseconds);
+    }
+
+    /**
+     * 增加 LocalDateTime ==> Date
+     */
+    public static Date toDate(LocalDateTime temporalAccessor) {
+        ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
+        return Date.from(zdt.toInstant());
+    }
+
+    /**
+     * 增加 LocalDate ==> Date
+     */
+    public static Date toDate(LocalDate temporalAccessor) {
+        LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
+        ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
+        return Date.from(zdt.toInstant());
+    }
+
+    /**
+     * 输入1-7获取包括当日的下一个周几的日期
+     */
+    public static String getWeekDayDate(int weekDay) {
+        int dayOfWeekInput = weekDay;
+        // 将输入转换为DayOfWeek枚举
+        DayOfWeek inputDayOfWeek = DayOfWeek.of(dayOfWeekInput);
+        // 获取当前日期
+        LocalDate today = LocalDate.now();
+        // 计算下一个指定周几的日期
+        LocalDate nextSpecifiedDay = today.with(inputDayOfWeek);
+        if (nextSpecifiedDay.isBefore(today)) {
+            nextSpecifiedDay = nextSpecifiedDay.plusWeeks(1);
+        }
+        // 格式化日期为YYYY-MM-dd格式
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String formattedDate = nextSpecifiedDay.format(formatter);
+        // 输出结果
+        System.out.println("下一个" + inputDayOfWeek + "的日期是: " + formattedDate);
+        return formattedDate;
+    }
+
+    /**
+     * Date 转化成 LocalDateTime
+     */
+    public static final LocalDateTime dateToLocalDateTime(Date date) {
+        LocalDateTime localDateTimeDefault = date.toInstant()
+                .atZone(ZoneId.systemDefault()) // 或 ZoneId.of("Asia/Shanghai") 指定时区
+                .toLocalDateTime();
+        return localDateTimeDefault;
+    }
+
+}

+ 2 - 1
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateService.java

@@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemp
 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateSaveReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateSaveReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
 
 
+import com.baomidou.mybatisplus.extension.service.IService;
 import jakarta.validation.Valid;
 import jakarta.validation.Valid;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
@@ -15,7 +16,7 @@ import java.util.Map;
  * @author wangjingyi
  * @author wangjingyi
  * @since 2022-03-21
  * @since 2022-03-21
  */
  */
-public interface MailTemplateService {
+public interface MailTemplateService extends IService<MailTemplateDO> {
 
 
     /**
     /**
      * 邮件模版创建
      * 邮件模版创建

+ 4 - 3
yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java

@@ -10,15 +10,16 @@ import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemp
 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
 import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper;
 import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper;
 import cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants;
 import cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.annotations.VisibleForTesting;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 
 
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.regex.Pattern;
 import java.util.regex.Pattern;
@@ -36,7 +37,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_TEMPL
 @Service
 @Service
 @Validated
 @Validated
 @Slf4j
 @Slf4j
-public class MailTemplateServiceImpl implements MailTemplateService {
+public class MailTemplateServiceImpl extends ServiceImpl<MailTemplateMapper, MailTemplateDO> implements MailTemplateService {
 
 
     /**
     /**
      * 正则表达式,匹配 {} 中的变量
      * 正则表达式,匹配 {} 中的变量