yq 3 роки тому
батько
коміт
8cb31aa727

+ 35 - 0
src/main/java/com/usky/dxtop/controller/web/SysAsyncController.java

@@ -0,0 +1,35 @@
+package com.usky.dxtop.controller.web;
+
+
+import com.usky.dxtop.common.core.domain.AjaxResult;
+import com.usky.dxtop.service.ISysAsyncTaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+/**
+ * @author fzq
+ */
+@RestController
+@RequestMapping("/async")
+public class SysAsyncController {
+
+    @Autowired
+    private ISysAsyncTaskService iSysAsyncTaskService;
+
+    @GetMapping
+    public AjaxResult getList(@RequestParam(required = false) Long asyncTaskId,
+                              @RequestParam(required = false) Date startTime,
+                              @RequestParam(required = false) Date endTime,
+                              @RequestParam(required = false) String funcType,
+                              @RequestParam(required = false) String userName,
+                              Integer current,
+                              Integer size) {
+        return AjaxResult.success(iSysAsyncTaskService.getList(asyncTaskId, startTime, endTime, funcType, userName, current, size));
+    }
+
+}

+ 25 - 0
src/main/java/com/usky/dxtop/mapper/SysAsyncTaskMapper.java

@@ -0,0 +1,25 @@
+package com.usky.dxtop.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.usky.dxtop.model.SysAsyncTask;
+import org.springframework.stereotype.Repository;
+
+import java.util.Date;
+
+/**
+ * @author fanzhiqiang
+ */
+@Repository
+public interface SysAsyncTaskMapper extends BaseMapper<SysAsyncTask> {
+
+    /**
+     * 查询某个用户一小时内调用次数
+     *
+     * @param userId  用户ID
+     * @param endTime now()-1h
+     * @return 调用次数
+     */
+    Integer getCountByUserIdAndFuncTypeAndCreateTime(String userId, String funcType, Date endTime);
+
+}

+ 29 - 0
src/main/java/com/usky/dxtop/model/SysAsyncTask.java

@@ -0,0 +1,29 @@
+package com.usky.dxtop.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.usky.dxtop.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author fzq
+ */
+@Data
+public class SysAsyncTask extends BaseEntity {
+    @TableId(type = IdType.ASSIGN_ID)
+    //任务id
+    private Long id;
+    //
+    private String funcType;
+    private Date startTime;
+    private Date endTime;
+    //成功或者失败
+    private Boolean isSuccess;
+    //文件类型(text或者文件)
+    private String resultType;
+    private String resultKey;
+    //内容batchno或者是结果
+    private String result;
+}

+ 49 - 0
src/main/java/com/usky/dxtop/service/ISysAsyncTaskService.java

@@ -0,0 +1,49 @@
+package com.usky.dxtop.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.usky.dxtop.common.core.page.CommonPage;
+import com.usky.dxtop.model.SysAsyncTask;
+import com.usky.dxtop.service.emun.AsyncResultType;
+
+import java.util.Date;
+
+public interface ISysAsyncTaskService extends IService<SysAsyncTask> {
+
+
+    /**
+     * 返回执行ID
+     *
+     * @param userId
+     * @param userName
+     * @param funcType
+     * @return
+     */
+    Long getId(String userId, String userName, String funcType);
+
+    /**
+     * 分页查询
+     *
+     * @param asyncTaskId
+     * @param startTime
+     * @param endTime
+     * @param funcType
+     * @param current
+     * @param size
+     * @return
+     */
+    CommonPage<SysAsyncTask> getList(Long asyncTaskId, Date startTime, Date endTime, String funcType, String userName, Integer current, Integer size);
+
+    /**
+     * 回传返回结果
+     *
+     * @param isSuccess
+     * @param result
+     * @param resultType
+     */
+    void sendResult(Long id, Boolean isSuccess, String result, AsyncResultType resultType);
+
+    /**
+     * 回传返回结果
+     */
+    void sendResult(SysAsyncTask sysAsyncTask);
+}

+ 12 - 0
src/main/java/com/usky/dxtop/service/emun/AsyncResultType.java

@@ -0,0 +1,12 @@
+package com.usky.dxtop.service.emun;
+
+/**
+ * @author yq
+ * @date 2021/7/1 10:10
+ */
+public enum AsyncResultType {
+
+    FILE,
+
+    TEXT;
+}

