From b68518c7a9e7dbb0c384d4020b48e3af7db74963 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期一, 22 十二月 2025 17:23:36 +0800
Subject: [PATCH] yys 保养计划定时生成,销售台账返回生产状态
---
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java | 10
src/main/java/com/ruoyi/device/mapper/MaintenanceTaskMapper.java | 12
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java | 4
src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java | 61 +++
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java | 10
src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java | 109 ++++++
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java | 278 +++++++++++++++++
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java | 119 +++++++
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java | 60 +++
src/main/java/com/ruoyi/device/service/MaintenanceTaskService.java | 25 +
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java | 248 +++++++++++++++
src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java | 4
src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java | 16 +
13 files changed, 940 insertions(+), 16 deletions(-)
diff --git a/src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java b/src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java
new file mode 100644
index 0000000..d9feaf1
--- /dev/null
+++ b/src/main/java/com/ruoyi/device/controller/MaintenanceTaskController.java
@@ -0,0 +1,61 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import com.ruoyi.device.pojo.MaintenanceTask;
+import com.ruoyi.device.service.MaintenanceTaskService;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.controller.BaseController;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author :yys
+ * @date : 2025/12/22 14:58
+ */
+@Api(tags = "璁惧淇濆吇瀹氭椂浠诲姟绠$悊")
+@RestController
+@RequestMapping("/deviceMaintenanceTask")
+public class MaintenanceTaskController extends BaseController {
+
+
+ @Autowired
+ private MaintenanceTaskService maintenanceTaskService;
+
+
+ @GetMapping("/listPage")
+ @ApiOperation(value = "璁惧淇濆吇瀹氭椂浠诲姟鍒楄〃")
+ public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) {
+ return maintenanceTaskService.listPage(page,maintenanceTask);
+ }
+
+
+ @PostMapping("/add")
+ @ApiOperation(value = "娣诲姞璁惧淇濆吇瀹氭椂浠诲姟")
+ @Log(title = "璁惧淇濆吇瀹氭椂浠诲姟", businessType = BusinessType.INSERT)
+ public AjaxResult add(@RequestBody MaintenanceTask maintenanceTask) {
+ return maintenanceTaskService.add(maintenanceTask);
+ }
+
+ @PostMapping("/update")
+ @ApiOperation(value = "淇敼璁惧淇濆吇瀹氭椂浠诲姟")
+ @Log(title = "璁惧淇濆吇瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
+ public AjaxResult update(@RequestBody MaintenanceTask maintenanceTask) {
+ return maintenanceTaskService.updateByMaintenanceTaskId(maintenanceTask);
+ }
+
+ @DeleteMapping("/delete")
+ @ApiOperation(value = "鍒犻櫎璁惧淇濆吇瀹氭椂浠诲姟")
+ @Log(title = "璁惧淇濆吇瀹氭椂浠诲姟", businessType = BusinessType.DELETE)
+ public AjaxResult delete(@RequestBody List<Long> ids) {
+ return maintenanceTaskService.delete(ids);
+ }
+
+
+}
diff --git a/src/main/java/com/ruoyi/device/mapper/MaintenanceTaskMapper.java b/src/main/java/com/ruoyi/device/mapper/MaintenanceTaskMapper.java
new file mode 100644
index 0000000..0958d30
--- /dev/null
+++ b/src/main/java/com/ruoyi/device/mapper/MaintenanceTaskMapper.java
@@ -0,0 +1,12 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.MaintenanceTask;
+import com.ruoyi.inspectiontask.pojo.TimingTask;
+
+/**
+ * @author :yys
+ * @date : 2025/12/22 14:56
+ */
+public interface MaintenanceTaskMapper extends BaseMapper<MaintenanceTask> {
+}
diff --git a/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java b/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
index eb655a8..e38e030 100644
--- a/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
+++ b/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -1,6 +1,7 @@
package com.ruoyi.device.pojo;
import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.*;
@@ -22,6 +23,21 @@
@ApiModelProperty("璁惧鍙拌处id")
private Long deviceLedgerId;
+ @ApiModelProperty("淇濆吇浠诲姟id")
+ private Long maintenanceTaskId;
+
+ @ApiModelProperty(value = "棰戞")
+ private String frequencyType;
+
+ @ApiModelProperty(value = "棰戞璇︽儏")
+ private String frequencyDetail;
+
+ @ApiModelProperty(value = "涓嬫鎵ц鏃堕棿")
+ private LocalDateTime nextExecutionTime;
+
+ @ApiModelProperty(value = "鏈�鍚庢墽琛屾椂闂�")
+ private LocalDateTime lastExecutionTime;
+
private String deviceName;
diff --git a/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java b/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
new file mode 100644
index 0000000..a6f4432
--- /dev/null
+++ b/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
@@ -0,0 +1,109 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * @author :yys
+ * @date : 2025/9/19 10:27
+ */
+@Data
+@ApiModel
+@TableName("maintenance_task")
+public class MaintenanceTask {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+ private String deviceModel;
+
+ /**
+ * 涓婚敭ID
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ @ApiModelProperty(value = "璁惧鍚嶇О")
+ @Excel(name = "淇濆吇浠诲姟鍚嶇О")
+ private String taskName;
+
+ @ApiModelProperty(value = "璁惧id")
+ private Long taskId;
+
+ @ApiModelProperty(value = "棰戞")
+ @Excel(name = "棰戞")
+ private String frequencyType;
+
+ @ApiModelProperty(value = "棰戞璇︽儏")
+ @Excel(name = "寮�濮嬫棩鏈熶笌鏃堕棿")
+ private String frequencyDetail;
+
+ @ApiModelProperty(value = "涓嬫鎵ц鏃堕棿")
+ private LocalDateTime nextExecutionTime;
+
+ @ApiModelProperty(value = "鏈�鍚庢墽琛屾椂闂�")
+ private LocalDateTime lastExecutionTime;
+
+ @ApiModelProperty(value = "鏄惁婵�娲�")
+ private boolean isActive;
+
+ @ApiModelProperty(value = "澶囨敞")
+ @Excel(name = "澶囨敞")
+ private String remarks;
+
+ @ApiModelProperty(value = "褰曞叆浜篿d")
+ private Long registrantId;
+
+ @ApiModelProperty(value = "褰曞叆浜�")
+ @Excel(name = "褰曞叆浜�")
+ private String registrant;
+
+ @ApiModelProperty(value = "褰曞叆鏃ユ湡")
+ @Excel(name = "褰曞叆鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ @DateTimeFormat(pattern = "yyyy-MM-dd")
+ private LocalDate registrationDate;
+
+ @ApiModelProperty(value = "鐘舵��")
+ private String status;
+
+ @ApiModelProperty(value = "杞垹闄ゆ爣蹇楋紝0=鏈垹闄わ紝1=宸插垹闄�")
+ private Integer deleted;
+
+ @TableField(exist = false)
+ private String dateStr;
+
+ @ApiModelProperty(value = "鍒涘缓璇ヨ褰曠殑鐢ㄦ埛")
+ @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty(value = "璁板綍鍒涘缓鏃堕棿")
+ @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
+// @JsonFormat(pattern = "yyyy-MM-dd")
+// @DateTimeFormat(pattern = "yyyy-MM-dd")
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "鏈�鍚庝慨鏀硅璁板綍鐨勭敤鎴�")
+ @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ApiModelProperty(value = "璁板綍鏈�鍚庢洿鏂版椂闂�")
+ @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty(value = "绉熸埛ID")
+ @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
+ private Long tenantId;
+
+}
diff --git a/src/main/java/com/ruoyi/device/service/MaintenanceTaskService.java b/src/main/java/com/ruoyi/device/service/MaintenanceTaskService.java
new file mode 100644
index 0000000..23ace3b
--- /dev/null
+++ b/src/main/java/com/ruoyi/device/service/MaintenanceTaskService.java
@@ -0,0 +1,25 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import com.ruoyi.device.pojo.MaintenanceTask;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author :yys
+ * @date : 2025/12/22 14:56
+ */
+public interface MaintenanceTaskService extends IService<MaintenanceTask> {
+ AjaxResult listPage(Page page, MaintenanceTask maintenanceTask);
+
+ AjaxResult add(MaintenanceTask maintenanceTask);
+
+ AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask);
+
+ AjaxResult delete(List<Long> ids);
+}
diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java
new file mode 100644
index 0000000..f35a1d1
--- /dev/null
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskJob.java
@@ -0,0 +1,248 @@
+package com.ruoyi.device.service.impl;
+
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import com.ruoyi.device.pojo.MaintenanceTask;
+import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper;
+import com.ruoyi.inspectiontask.mapper.TimingTaskMapper;
+import com.ruoyi.inspectiontask.pojo.InspectionTask;
+import com.ruoyi.inspectiontask.pojo.TimingTask;
+import com.ruoyi.inspectiontask.service.TimingTaskService;
+import org.quartz.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import java.io.Serializable;
+import java.time.DayOfWeek;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.YearMonth;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Component
+@DisallowConcurrentExecution // 绂佹骞跺彂鎵ц鍚屼竴涓狫ob
+public class MaintenanceTaskJob implements Job, Serializable {
+ private static final long serialVersionUID = 1L; // 蹇呴』瀹氫箟搴忓垪鍖朓D
+
+ @Autowired
+ private DeviceMaintenanceServiceImpl deviceMaintenanceService;
+
+ @Autowired
+ private JdbcTemplate jdbcTemplate;
+
+ @Override
+ public void execute(JobExecutionContext context) throws JobExecutionException {
+ JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
+ // 淇绫诲瀷杞崲閿欒锛屾纭幏鍙杢askId
+ Long taskId = jobDataMap.getLong("maintenanceTaskId");
+
+ try {
+ // 3. 灏濊瘯鏌ヨ浣犵殑涓氬姟鏁版嵁
+ // 閫氳繃JDBC妯℃澘鏌ヨ瀹氭椂浠诲姟淇℃伅锛屼娇鐢ㄥ弬鏁板寲鏌ヨ闃叉SQL娉ㄥ叆
+ String yourSql = "SELECT * FROM maintenance_task where id = ?";
+ List<MaintenanceTask> tasks = jdbcTemplate.query(
+ yourSql,
+ new BeanPropertyRowMapper<>(MaintenanceTask.class),
+ taskId
+ );
+ MaintenanceTask timingTask = tasks.isEmpty() ? null : tasks.get(0);
+ if (timingTask == null) {
+ throw new JobExecutionException("MaintenanceTaskJob鎵句笉鍒板畾鏃朵换鍔�: " + taskId);
+ }
+
+ // 2. 鍒涘缓骞朵繚瀛樺贰妫�浠诲姟璁板綍 - 杩欏氨鏄偍鎻愪緵鐨勪唬鐮佸簲璇ユ斁鐨勪綅缃�
+ DeviceMaintenance deviceMaintenance = createInspectionTask(timingTask);
+ deviceMaintenanceService.save(deviceMaintenance);
+
+ // 3. 鏇存柊瀹氭椂浠诲姟鐨勬墽琛屾椂闂�
+ if (!tasks.isEmpty()) {
+ MaintenanceTask task = tasks.get(0);
+
+ // 鏇存柊鏈�鍚庢墽琛屾椂闂翠负褰撳墠鏃堕棿
+ LocalDateTime lastExecutionTime = LocalDateTime.now();
+
+ // 璁$畻涓嬫鎵ц鏃堕棿
+ LocalDateTime nextExecutionTime = calculateNextExecutionTime(
+ task.getFrequencyType(),
+ task.getFrequencyDetail(),
+ lastExecutionTime
+ );
+
+ // 鎵ц鏇存柊鎿嶄綔
+ String updateSql = "UPDATE maintenance_task " +
+ "SET last_execution_time = ?, next_execution_time = ? " +
+ "WHERE id = ?";
+
+ jdbcTemplate.update(
+ updateSql,
+ lastExecutionTime,
+ nextExecutionTime,
+ taskId
+ );
+ }
+ } catch (Exception e) {
+ throw new JobExecutionException(e);
+ }
+ }
+
+ // 杩欏氨鏄偍鎻愪緵鐨勪唬鐮佸皝瑁呮垚鐨勬柟娉�
+ private DeviceMaintenance createInspectionTask(MaintenanceTask timingTask) {
+ DeviceMaintenance inspectionTask = new DeviceMaintenance();
+
+ // 澶嶅埗鍩烘湰灞炴��
+ inspectionTask.setDeviceName(timingTask.getTaskName());
+ inspectionTask.setMaintenanceTaskId(timingTask.getId());
+ inspectionTask.setDeviceLedgerId(timingTask.getTaskId());
+ inspectionTask.setMaintenancePlanTime(LocalDateTime.now());
+ inspectionTask.setFrequencyType(timingTask.getFrequencyType());
+ inspectionTask.setFrequencyDetail(timingTask.getFrequencyDetail());
+ inspectionTask.setTenantId(timingTask.getTenantId());
+ inspectionTask.setStatus(0);
+ inspectionTask.setDeviceModel(timingTask.getDeviceModel());
+ inspectionTask.setCreateUser(Integer.parseInt(timingTask.getRegistrantId().toString()));
+ inspectionTask.setUpdateTime(LocalDateTime.now());
+ inspectionTask.setCreateTime(LocalDateTime.now());
+ inspectionTask.setUpdateUser(Integer.parseInt(timingTask.getRegistrantId().toString()));
+ return inspectionTask;
+ }
+
+
+ /**
+ * 璁$畻涓嬫鎵ц鏃堕棿
+ */
+ private LocalDateTime calculateNextExecutionTime(String frequencyType,
+ String frequencyDetail,
+ LocalDateTime currentTime) {
+ try {
+ switch (frequencyType) {
+ case "DAILY":
+ return calculateDailyNextTime(frequencyDetail, currentTime);
+ case "WEEKLY":
+ return calculateWeeklyNextTime(frequencyDetail, currentTime);
+ case "MONTHLY":
+ return calculateMonthlyNextTime(frequencyDetail, currentTime);
+ case "QUARTERLY":
+ return calculateQuarterlyNextTime(frequencyDetail, currentTime);
+ default:
+ throw new IllegalArgumentException("涓嶆敮鎸佺殑棰戠巼绫诲瀷: " + frequencyType);
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("璁$畻涓嬫鎵ц鏃堕棿澶辫触: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 璁$畻姣忔棩浠诲姟鐨勪笅娆℃墽琛屾椂闂�
+ */
+ private LocalDateTime calculateDailyNextTime(String timeStr, LocalDateTime current) {
+ LocalTime executionTime = LocalTime.parse(timeStr); // 瑙f瀽鏍煎紡 "HH:mm"
+ LocalDateTime nextTime = LocalDateTime.of(current.toLocalDate(), executionTime);
+
+ // 濡傛灉浠婂ぉ鐨勬椂闂村凡杩囷紝鍒欏畨鎺掓槑澶�
+ return current.isBefore(nextTime) ? nextTime : nextTime.plusDays(1);
+ }
+
+ /**
+ * 璁$畻姣忓懆浠诲姟鐨勪笅娆℃墽琛屾椂闂�
+ */
+ private LocalDateTime calculateWeeklyNextTime(String detail, LocalDateTime current) {
+ String[] parts = detail.split(",");
+ String dayOfWeekStr = parts[0]; // 濡� "MON" 鎴� "MON|WED|FRI"
+ LocalTime time = LocalTime.parse(parts[1]); // 鏃堕棿閮ㄥ垎
+
+ // 瑙f瀽鏄熸湡鍑�(鏀寔澶氫釜鏄熸湡)
+ Set<DayOfWeek> targetDays = parseDayOfWeeks(dayOfWeekStr);
+
+ // 浠庡綋鍓嶆椂闂村紑濮嬫壘涓嬩竴涓鍚堟潯浠剁殑鏄熸湡鍑�
+ LocalDateTime nextTime = current;
+ while (true) {
+ nextTime = nextTime.plusDays(1);
+ if (targetDays.contains(nextTime.getDayOfWeek())) {
+ return LocalDateTime.of(nextTime.toLocalDate(), time);
+ }
+
+ // 闃叉鏃犻檺寰幆(鐞嗚涓婁笉浼氬彂鐢�)
+ if (nextTime.isAfter(current.plusYears(1))) {
+ throw new RuntimeException("鏃犳硶鎵惧埌涓嬫鎵ц鏃堕棿");
+ }
+ }
+ }
+
+ /**
+ * 璁$畻姣忔湀浠诲姟鐨勪笅娆℃墽琛屾椂闂�
+ */
+ private LocalDateTime calculateMonthlyNextTime(String detail, LocalDateTime current) {
+ String[] parts = detail.split(",");
+ int dayOfMonth = Integer.parseInt(parts[0]);
+ LocalTime time = LocalTime.parse(parts[1]);
+
+ // 浠庝笅涓湀寮�濮嬭绠�
+ LocalDateTime nextTime = current.plusMonths(1)
+ .withDayOfMonth(Math.min(dayOfMonth, current.plusMonths(1).toLocalDate().lengthOfMonth()))
+ .with(time);
+
+ return nextTime;
+ }
+
+ /**
+ * 璁$畻姣忓搴︿换鍔$殑涓嬫鎵ц鏃堕棿
+ */
+ private LocalDateTime calculateQuarterlyNextTime(String detail, LocalDateTime current) {
+ String[] parts = detail.split(",");
+ int quarterMonth = Integer.parseInt(parts[0]); // 1=绗�1涓湀锛�2=绗�2涓湀锛�3=绗�3涓湀
+ int dayOfMonth = Integer.parseInt(parts[1]);
+ LocalTime time = LocalTime.parse(parts[2]);
+
+ // 璁$畻褰撳墠瀛e害
+ int currentQuarter = (current.getMonthValue() - 1) / 3 + 1;
+ int currentMonthInQuarter = (current.getMonthValue() - 1) % 3 + 1;
+
+ YearMonth targetYearMonth;
+ if (currentMonthInQuarter < quarterMonth) {
+ // 鏈搴﹀唴杩樻湁鎵ц鏈轰細
+ targetYearMonth = YearMonth.from(current)
+ .plusMonths(quarterMonth - currentMonthInQuarter);
+ } else {
+ // 闇�瑕佸埌涓嬩釜瀛e害
+ targetYearMonth = YearMonth.from(current)
+ .plusMonths(3 - currentMonthInQuarter + quarterMonth);
+ }
+
+ // 澶勭悊鏈堟湯鏃ユ湡
+ int adjustedDay = Math.min(dayOfMonth, targetYearMonth.lengthOfMonth());
+
+ return LocalDateTime.of(
+ targetYearMonth.getYear(),
+ targetYearMonth.getMonthValue(),
+ adjustedDay,
+ time.getHour(),
+ time.getMinute()
+ );
+ }
+
+ /**
+ * 瑙f瀽鏄熸湡鍑犲瓧绗︿覆
+ */
+ private Set<DayOfWeek> parseDayOfWeeks(String dayOfWeekStr) {
+ Set<DayOfWeek> days = new HashSet<>();
+ String[] dayStrs = dayOfWeekStr.split("\\|");
+
+ for (String dayStr : dayStrs) {
+ switch (dayStr) {
+ case "MON": days.add(DayOfWeek.MONDAY); break;
+ case "TUE": days.add(DayOfWeek.TUESDAY); break;
+ case "WED": days.add(DayOfWeek.WEDNESDAY); break;
+ case "THU": days.add(DayOfWeek.THURSDAY); break;
+ case "FRI": days.add(DayOfWeek.FRIDAY); break;
+ case "SAT": days.add(DayOfWeek.SATURDAY); break;
+ case "SUN": days.add(DayOfWeek.SUNDAY); break;
+ default: throw new IllegalArgumentException("鏃犳晥鐨勬槦鏈熷嚑: " + dayStr);
+ }
+ }
+
+ return days;
+ }
+}
diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
new file mode 100644
index 0000000..384862b
--- /dev/null
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -0,0 +1,278 @@
+package com.ruoyi.device.service.impl;
+
+import com.ruoyi.device.pojo.MaintenanceTask;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeParseException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.stream.Collectors;
+
+/**
+ * @author :yys
+ * @date : 2025/12/22 15:16
+ */
+@Service
+@Slf4j
+public class MaintenanceTaskScheduler {
+
+ @Autowired
+ private Scheduler scheduler;
+
+ /**
+ * 娣诲姞鏂颁换鍔″埌璋冨害鍣�
+ */
+ public void scheduleMaintenanceTask(MaintenanceTask task){
+ try {
+ JobDetail jobDetail = buildJobDetail(task);
+ Trigger trigger = buildJobTrigger(task, jobDetail);
+ scheduler.scheduleJob(jobDetail, trigger);
+ }catch (SchedulerException e){
+ log.error("SchedulerException scheduleMaintenanceTask ERROR",e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * 鏇存柊宸叉湁浠诲姟
+ */
+ public void rescheduleMaintenanceTask(MaintenanceTask task){
+ try{
+ TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId());
+
+ // 鑾峰彇鐜版湁瑙﹀彂鍣ㄥ苟杞崲涓� CronTrigger
+ Trigger oldTrigger = scheduler.getTrigger(triggerKey);
+ if (!(oldTrigger instanceof CronTrigger)) {
+ throw new SchedulerException("Existing trigger is not a CronTrigger");
+ }
+
+ // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
+ CronTrigger newTrigger = TriggerBuilder.newTrigger()
+ .withIdentity(triggerKey) // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
+ .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
+ .forJob(oldTrigger.getJobKey()) // 鍏宠仈瀵瑰簲鐨凧ob
+ .withSchedule(CronScheduleBuilder
+ .cronSchedule(convertToCronExpression(task)) // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
+ )
+ // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
+ .startAt(task.getNextExecutionTime() != null
+ ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
+ : new Date())
+ .build();
+ scheduler.rescheduleJob(triggerKey, newTrigger);
+ }catch (SchedulerException e){
+ log.error("SchedulerException rescheduleMaintenanceTask ERROR",e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * 鏆傚仠浠诲姟
+ */
+ public void pauseMaintenanceTask(Long taskId) throws SchedulerException {
+ JobKey jobKey = new JobKey("MaintenanceTask_" + taskId);
+ scheduler.pauseJob(jobKey);
+ }
+
+ /**
+ * 鎭㈠浠诲姟
+ */
+ public void resumeMaintenanceTask(Long taskId) throws SchedulerException {
+ JobKey jobKey = new JobKey("MaintenanceTask_" + taskId);
+ scheduler.resumeJob(jobKey);
+ }
+
+ /**
+ * 鍒犻櫎浠诲姟
+ */
+ public void unscheduleMaintenanceTask(Long taskId){
+ try {
+ JobKey jobKey = new JobKey("MaintenanceTask_" + taskId);
+ scheduler.deleteJob(jobKey);
+ }catch (SchedulerException e){
+ log.error("SchedulerException unscheduleMaintenanceTask ERROR",e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ private JobDetail buildJobDetail(MaintenanceTask task) {
+ // 1. 鏋勫缓鍞竴JobKey锛堝熀浜庝换鍔D锛岀‘淇濋噸鍚悗鑳借瘑鍒級
+ JobKey jobKey = new JobKey("MaintenanceTask_" + task.getId());
+
+ // 2. 灏佽浠诲姟鏁版嵁锛堜粎浣跨敤鍩烘湰绫诲瀷锛岀‘淇濆彲搴忓垪鍖栵級
+ JobDataMap jobDataMap = new JobDataMap();
+ jobDataMap.put("maintenanceTaskId", task.getId()); // 浠诲姟ID锛圠ong锛屽彲搴忓垪鍖栵級
+ jobDataMap.put("taskName", task.getTaskName()); // 浠诲姟鍚嶇О锛圫tring锛屽彲搴忓垪鍖栵級
+ jobDataMap.put("taskType", task.getFrequencyType()); // 浠诲姟绫诲瀷锛圫tring锛�
+ // 鎸夐渶娣诲姞鍏朵粬蹇呰鐨勫熀鏈被鍨嬪弬鏁�
+
+ // 3. 鏋勫缓JobDetail锛岃缃寔涔呭寲鐩稿叧灞炴��
+ return JobBuilder.newJob(MaintenanceTaskJob.class)
+ .withIdentity(jobKey) // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
+ .withDescription(task.getTaskName()) // 浠诲姟鎻忚堪锛屽瓨鍏ユ暟鎹簱
+ .usingJobData(jobDataMap) // 缁戝畾浠诲姟鏁版嵁
+ .storeDurably(true) // 鍗充娇娌℃湁瑙﹀彂鍣ㄥ叧鑱斾篃鎸佷箙鍖栦繚瀛�
+ .requestRecovery(true) // 褰撹皟搴﹀櫒宕╂簝鍚庢仮澶嶆椂锛岄噸鏂版墽琛屾湭瀹屾垚鐨勪换鍔�
+ .build();
+ }
+
+ private Trigger buildJobTrigger(MaintenanceTask task, JobDetail jobDetail) {
+ // 1. 鏋勫缓鍞竴TriggerKey锛堝熀浜庝换鍔D锛�
+ TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId());
+
+ // 2. 鐢熸垚Cron琛ㄨ揪寮忥紙鍘熼�昏緫涓嶅彉锛�
+ String cronExpression = convertToCronExpression(task);
+
+ // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
+ return TriggerBuilder.newTrigger()
+ .withIdentity(triggerKey) // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
+ .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
+ .forJob(jobDetail) // 鍏宠仈瀵瑰簲鐨凧ob
+ .withSchedule(CronScheduleBuilder
+ .cronSchedule(cronExpression)
+ .withMisfireHandlingInstructionDoNothing() // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
+ )
+ // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
+ .startAt(task.getNextExecutionTime() != null
+ ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
+ : new Date())
+ .build();
+ }
+ private String convertToCronExpression(MaintenanceTask task) {
+ // 鍙傛暟鏍¢獙
+ if (task == null || task.getFrequencyType() == null || task.getFrequencyDetail() == null) {
+ throw new IllegalArgumentException("浠诲姟鍙傛暟涓嶈兘涓虹┖");
+ }
+
+ // 浣跨敤switch纭繚鏉′欢浜掓枼
+ String frequencyType = task.getFrequencyType().toUpperCase(); // 缁熶竴杞负澶у啓姣旇緝
+ switch (frequencyType) {
+ case "DAILY":
+ return convertDailyToCron(task.getFrequencyDetail());
+ case "WEEKLY":
+ return convertWeeklyToCron(task.getFrequencyDetail());
+ case "MONTHLY":
+ return convertMonthlyToCron(task.getFrequencyDetail());
+ case "QUARTERLY":
+ return convertQuarterlyToCron(task.getFrequencyDetail());
+ default:
+ throw new IllegalArgumentException("涓嶆敮鎸佺殑棰戠巼绫诲瀷: " + task.getFrequencyType());
+ }
+ }
+
+ // 姣忔棩浠诲姟杞崲
+ private String convertDailyToCron(String frequencyDetail) {
+ LocalTime time = parseTime(frequencyDetail);
+ return String.format("0 %d %d * * ?", time.getMinute(), time.getHour());
+ }
+
+ // 姣忓懆浠诲姟杞崲
+ private String convertWeeklyToCron(String frequencyDetail) {
+ String[] parts = validateAndSplit(frequencyDetail, ",", 2);
+ String daysOfWeek = convertDayNamesToCron(parts[0]);
+ LocalTime time = parseTime(parts[1]);
+ return String.format("0 %d %d ? * %s", time.getMinute(), time.getHour(), daysOfWeek);
+ }
+
+ // 姣忔湀浠诲姟杞崲
+ private String convertMonthlyToCron(String frequencyDetail) {
+ String[] parts = validateAndSplit(frequencyDetail, ",", 2);
+ int day = validateDayOfMonth(parts[0]);
+ LocalTime time = parseTime(parts[1]);
+ return String.format("0 %d %d %d * ?", time.getMinute(), time.getHour(), day);
+ }
+
+ // 姣忓搴︿换鍔¤浆鎹�
+ private String convertQuarterlyToCron(String frequencyDetail) {
+ String[] parts = validateAndSplit(frequencyDetail, ",", 3);
+ int month = validateMonth(parts[0]); // 楠岃瘉鏈堜唤(1-12)
+ int day = validateDayOfMonth(parts[1]); // 楠岃瘉鏃ユ湡
+ LocalTime time = parseTime(parts[2]); // 瑙f瀽鏃堕棿
+
+ // 璁$畻瀛e害璧峰鏈堜唤(1鏈�=1, 4鏈�=4, 7鏈�=7, 10鏈�=10)
+ int quarterStartMonth = ((month - 1) / 3) * 3 + 1;
+
+ return String.format("0 %d %d %d %d/3 ?",
+ time.getMinute(),
+ time.getHour(),
+ day,
+ quarterStartMonth);
+ }
+
+ // 鏂板楠岃瘉鏈堜唤鐨勬柟娉�(1-12)
+ private int validateMonth(String monthStr) {
+ try {
+ int month = Integer.parseInt(monthStr);
+ if (month < 1 || month > 12) {
+ throw new IllegalArgumentException("鏈堜唤蹇呴』鍦�1-12涔嬮棿");
+ }
+ return month;
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException("鏃犳晥鐨勬湀浠芥牸寮�");
+ }
+ }
+
+ // 杈呭姪鏂规硶锛氳В鏋愭椂闂�
+ private LocalTime parseTime(String timeStr) {
+ try {
+ return LocalTime.parse(timeStr);
+ } catch (DateTimeParseException e) {
+ throw new IllegalArgumentException("鏃堕棿鏍煎紡蹇呴』涓篐H:mm", e);
+ }
+ }
+
+ // 杈呭姪鏂规硶锛氶獙璇佸苟鍒嗗壊瀛楃涓�
+ private String[] validateAndSplit(String input, String delimiter, int expectedParts) {
+ String[] parts = input.split(delimiter);
+ if (parts.length != expectedParts) {
+ throw new IllegalArgumentException(
+ String.format("鏍煎紡閿欒锛屽簲涓�%d閮ㄥ垎鐢�'%s'鍒嗛殧", expectedParts, delimiter));
+ }
+ return parts;
+ }
+
+ // 杈呭姪鏂规硶锛氶獙璇佹湀浠戒腑鐨勬棩
+ private int validateDayOfMonth(String dayStr) {
+ int day = Integer.parseInt(dayStr);
+ if (day < 1 || day > 31) {
+ throw new IllegalArgumentException("鏃ユ湡蹇呴』鍦�1-31涔嬮棿");
+ }
+ return day;
+ }
+
+ // 杈呭姪鏂规硶锛氶獙璇佸搴︿腑鐨勬湀
+ private int validateMonthInQuarter(String monthStr) {
+ int month = Integer.parseInt(monthStr);
+ if (month < 1 || month > 3) {
+ throw new IllegalArgumentException("瀛e害鏈堜唤蹇呴』鏄�1銆�2鎴�3");
+ }
+ return month;
+ }
+
+ // 杞崲鏄熸湡鍑犲悕绉�
+ private String convertDayNamesToCron(String dayNames) {
+ return Arrays.stream(dayNames.split("\\|"))
+ .map(this::convertSingleDayName)
+ .collect(Collectors.joining(","));
+ }
+
+ // 杞崲鍗曚釜鏄熸湡鍑犲悕绉�
+ private String convertSingleDayName(String dayName) {
+ switch (dayName.toUpperCase()) {
+ case "MON": return "MON";
+ case "TUE": return "TUE";
+ case "WED": return "WED";
+ case "THU": return "THU";
+ case "FRI": return "FRI";
+ case "SAT": return "SAT";
+ case "SUN": return "SUN";
+ default: throw new IllegalArgumentException("鏃犳晥鐨勬槦鏈熷嚑: " + dayName);
+ }
+ }
+
+}
diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
new file mode 100644
index 0000000..5269c31
--- /dev/null
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -0,0 +1,119 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.device.mapper.MaintenanceTaskMapper;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import com.ruoyi.device.pojo.MaintenanceTask;
+import com.ruoyi.device.service.MaintenanceTaskService;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.inspectiontask.dto.TimingTaskDto;
+import com.ruoyi.inspectiontask.pojo.TimingTask;
+import com.ruoyi.inspectiontask.service.impl.TimingTaskServiceImpl;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author :yys
+ * @date : 2025/12/22 14:57
+ */
+@Service
+@Slf4j
+public class MaintenanceTaskServiceImpl extends ServiceImpl<MaintenanceTaskMapper, MaintenanceTask> implements MaintenanceTaskService {
+
+ @Autowired
+ private MaintenanceTaskMapper maintenanceTaskMapper;
+
+ @Autowired
+ private SysUserMapper sysUserMapper;
+
+ @Autowired
+ private TimingTaskServiceImpl timingTaskService;
+
+ @Autowired
+ private MaintenanceTaskScheduler maintenanceTaskScheduler;
+
+ @Override
+ public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) {
+ Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, null);
+ // 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
+ if (taskPage.getRecords().isEmpty()) {
+ return AjaxResult.success(taskPage);
+ }
+
+ // 3. 鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑鐢ㄦ埛ID
+ Set<Long> userIds = new HashSet<>();
+
+ // 鏀堕泦鐧昏浜篒D
+ taskPage.getRecords().forEach(task -> {
+ if (task.getRegistrantId() != null) {
+ userIds.add(task.getRegistrantId());
+ }
+ });
+
+ // 4. 鎵归噺鏌ヨ鐢ㄦ埛淇℃伅
+ Map<Long, String> userNickNameMap = new HashMap<>();
+ if (!userIds.isEmpty()) {
+ List<SysUser> users = sysUserMapper.selectUserByIds((new ArrayList<>(userIds)));
+ users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName()));
+ }
+ taskPage.getRecords().forEach(task -> {
+ // 璁剧疆鐧昏浜烘樀绉�
+ if (task.getRegistrantId() != null) {
+ task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "鏈煡鐢ㄦ埛"));
+ }
+ });
+ return AjaxResult.success(taskPage);
+ }
+
+ @Override
+ public AjaxResult add(MaintenanceTask maintenanceTask) {
+ maintenanceTask.setActive(true);
+ // 璁$畻棣栨鎵ц鏃堕棿
+ TimingTask task = new TimingTask();
+ task.setFrequencyType(maintenanceTask.getFrequencyType());
+ task.setFrequencyDetail(maintenanceTask.getFrequencyDetail());
+ LocalDateTime firstExecutionTime = timingTaskService.calculateFirstExecutionTime(task);
+ maintenanceTask.setNextExecutionTime(firstExecutionTime);
+ int insert = maintenanceTaskMapper.insert(maintenanceTask);
+ if (insert > 0) {
+ maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
+ }
+ return AjaxResult.success("娣诲姞鎴愬姛");
+ }
+
+ @Override
+ public AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) {
+ MaintenanceTask maintenanceTask1 = maintenanceTaskMapper.selectById(maintenanceTask.getId());
+ if (maintenanceTask1 == null) {
+ return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
+ }
+ BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
+ int update = maintenanceTaskMapper.updateById(maintenanceTask1);
+ if (update > 0) {
+ maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+ }
+ return AjaxResult.success("鏇存柊鎴愬姛");
+ }
+
+ @Override
+ public AjaxResult delete(List<Long> ids) {
+ int delete = maintenanceTaskMapper.deleteBatchIds(ids);
+ if (delete > 0) {
+ ids.forEach(id -> {
+ maintenanceTaskScheduler.unscheduleMaintenanceTask(id);
+ });
+ }
+ return AjaxResult.success("鍒犻櫎鎴愬姛");
+ }
+}
diff --git a/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java b/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
index e802ccc..7acd770 100644
--- a/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
+++ b/src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.inspectiontask.dto.TimingTaskDto;
@@ -58,6 +60,7 @@
*/
@PostMapping("/addOrEditTimingTask")
@ApiOperation(value = "鏂板淇敼瀹氭椂浠诲姟")
+ @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.INSERT)
public R addOrEditTimingTask(@RequestBody TimingTaskDto timingTaskDto) throws SchedulerException {
return R.ok(timingTaskService.addOrEditTimingTask(timingTaskDto));
}
@@ -67,6 +70,7 @@
*/
@DeleteMapping("/delTimingTask")
@ApiOperation(value = "鍒犻櫎瀹氭椂浠诲姟")
+ @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.DELETE)
public R remove(@RequestBody Long[] ids) {
return R.ok(timingTaskService.delByIds(ids));
}
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
index 2ff2e7e..125f311 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -84,9 +84,13 @@
/**
* 鍒犻櫎浠诲姟
*/
- public void unscheduleTimingTask(Long taskId) throws SchedulerException {
- JobKey jobKey = new JobKey("timingTask_" + taskId);
- scheduler.deleteJob(jobKey);
+ public void unscheduleTimingTask(Long taskId){
+ try {
+ JobKey jobKey = new JobKey("timingTask_" + taskId);
+ scheduler.deleteJob(jobKey);
+ }catch (SchedulerException e){
+ throw new RuntimeException(e);
+ }
}
private JobDetail buildJobDetail(TimingTask task) {
diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
index f3d1ef1..6cf4b7a 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -155,7 +155,7 @@
}
}
- private LocalDateTime calculateFirstExecutionTime(TimingTask task) {
+ public LocalDateTime calculateFirstExecutionTime(TimingTask task) {
// 鏍规嵁棰戠巼绫诲瀷鍜岃鎯呰绠楅娆℃墽琛屾椂闂�
String frequencyType = task.getFrequencyType();
if ("DAILY".equals(frequencyType)) {
@@ -455,7 +455,13 @@
@Override
public int delByIds(Long[] ids) {
- return timingTaskMapper.deleteBatchIds(Arrays.asList(ids));
+ int i = timingTaskMapper.deleteBatchIds(Arrays.asList(ids));
+ if(i > 0){
+ for (Long id : ids) {
+ timingTaskScheduler.unscheduleTimingTask(id);
+ }
+ }
+ return i;
}
}
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index 083feea..35985d8 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -10,15 +10,15 @@
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
+import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
+import com.ruoyi.production.pojo.SalesLedgerWork;
import com.ruoyi.sales.dto.InvoiceLedgerDto;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.mapper.InvoiceLedgerMapper;
import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
-import com.ruoyi.sales.pojo.InvoiceLedger;
-import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
-import com.ruoyi.sales.pojo.ReceiptPayment;
-import com.ruoyi.sales.pojo.SalesLedger;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.*;
import com.ruoyi.sales.service.ICommonFileService;
import com.ruoyi.sales.service.ISalesLedgerService;
import lombok.AllArgsConstructor;
@@ -28,10 +28,7 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -57,6 +54,12 @@
@Autowired
private ReceiptPaymentMapper receiptPaymentMapper;
+
+ @Autowired
+ private SalesLedgerProductMapper salesLedgerProductMapper;
+
+ @Autowired
+ private SalesLedgerWorkMapper salesLedgerWorkMapper;
/**
* 鏌ヨ閿�鍞彴璐﹀垪琛�
@@ -205,9 +208,6 @@
}
List<Long> salesLedgerIds = iPage.getRecords().stream().map(SalesLedger::getId).collect(Collectors.toList());
List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds);
- if(CollectionUtils.isEmpty(invoiceLedgerDtoList)){
- return iPage;
- }
// 璁$畻鍥炴閲戦锛屽緟鍥炴閲戦
List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(new LambdaQueryWrapper<InvoiceRegistrationProduct>()
.in(InvoiceRegistrationProduct::getSalesLedgerId, salesLedgerIds));
@@ -218,6 +218,42 @@
if(!CollectionUtils.isEmpty(invoiceLedgers)){
receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>()
.in(ReceiptPayment::getInvoiceLedgerId, invoiceLedgers.stream().map(InvoiceLedger::getId).collect(Collectors.toList())));
+ }
+ // 鑾峰彇閿�鍞骇鍝佹暟閲�
+ List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper
+ .selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
+ .eq(SalesLedgerProduct::getType, 1)
+ .in(SalesLedgerProduct::getSalesLedgerId, salesLedgerIds));
+ Map<Long, BigDecimal> salesLedgerProductCountMap = new HashMap<>();
+ if (!CollectionUtils.isEmpty(salesLedgerProducts)) {
+ salesLedgerProductCountMap = salesLedgerProducts
+ .stream()
+ .filter(Objects::nonNull)
+ .collect(Collectors.groupingBy(
+ SalesLedgerProduct::getSalesLedgerId,
+ Collectors.reducing(
+ BigDecimal.ZERO,
+ SalesLedgerProduct::getQuantity,
+ BigDecimal::add
+ )
+ ));
+ }
+ // 鑾峰彇閿�鍞骇鍝佺敓浜ф姤宸ユ暟閲�
+ List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(new LambdaQueryWrapper<SalesLedgerWork>()
+ .in(SalesLedgerWork::getSalesLedgerId, salesLedgerIds));
+ Map<Long, BigDecimal> salesLedgerWorkCountMap = new HashMap<>();
+ if (!CollectionUtils.isEmpty(salesLedgerWorks)) {
+ salesLedgerWorkCountMap = salesLedgerWorks
+ .stream()
+ .filter(Objects::nonNull)
+ .collect(Collectors.groupingBy(
+ SalesLedgerWork::getSalesLedgerId,
+ Collectors.reducing(
+ BigDecimal.ZERO,
+ SalesLedgerWork::getFinishedNum,
+ BigDecimal::add
+ )
+ ));
}
for (SalesLedger salesLedger : iPage.getRecords()) {
boolean existFlag = false;
@@ -257,6 +293,8 @@
salesLedger.setNoInvoiceAmountTotal(salesLedger.getContractAmount());
}
salesLedger.setInvoiceTotal(invoiceTotal);
+ // 鍒ゆ柇鏄惁鏄敓浜у畬鎴�
+ salesLedger.setProductionStatus(salesLedgerProductCountMap.get(salesLedger.getId()) == null ? "鏈紑濮�" : salesLedgerProductCountMap.get(salesLedger.getId()).compareTo(salesLedgerWorkCountMap.get(salesLedger.getId())) > 0 ? "鐢熶骇涓�" : "宸插畬鎴�");
}
if (ObjectUtils.isNotEmpty(salesLedgerDto.getStatus())) {
if (salesLedgerDto.getStatus()) {
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
index 35b7488..955f4da 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -140,5 +140,9 @@
@ApiModelProperty(value = "浠樻鏂瑰紡")
private String paymentMethod;
+
+ @TableField(exist = false)
+ @ApiModelProperty(value = "鐢熶骇鐘舵��")
+ private String productionStatus = "鏈紑濮�";
}
--
Gitblit v1.9.3