+ 83 - 0
src/main/java/com/usky/dxtop/service/impl/SysAsyncTaskServiceImpl.java

@@ -0,0 +1,83 @@
+package com.usky.dxtop.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.usky.dxtop.common.core.page.CommonPage;
+import com.usky.dxtop.common.exception.CustomException;
+import com.usky.dxtop.common.utils.SecurityUtils;
+import com.usky.dxtop.common.utils.StringUtils;
+import com.usky.dxtop.mapper.SysAsyncTaskMapper;
+import com.usky.dxtop.model.SysAsyncTask;
+import com.usky.dxtop.service.ISysAsyncTaskService;
+import com.usky.dxtop.service.ISysConfigService;
+import com.usky.dxtop.service.emun.AsyncResultType;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author fanzhiqiang
+ */
+@Service
+@AllArgsConstructor
+public class SysAsyncTaskServiceImpl extends ServiceImpl<SysAsyncTaskMapper, SysAsyncTask> implements ISysAsyncTaskService {
+
+    private final ISysConfigService sysConfigService;
+
+    @Override
+    public Long getId(String userId, String userName, String funcType) {
+        int limit = Integer.parseInt(sysConfigService.selectConfigByKey("sys.async.operationLimit"));
+        Calendar c = Calendar.getInstance();
+        c.setTime(new Date());
+        c.add(Calendar.HOUR, -1);
+        Integer count = baseMapper.getCountByUserIdAndFuncTypeAndCreateTime(userId, funcType, c.getTime());
+        if (count != null && count >= limit) {
+            throw new CustomException("暂时无法开启异步任务");
+        }
+        SysAsyncTask sysAsyncTask = new SysAsyncTask();
+        sysAsyncTask.setStartTime(new Date());
+        sysAsyncTask.setCreateBy(SecurityUtils.getUsername());
+        sysAsyncTask.setFuncType(funcType);
+        save(sysAsyncTask);
+        return sysAsyncTask.getId();
+    }
+
+
+    @Override
+    public CommonPage<SysAsyncTask> getList(Long asyncTaskId, Date startTime, Date endTime, String funcType, String userName, Integer current, Integer size) {
+        Page<SysAsyncTask> page = new Page<>(current, size);
+        LambdaQueryWrapper<SysAsyncTask> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(asyncTaskId != null, SysAsyncTask::getId, asyncTaskId)
+                .ge(startTime != null, SysAsyncTask::getStartTime, startTime)
+                .le(endTime != null, SysAsyncTask::getStartTime, endTime)
+                .eq(StringUtils.isNotBlank(funcType), SysAsyncTask::getFuncType, funcType)
+                .eq(StringUtils.isNotBlank(userName), SysAsyncTask::getCreateBy, userName);
+        page = page(page, queryWrapper);
+        return new CommonPage<>(page.getRecords(),page.getTotal(),page.getCurrent(),page.getSize());
+    }
+
+    @Override
+    public void sendResult(Long id, Boolean isSuccess, String result, AsyncResultType resultType) {
+        SysAsyncTask sysAsyncTask = new SysAsyncTask();
+        sysAsyncTask.setId(id);
+        sysAsyncTask.setIsSuccess(isSuccess);
+        sysAsyncTask.setResult(result);
+        sysAsyncTask.setResultType(resultType.name());
+        if (Objects.equals(AsyncResultType.FILE, resultType)) {
+            sysAsyncTask.setResultKey(result);
+        }
+        sysAsyncTask.setEndTime(new Date());
+        this.updateById(sysAsyncTask);
+    }
+
+    @Override
+    public void sendResult(SysAsyncTask sysAsyncTask) {
+        sysAsyncTask.setEndTime(new Date());
+        this.updateById(sysAsyncTask);
+    }
+}

+ 12 - 0
src/main/resources/mapper/SysAsyncTaskMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.dxtop.mapper.SysAsyncTaskMapper">
+
+    <select id="getCountByUserIdAndFuncTypeAndCreateTime" resultType="java.lang.Integer">
+        select count(1)
+        from sys_async_task
+        where create_by = #{userId}
+          and func_type = #{funcType}
+          and create_time &gt; #{endTime}
+    </select>
+</mapper>