Compare commits
10 Commits
e4c235bbb1
...
9a6e0bfabd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9a6e0bfabd | ||
|
|
490af83cc6 | ||
|
|
348ca7050f | ||
|
|
5169f9331b | ||
|
|
b138e680a0 | ||
|
|
6244da0380 | ||
|
|
8161ffee88 | ||
|
|
442f8b18a0 | ||
|
|
edc52316f7 | ||
|
|
71607ee738 |
21
README.md
21
README.md
@@ -60,9 +60,8 @@ caigou
|
||||
| |  |
|
||||
| |  |
|
||||
| |  |
|
||||
| |  |
|
||||
| | 
|
||||
|
||||
| |  |
|
||||
| |  |
|
||||
|
||||
#### 演示视频
|
||||
|
||||
@@ -74,13 +73,21 @@ Email: fan1ke2ke@gmail.com
|
||||
|
||||
WeChat: `Storm_Berserker`
|
||||
|
||||
`附带部署与讲解服务,因为要恰饭资源非免费,伸手党勿扰,谢谢理解`
|
||||
`附带部署与讲解服务,因为要恰饭资源非免费,伸手党勿扰,谢谢理解😭`
|
||||
|
||||
> 1.项目纯原创,不做二手贩子 2.一次购买终身有效 3.项目讲解持续到答辩结束 4.非常负责的答辩指导 5.**黑奴价格**
|
||||
|
||||
> 项目部署调试不好包退!功能逻辑没讲明白包退!
|
||||
|
||||
#### 其它资源
|
||||
|
||||
[2023年答辩顺利通过](https://berserker287.github.io/2023/06/14/2023%E5%B9%B4%E7%AD%94%E8%BE%A9%E9%A1%BA%E5%88%A9%E9%80%9A%E8%BF%87/)
|
||||
[2025年-答辩顺利通过-客户评价🍜](https://berserker287.github.io/2025/06/18/2025%E5%B9%B4%E7%AD%94%E8%BE%A9%E9%A1%BA%E5%88%A9%E9%80%9A%E8%BF%87/)
|
||||
|
||||
[2022年答辩通过率100%](https://berserker287.github.io/2022/05/25/%E9%A1%B9%E7%9B%AE%E4%BA%A4%E6%98%93%E8%AE%B0%E5%BD%95/)
|
||||
[2024年-答辩顺利通过-客户评价👻](https://berserker287.github.io/2024/06/06/2024%E5%B9%B4%E7%AD%94%E8%BE%A9%E9%A1%BA%E5%88%A9%E9%80%9A%E8%BF%87/)
|
||||
|
||||
[2023年-答辩顺利通过-客户评价🐢](https://berserker287.github.io/2023/06/14/2023%E5%B9%B4%E7%AD%94%E8%BE%A9%E9%A1%BA%E5%88%A9%E9%80%9A%E8%BF%87/)
|
||||
|
||||
[2022年-答辩通过率100%-客户评价🐣](https://berserker287.github.io/2022/05/25/%E9%A1%B9%E7%9B%AE%E4%BA%A4%E6%98%93%E8%AE%B0%E5%BD%95/)
|
||||
|
||||
[毕业答辩导师提问的高频问题](https://berserker287.github.io/2023/06/13/%E6%AF%95%E4%B8%9A%E7%AD%94%E8%BE%A9%E5%AF%BC%E5%B8%88%E6%8F%90%E9%97%AE%E7%9A%84%E9%AB%98%E9%A2%91%E9%97%AE%E9%A2%98/)
|
||||
|
||||
@@ -93,4 +100,6 @@ WeChat: `Storm_Berserker`
|
||||
|
||||
#### 接JAVAWEB毕设,纯原创,价格公道,诚信第一
|
||||
|
||||
`网站建设、小程序、H5、APP、各种系统 选题+开题报告+任务书+程序定制+安装调试+项目讲解+论文+答辩PPT`
|
||||
|
||||
More info: [悲伤的橘子树](https://berserker287.github.io/)
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="Spring" name="Spring">
|
||||
<configuration />
|
||||
</facet>
|
||||
<facet type="web" name="Web">
|
||||
<configuration>
|
||||
<webroots />
|
||||
</configuration>
|
||||
</facet>
|
||||
<facet type="Spring" name="Spring">
|
||||
<configuration />
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output url="file://$MODULE_DIR$/target/classes" />
|
||||
|
||||
@@ -30,7 +30,7 @@ public class FebsConstant {
|
||||
public static final String TYPE_MENU = "0";
|
||||
|
||||
// 网络资源 Url
|
||||
public static final String MEIZU_WEATHER_URL = "http://aider.meizu.com/app/weather/listWeather";
|
||||
public static final String MEIZU_WEATHER_URL = "https://aider.meizu.com/app/weather/listWeather";
|
||||
public static final String MRYW_TODAY_URL = "https://interface.meiriyiwen.com/article/today";
|
||||
public static final String MRYW_DAY_URL = "https://interface.meiriyiwen.com/article/day";
|
||||
public static final String TIME_MOVIE_HOT_URL = "https://api-m.mtime.cn/Showtime/LocationMovies.api";
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
package cc.mrbird.febs.cos.controller;
|
||||
|
||||
|
||||
import cc.mrbird.febs.common.utils.R;
|
||||
import cc.mrbird.febs.cos.entity.ScoreInfo;
|
||||
import cc.mrbird.febs.cos.service.IScoreInfoService;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author FanK
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/cos/score-info")
|
||||
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
|
||||
public class ScoreInfoController {
|
||||
|
||||
private final IScoreInfoService scoreInfoService;
|
||||
|
||||
/**
|
||||
* 分页获取安全评分信息
|
||||
*
|
||||
* @param page 分页对象
|
||||
* @param scoreInfo 安全评分信息
|
||||
* @return 结果
|
||||
*/
|
||||
@GetMapping("/page")
|
||||
public R page(Page<ScoreInfo> page, ScoreInfo scoreInfo) {
|
||||
return R.ok(scoreInfoService.queryScorePage(page, scoreInfo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取安全评分信息
|
||||
*
|
||||
* @return 结果
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
public R list() {
|
||||
return R.ok(scoreInfoService.list());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取安全评分详细信息
|
||||
*
|
||||
* @param id ID
|
||||
* @return 结果
|
||||
*/
|
||||
@GetMapping("/detail/{id}")
|
||||
public R detail(@PathVariable("id") Integer id) {
|
||||
return R.ok(scoreInfoService.getById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增安全评分信息
|
||||
*
|
||||
* @param scoreInfo 安全评分信息
|
||||
* @return 结果
|
||||
*/
|
||||
@PostMapping
|
||||
public R save(ScoreInfo scoreInfo) {
|
||||
scoreInfo.setCreateDate(DateUtil.formatDateTime(new Date()));
|
||||
return R.ok(scoreInfoService.save(scoreInfo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改安全评分信息
|
||||
*
|
||||
* @param scoreInfo 安全评分信息
|
||||
* @return 结果
|
||||
*/
|
||||
@PutMapping
|
||||
public R edit(ScoreInfo scoreInfo) {
|
||||
return R.ok(scoreInfoService.updateById(scoreInfo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除安全评分信息
|
||||
*
|
||||
* @param ids 主键IDS
|
||||
* @return 结果
|
||||
*/
|
||||
@DeleteMapping("/{ids}")
|
||||
public R deleteByIds(@PathVariable("ids") List<Integer> ids) {
|
||||
return R.ok(scoreInfoService.removeByIds(ids));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package cc.mrbird.febs.cos.dao;
|
||||
|
||||
import cc.mrbird.febs.cos.entity.ScoreInfo;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
/**
|
||||
* @author FanK
|
||||
*/
|
||||
public interface ScoreInfoMapper extends BaseMapper<ScoreInfo> {
|
||||
|
||||
/**
|
||||
* 分页获取安全评分信息
|
||||
*
|
||||
* @param page 分页对象
|
||||
* @param scoreInfo 安全评分信息
|
||||
* @return 结果
|
||||
*/
|
||||
IPage<LinkedHashMap<String, Object>> queryScorePage(Page<ScoreInfo> page, @Param("scoreInfo") ScoreInfo scoreInfo);
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
package cc.mrbird.febs.cos.entity;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 安全评分
|
||||
*
|
||||
* @author FanK
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@Accessors(chain = true)
|
||||
public class ScoreInfo implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@TableId(value = "ID", type = IdType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
* 员工编号
|
||||
*/
|
||||
private String staffCode;
|
||||
|
||||
/**
|
||||
* 工作得分
|
||||
*/
|
||||
private BigDecimal workScore;
|
||||
|
||||
/**
|
||||
* 评价人
|
||||
*/
|
||||
private String appraiser;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 评价时间
|
||||
*/
|
||||
private String createDate;
|
||||
|
||||
/**
|
||||
* 所属安全教育
|
||||
*/
|
||||
private Integer safeId;
|
||||
|
||||
@TableField(exist = false)
|
||||
private String staffName;
|
||||
|
||||
@TableField(exist = false)
|
||||
private String title;
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package cc.mrbird.febs.cos.service;
|
||||
|
||||
import cc.mrbird.febs.cos.entity.ScoreInfo;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
/**
|
||||
* @author FanK
|
||||
*/
|
||||
public interface IScoreInfoService extends IService<ScoreInfo> {
|
||||
|
||||
/**
|
||||
* 分页获取安全评分信息
|
||||
*
|
||||
* @param page 分页对象
|
||||
* @param scoreInfo 安全评分信息
|
||||
* @return 结果
|
||||
*/
|
||||
IPage<LinkedHashMap<String, Object>> queryScorePage(Page<ScoreInfo> page, ScoreInfo scoreInfo);
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package cc.mrbird.febs.cos.service.impl;
|
||||
|
||||
import cc.mrbird.febs.cos.entity.ScoreInfo;
|
||||
import cc.mrbird.febs.cos.dao.ScoreInfoMapper;
|
||||
import cc.mrbird.febs.cos.service.IScoreInfoService;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
/**
|
||||
* @author FanK
|
||||
*/
|
||||
@Service
|
||||
public class ScoreInfoServiceImpl extends ServiceImpl<ScoreInfoMapper, ScoreInfo> implements IScoreInfoService {
|
||||
|
||||
/**
|
||||
* 分页获取安全评分信息
|
||||
*
|
||||
* @param page 分页对象
|
||||
* @param scoreInfo 安全评分信息
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public IPage<LinkedHashMap<String, Object>> queryScorePage(Page<ScoreInfo> page, ScoreInfo scoreInfo) {
|
||||
return baseMapper.queryScorePage(page, scoreInfo);
|
||||
}
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
package cc.mrbird.febs.job.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* 定时任务配置
|
||||
*
|
||||
*/
|
||||
@Configuration
|
||||
public class ScheduleConfig {
|
||||
|
||||
@Bean
|
||||
public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
|
||||
SchedulerFactoryBean factory = new SchedulerFactoryBean();
|
||||
factory.setDataSource(dataSource);
|
||||
|
||||
// quartz参数
|
||||
Properties prop = new Properties();
|
||||
prop.put("org.quartz.scheduler.instanceName", "MyScheduler");
|
||||
prop.put("org.quartz.scheduler.instanceId", "AUTO");
|
||||
// 线程池配置
|
||||
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
|
||||
prop.put("org.quartz.threadPool.threadCount", "20");
|
||||
prop.put("org.quartz.threadPool.threadPriority", "5");
|
||||
// JobStore配置
|
||||
prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
|
||||
// 集群配置
|
||||
prop.put("org.quartz.jobStore.isClustered", "true");
|
||||
prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
|
||||
prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
|
||||
|
||||
prop.put("org.quartz.jobStore.misfireThreshold", "12000");
|
||||
prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
|
||||
factory.setQuartzProperties(prop);
|
||||
|
||||
factory.setSchedulerName("MyScheduler");
|
||||
// 延时启动
|
||||
factory.setStartupDelay(1);
|
||||
factory.setApplicationContextSchedulerContextKey("applicationContextKey");
|
||||
// 可选,QuartzScheduler
|
||||
// 启动时更新己存在的 Job
|
||||
factory.setOverwriteExistingJobs(true);
|
||||
// 设置自动启动,默认为 true
|
||||
factory.setAutoStartup(true);
|
||||
|
||||
return factory;
|
||||
}
|
||||
}
|
||||
@@ -1,141 +0,0 @@
|
||||
package cc.mrbird.febs.job.controller;
|
||||
|
||||
import cc.mrbird.febs.common.annotation.Log;
|
||||
import cc.mrbird.febs.common.controller.BaseController;
|
||||
import cc.mrbird.febs.common.domain.QueryRequest;
|
||||
import cc.mrbird.febs.common.exception.FebsException;
|
||||
import cc.mrbird.febs.job.domain.Job;
|
||||
import cc.mrbird.febs.job.service.JobService;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringPool;
|
||||
import com.wuwenze.poi.ExcelKit;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.quartz.CronExpression;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@Validated
|
||||
@RestController
|
||||
@RequestMapping("job")
|
||||
public class JobController extends BaseController {
|
||||
|
||||
private String message;
|
||||
|
||||
@Autowired
|
||||
private JobService jobService;
|
||||
|
||||
@GetMapping
|
||||
@RequiresPermissions("job:view")
|
||||
public Map<String, Object> jobList(QueryRequest request, Job job) {
|
||||
return getDataTable(this.jobService.findJobs(request, job));
|
||||
}
|
||||
|
||||
@GetMapping("cron/check")
|
||||
public boolean checkCron(String cron) {
|
||||
try {
|
||||
return CronExpression.isValidExpression(cron);
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Log("新增定时任务")
|
||||
@PostMapping
|
||||
@RequiresPermissions("job:add")
|
||||
public void addJob(@Valid Job job) throws FebsException {
|
||||
try {
|
||||
this.jobService.createJob(job);
|
||||
} catch (Exception e) {
|
||||
message = "新增定时任务失败";
|
||||
log.error(message, e);
|
||||
throw new FebsException(message);
|
||||
}
|
||||
}
|
||||
|
||||
@Log("删除定时任务")
|
||||
@DeleteMapping("/{jobIds}")
|
||||
@RequiresPermissions("job:delete")
|
||||
public void deleteJob(@NotBlank(message = "{required}") @PathVariable String jobIds) throws FebsException {
|
||||
try {
|
||||
String[] ids = jobIds.split(StringPool.COMMA);
|
||||
this.jobService.deleteJobs(ids);
|
||||
} catch (Exception e) {
|
||||
message = "删除定时任务失败";
|
||||
log.error(message, e);
|
||||
throw new FebsException(message);
|
||||
}
|
||||
}
|
||||
|
||||
@Log("修改定时任务")
|
||||
@PutMapping
|
||||
@RequiresPermissions("job:update")
|
||||
public void updateJob(@Valid Job job) throws FebsException {
|
||||
try {
|
||||
this.jobService.updateJob(job);
|
||||
} catch (Exception e) {
|
||||
message = "修改定时任务失败";
|
||||
log.error(message, e);
|
||||
throw new FebsException(message);
|
||||
}
|
||||
}
|
||||
|
||||
@Log("执行定时任务")
|
||||
@GetMapping("run/{jobId}")
|
||||
@RequiresPermissions("job:run")
|
||||
public void runJob(@NotBlank(message = "{required}") @PathVariable String jobId) throws FebsException {
|
||||
try {
|
||||
this.jobService.run(jobId);
|
||||
} catch (Exception e) {
|
||||
message = "执行定时任务失败";
|
||||
log.error(message, e);
|
||||
throw new FebsException(message);
|
||||
}
|
||||
}
|
||||
|
||||
@Log("暂停定时任务")
|
||||
@GetMapping("pause/{jobId}")
|
||||
@RequiresPermissions("job:pause")
|
||||
public void pauseJob(@NotBlank(message = "{required}") @PathVariable String jobId) throws FebsException {
|
||||
try {
|
||||
this.jobService.pause(jobId);
|
||||
} catch (Exception e) {
|
||||
message = "暂停定时任务失败";
|
||||
log.error(message, e);
|
||||
throw new FebsException(message);
|
||||
}
|
||||
}
|
||||
|
||||
@Log("恢复定时任务")
|
||||
@GetMapping("resume/{jobId}")
|
||||
@RequiresPermissions("job:resume")
|
||||
public void resumeJob(@NotBlank(message = "{required}") @PathVariable String jobId) throws FebsException {
|
||||
try {
|
||||
this.jobService.resume(jobId);
|
||||
} catch (Exception e) {
|
||||
message = "恢复定时任务失败";
|
||||
log.error(message, e);
|
||||
throw new FebsException(message);
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping("excel")
|
||||
@RequiresPermissions("job:export")
|
||||
public void export(QueryRequest request, Job job, HttpServletResponse response) throws FebsException {
|
||||
try {
|
||||
List<Job> jobs = this.jobService.findJobs(request, job).getRecords();
|
||||
ExcelKit.$Export(Job.class, response).downXlsx(jobs, false);
|
||||
} catch (Exception e) {
|
||||
message = "导出Excel失败";
|
||||
log.error(message, e);
|
||||
throw new FebsException(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
package cc.mrbird.febs.job.controller;
|
||||
|
||||
import cc.mrbird.febs.common.controller.BaseController;
|
||||
import cc.mrbird.febs.common.domain.QueryRequest;
|
||||
import cc.mrbird.febs.common.exception.FebsException;
|
||||
import cc.mrbird.febs.job.domain.JobLog;
|
||||
import cc.mrbird.febs.job.service.JobLogService;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringPool;
|
||||
import com.wuwenze.poi.ExcelKit;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@Validated
|
||||
@RestController
|
||||
@RequestMapping("job/log")
|
||||
public class JobLogController extends BaseController {
|
||||
|
||||
private String message;
|
||||
|
||||
@Autowired
|
||||
private JobLogService jobLogService;
|
||||
|
||||
@GetMapping
|
||||
@RequiresPermissions("jobLog:view")
|
||||
public Map<String, Object> jobLogList(QueryRequest request, JobLog log) {
|
||||
return getDataTable(this.jobLogService.findJobLogs(request, log));
|
||||
}
|
||||
|
||||
@DeleteMapping("/{jobIds}")
|
||||
@RequiresPermissions("jobLog:delete")
|
||||
public void deleteJobLog(@NotBlank(message = "{required}") @PathVariable String jobIds) throws FebsException {
|
||||
try {
|
||||
String[] ids = jobIds.split(StringPool.COMMA);
|
||||
this.jobLogService.deleteJobLogs(ids);
|
||||
} catch (Exception e) {
|
||||
message = "删除调度日志失败";
|
||||
log.error(message, e);
|
||||
throw new FebsException(message);
|
||||
}
|
||||
}
|
||||
|
||||
@PostMapping("excel")
|
||||
@RequiresPermissions("jobLog:export")
|
||||
public void export(QueryRequest request, JobLog jobLog, HttpServletResponse response) throws FebsException {
|
||||
try {
|
||||
List<JobLog> jobLogs = this.jobLogService.findJobLogs(request, jobLog).getRecords();
|
||||
ExcelKit.$Export(JobLog.class, response).downXlsx(jobLogs, false);
|
||||
} catch (Exception e) {
|
||||
message = "导出Excel失败";
|
||||
log.error(message, e);
|
||||
throw new FebsException(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
package cc.mrbird.febs.job.dao;
|
||||
|
||||
|
||||
import cc.mrbird.febs.job.domain.JobLog;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
public interface JobLogMapper extends BaseMapper<JobLog> {
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
package cc.mrbird.febs.job.dao;
|
||||
|
||||
|
||||
import cc.mrbird.febs.job.domain.Job;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface JobMapper extends BaseMapper<Job> {
|
||||
|
||||
List<Job> queryList();
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
package cc.mrbird.febs.job.domain;
|
||||
|
||||
import cc.mrbird.febs.common.annotation.IsCron;
|
||||
import cc.mrbird.febs.common.converter.TimeConverter;
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.wuwenze.poi.annotation.Excel;
|
||||
import com.wuwenze.poi.annotation.ExcelField;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.Size;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
@TableName("t_job")
|
||||
@Excel("定时任务信息表")
|
||||
public class Job implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 400066840871805700L;
|
||||
|
||||
/**
|
||||
* 任务调度参数 key
|
||||
*/
|
||||
public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY";
|
||||
|
||||
public enum ScheduleStatus {
|
||||
/**
|
||||
* 正常
|
||||
*/
|
||||
NORMAL("0"),
|
||||
/**
|
||||
* 暂停
|
||||
*/
|
||||
PAUSE("1");
|
||||
|
||||
private String value;
|
||||
|
||||
ScheduleStatus(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
@TableId(value = "JOB_ID", type = IdType.AUTO)
|
||||
private Long jobId;
|
||||
|
||||
@NotBlank(message = "{required}")
|
||||
@Size(max = 50, message = "{noMoreThan}")
|
||||
@ExcelField(value = "Bean名称")
|
||||
private String beanName;
|
||||
|
||||
@NotBlank(message = "{required}")
|
||||
@Size(max = 50, message = "{noMoreThan}")
|
||||
@ExcelField(value = "方法名称")
|
||||
private String methodName;
|
||||
|
||||
@Size(max = 50, message = "{noMoreThan}")
|
||||
@ExcelField(value = "方法参数")
|
||||
private String params;
|
||||
|
||||
@NotBlank(message = "{required}")
|
||||
@IsCron(message = "{invalid}")
|
||||
@ExcelField(value = "Cron表达式")
|
||||
private String cronExpression;
|
||||
|
||||
@ExcelField(value = "状态", writeConverterExp = "0=正常,1=暂停")
|
||||
private String status;
|
||||
|
||||
@Size(max = 100, message = "{noMoreThan}")
|
||||
@ExcelField(value = "备注")
|
||||
private String remark;
|
||||
|
||||
@ExcelField(value = "创建时间", writeConverter = TimeConverter.class)
|
||||
private Date createTime;
|
||||
|
||||
private transient String createTimeFrom;
|
||||
private transient String createTimeTo;
|
||||
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
package cc.mrbird.febs.job.domain;
|
||||
|
||||
|
||||
import cc.mrbird.febs.common.converter.TimeConverter;
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.wuwenze.poi.annotation.Excel;
|
||||
import com.wuwenze.poi.annotation.ExcelField;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
@Data
|
||||
@TableName("t_job_log")
|
||||
@Excel("调度日志信息表")
|
||||
public class JobLog implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -7114915445674333148L;
|
||||
// 任务执行成功
|
||||
public static final String JOB_SUCCESS = "0";
|
||||
// 任务执行失败
|
||||
public static final String JOB_FAIL = "1";
|
||||
|
||||
@TableId(value = "LOG_ID", type = IdType.AUTO)
|
||||
private Long logId;
|
||||
|
||||
private Long jobId;
|
||||
|
||||
@ExcelField(value = "Bean名称")
|
||||
private String beanName;
|
||||
|
||||
@ExcelField(value = "方法名称")
|
||||
private String methodName;
|
||||
|
||||
@ExcelField(value = "方法参数")
|
||||
private String params;
|
||||
|
||||
@ExcelField(value = "状态", writeConverterExp = "0=成功,1=失败")
|
||||
private String status;
|
||||
|
||||
@ExcelField(value = "异常信息")
|
||||
private String error;
|
||||
|
||||
@ExcelField(value = "耗时(毫秒)")
|
||||
private Long times;
|
||||
|
||||
@ExcelField(value = "执行时间", writeConverter = TimeConverter.class)
|
||||
private Date createTime;
|
||||
|
||||
private transient String createTimeFrom;
|
||||
private transient String createTimeTo;
|
||||
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
package cc.mrbird.febs.job.service;
|
||||
|
||||
import cc.mrbird.febs.common.domain.QueryRequest;
|
||||
import cc.mrbird.febs.job.domain.JobLog;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
|
||||
public interface JobLogService extends IService<JobLog> {
|
||||
|
||||
IPage<JobLog> findJobLogs(QueryRequest request, JobLog jobLog);
|
||||
|
||||
void saveJobLog(JobLog log);
|
||||
|
||||
void deleteJobLogs(String[] jobLogIds);
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
package cc.mrbird.febs.job.service;
|
||||
|
||||
import cc.mrbird.febs.common.domain.QueryRequest;
|
||||
import cc.mrbird.febs.job.domain.Job;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
|
||||
public interface JobService extends IService<Job> {
|
||||
|
||||
Job findJob(Long jobId);
|
||||
|
||||
IPage<Job> findJobs(QueryRequest request, Job job);
|
||||
|
||||
void createJob(Job job);
|
||||
|
||||
void updateJob(Job job);
|
||||
|
||||
void deleteJobs(String[] jobIds);
|
||||
|
||||
int updateBatch(String jobIds, String status);
|
||||
|
||||
void run(String jobIds);
|
||||
|
||||
void pause(String jobIds);
|
||||
|
||||
void resume(String jobIds);
|
||||
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
package cc.mrbird.febs.job.service.impl;
|
||||
|
||||
import cc.mrbird.febs.common.domain.FebsConstant;
|
||||
import cc.mrbird.febs.common.domain.QueryRequest;
|
||||
import cc.mrbird.febs.common.utils.SortUtil;
|
||||
import cc.mrbird.febs.job.dao.JobLogMapper;
|
||||
import cc.mrbird.febs.job.domain.JobLog;
|
||||
import cc.mrbird.febs.job.service.JobLogService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Service("JobLogService")
|
||||
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
|
||||
public class JobLogServiceImpl extends ServiceImpl<JobLogMapper, JobLog> implements JobLogService {
|
||||
|
||||
@Override
|
||||
public IPage<JobLog> findJobLogs(QueryRequest request, JobLog jobLog) {
|
||||
try {
|
||||
LambdaQueryWrapper<JobLog> queryWrapper = new LambdaQueryWrapper<>();
|
||||
|
||||
if (StringUtils.isNotBlank(jobLog.getBeanName())) {
|
||||
queryWrapper.eq(JobLog::getBeanName, jobLog.getBeanName());
|
||||
}
|
||||
if (StringUtils.isNotBlank(jobLog.getMethodName())) {
|
||||
queryWrapper.eq(JobLog::getMethodName, jobLog.getMethodName());
|
||||
}
|
||||
if (StringUtils.isNotBlank(jobLog.getParams())) {
|
||||
queryWrapper.like(JobLog::getParams, jobLog.getParams());
|
||||
}
|
||||
if (StringUtils.isNotBlank(jobLog.getStatus())) {
|
||||
queryWrapper.eq(JobLog::getStatus, jobLog.getStatus());
|
||||
}
|
||||
if (StringUtils.isNotBlank(jobLog.getCreateTimeFrom()) && StringUtils.isNotBlank(jobLog.getCreateTimeTo())) {
|
||||
queryWrapper
|
||||
.ge(JobLog::getCreateTime, jobLog.getCreateTimeFrom())
|
||||
.le(JobLog::getCreateTime, jobLog.getCreateTimeTo());
|
||||
}
|
||||
Page<JobLog> page = new Page<>(request.getPageNum(), request.getPageSize());
|
||||
SortUtil.handlePageSort(request, page, "createTime", FebsConstant.ORDER_DESC, true);
|
||||
return this.page(page, queryWrapper);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("获取调度日志信息失败", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void saveJobLog(JobLog log) {
|
||||
this.save(log);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void deleteJobLogs(String[] jobLogIds) {
|
||||
List<String> list = Arrays.asList(jobLogIds);
|
||||
this.baseMapper.deleteBatchIds(list);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,150 +0,0 @@
|
||||
package cc.mrbird.febs.job.service.impl;
|
||||
|
||||
import cc.mrbird.febs.common.domain.FebsConstant;
|
||||
import cc.mrbird.febs.common.domain.QueryRequest;
|
||||
import cc.mrbird.febs.common.utils.SortUtil;
|
||||
import cc.mrbird.febs.job.dao.JobMapper;
|
||||
import cc.mrbird.febs.job.domain.Job;
|
||||
import cc.mrbird.febs.job.service.JobService;
|
||||
import cc.mrbird.febs.job.util.ScheduleUtils;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringPool;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.quartz.CronTrigger;
|
||||
import org.quartz.Scheduler;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
@Service("JobService")
|
||||
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
|
||||
public class JobServiceImpl extends ServiceImpl<JobMapper, Job> implements JobService {
|
||||
|
||||
@Autowired
|
||||
private Scheduler scheduler;
|
||||
|
||||
|
||||
/**
|
||||
* 项目启动时,初始化定时器
|
||||
*/
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
List<Job> scheduleJobList = this.baseMapper.queryList();
|
||||
// 如果不存在,则创建
|
||||
scheduleJobList.forEach(scheduleJob -> {
|
||||
CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId());
|
||||
if (cronTrigger == null) {
|
||||
ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
|
||||
} else {
|
||||
ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Job findJob(Long jobId) {
|
||||
return this.getById(jobId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<Job> findJobs(QueryRequest request, Job job) {
|
||||
try {
|
||||
LambdaQueryWrapper<Job> queryWrapper = new LambdaQueryWrapper<>();
|
||||
|
||||
if (StringUtils.isNotBlank(job.getBeanName())) {
|
||||
queryWrapper.eq(Job::getBeanName, job.getBeanName());
|
||||
}
|
||||
if (StringUtils.isNotBlank(job.getMethodName())) {
|
||||
queryWrapper.eq(Job::getMethodName, job.getMethodName());
|
||||
}
|
||||
if (StringUtils.isNotBlank(job.getParams())) {
|
||||
queryWrapper.like(Job::getParams, job.getParams());
|
||||
}
|
||||
if (StringUtils.isNotBlank(job.getRemark())) {
|
||||
queryWrapper.like(Job::getRemark, job.getRemark());
|
||||
}
|
||||
if (StringUtils.isNotBlank(job.getStatus())) {
|
||||
queryWrapper.eq(Job::getStatus, job.getStatus());
|
||||
}
|
||||
|
||||
if (StringUtils.isNotBlank(job.getCreateTimeFrom()) && StringUtils.isNotBlank(job.getCreateTimeTo())) {
|
||||
queryWrapper
|
||||
.ge(Job::getCreateTime, job.getCreateTimeFrom())
|
||||
.le(Job::getCreateTime, job.getCreateTimeTo());
|
||||
}
|
||||
Page<Job> page = new Page<>(request.getPageNum(), request.getPageSize());
|
||||
SortUtil.handlePageSort(request, page, "createTime", FebsConstant.ORDER_DESC, true);
|
||||
return this.page(page, queryWrapper);
|
||||
} catch (Exception e) {
|
||||
log.error("获取任务失败", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void createJob(Job job) {
|
||||
job.setCreateTime(new Date());
|
||||
job.setStatus(Job.ScheduleStatus.PAUSE.getValue());
|
||||
this.save(job);
|
||||
ScheduleUtils.createScheduleJob(scheduler, job);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void updateJob(Job job) {
|
||||
ScheduleUtils.updateScheduleJob(scheduler, job);
|
||||
this.baseMapper.updateById(job);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void deleteJobs(String[] jobIds) {
|
||||
List<String> list = Arrays.asList(jobIds);
|
||||
list.forEach(jobId -> ScheduleUtils.deleteScheduleJob(scheduler, Long.valueOf(jobId)));
|
||||
this.baseMapper.deleteBatchIds(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public int updateBatch(String jobIds, String status) {
|
||||
List<String> list = Arrays.asList(jobIds.split(StringPool.COMMA));
|
||||
Job job = new Job();
|
||||
job.setStatus(status);
|
||||
return this.baseMapper.update(job, new LambdaQueryWrapper<Job>().in(Job::getJobId, list));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void run(String jobIds) {
|
||||
String[] list = jobIds.split(StringPool.COMMA);
|
||||
Arrays.stream(list).forEach(jobId -> ScheduleUtils.run(scheduler, this.findJob(Long.valueOf(jobId))));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void pause(String jobIds) {
|
||||
String[] list = jobIds.split(StringPool.COMMA);
|
||||
Arrays.stream(list).forEach(jobId -> ScheduleUtils.pauseJob(scheduler, Long.valueOf(jobId)));
|
||||
this.updateBatch(jobIds, Job.ScheduleStatus.PAUSE.getValue());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void resume(String jobIds) {
|
||||
String[] list = jobIds.split(StringPool.COMMA);
|
||||
Arrays.stream(list).forEach(jobId -> ScheduleUtils.resumeJob(scheduler, Long.valueOf(jobId)));
|
||||
this.updateBatch(jobIds, Job.ScheduleStatus.NORMAL.getValue());
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package cc.mrbird.febs.job.task;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
public class TestTask {
|
||||
|
||||
public void test(String params) {
|
||||
log.info("我是带参数的test方法,正在被执行,参数为:{}" , params);
|
||||
}
|
||||
public void test1() {
|
||||
log.info("我是不带参数的test1方法,正在被执行");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
package cc.mrbird.febs.job.util;
|
||||
|
||||
import cc.mrbird.febs.common.utils.SpringContextUtil;
|
||||
import cc.mrbird.febs.job.domain.Job;
|
||||
import cc.mrbird.febs.job.domain.JobLog;
|
||||
import cc.mrbird.febs.job.service.JobLogService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.quartz.JobExecutionContext;
|
||||
import org.springframework.scheduling.quartz.QuartzJobBean;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
/**
|
||||
* 定时任务
|
||||
*/
|
||||
@Slf4j
|
||||
public class ScheduleJob extends QuartzJobBean {
|
||||
|
||||
private ExecutorService service = Executors.newSingleThreadExecutor();
|
||||
|
||||
@Override
|
||||
protected void executeInternal(JobExecutionContext context) {
|
||||
Job scheduleJob = (Job) context.getMergedJobDataMap().get(Job.JOB_PARAM_KEY);
|
||||
|
||||
// 获取spring bean
|
||||
JobLogService scheduleJobLogService = SpringContextUtil.getBean(JobLogService.class);
|
||||
|
||||
JobLog jobLog = new JobLog();
|
||||
jobLog.setJobId(scheduleJob.getJobId());
|
||||
jobLog.setBeanName(scheduleJob.getBeanName());
|
||||
jobLog.setMethodName(scheduleJob.getMethodName());
|
||||
jobLog.setParams(scheduleJob.getParams());
|
||||
jobLog.setCreateTime(new Date());
|
||||
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
try {
|
||||
// 执行任务
|
||||
log.info("任务准备执行,任务ID:{}", scheduleJob.getJobId());
|
||||
ScheduleRunnable task = new ScheduleRunnable(scheduleJob.getBeanName(), scheduleJob.getMethodName(),
|
||||
scheduleJob.getParams());
|
||||
Future<?> future = service.submit(task);
|
||||
future.get();
|
||||
long times = System.currentTimeMillis() - startTime;
|
||||
jobLog.setTimes(times);
|
||||
// 任务状态 0:成功 1:失败
|
||||
jobLog.setStatus(JobLog.JOB_SUCCESS);
|
||||
|
||||
log.info("任务执行完毕,任务ID:{} 总共耗时:{} 毫秒", scheduleJob.getJobId(), times);
|
||||
} catch (Exception e) {
|
||||
log.error("任务执行失败,任务ID:" + scheduleJob.getJobId(), e);
|
||||
long times = System.currentTimeMillis() - startTime;
|
||||
jobLog.setTimes(times);
|
||||
// 任务状态 0:成功 1:失败
|
||||
jobLog.setStatus(JobLog.JOB_FAIL);
|
||||
jobLog.setError(StringUtils.substring(e.toString(), 0, 2000));
|
||||
} finally {
|
||||
scheduleJobLogService.saveJobLog(jobLog);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
package cc.mrbird.febs.job.util;
|
||||
|
||||
import cc.mrbird.febs.common.utils.SpringContextUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
/**
|
||||
* 执行定时任务
|
||||
*/
|
||||
@Slf4j
|
||||
public class ScheduleRunnable implements Runnable {
|
||||
|
||||
private Object target;
|
||||
private Method method;
|
||||
private String params;
|
||||
|
||||
ScheduleRunnable(String beanName, String methodName, String params) throws NoSuchMethodException, SecurityException {
|
||||
this.target = SpringContextUtil.getBean(beanName);
|
||||
this.params = params;
|
||||
|
||||
if (StringUtils.isNotBlank(params)) {
|
||||
this.method = target.getClass().getDeclaredMethod(methodName, String.class);
|
||||
} else {
|
||||
this.method = target.getClass().getDeclaredMethod(methodName);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
ReflectionUtils.makeAccessible(method);
|
||||
if (StringUtils.isNotBlank(params)) {
|
||||
method.invoke(target, params);
|
||||
} else {
|
||||
method.invoke(target);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("执行定时任务失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,157 +0,0 @@
|
||||
package cc.mrbird.febs.job.util;
|
||||
|
||||
import cc.mrbird.febs.job.domain.Job;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.quartz.*;
|
||||
|
||||
/**
|
||||
* 定时任务工具类
|
||||
*/
|
||||
@Slf4j
|
||||
public class ScheduleUtils {
|
||||
|
||||
protected ScheduleUtils() {
|
||||
|
||||
}
|
||||
|
||||
private static final String JOB_NAME_PREFIX = "TASK_";
|
||||
|
||||
/**
|
||||
* 获取触发器key
|
||||
*/
|
||||
private static TriggerKey getTriggerKey(Long jobId) {
|
||||
return TriggerKey.triggerKey(JOB_NAME_PREFIX + jobId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取jobKey
|
||||
*/
|
||||
private static JobKey getJobKey(Long jobId) {
|
||||
return JobKey.jobKey(JOB_NAME_PREFIX + jobId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取表达式触发器
|
||||
*/
|
||||
public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
|
||||
try {
|
||||
return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
|
||||
} catch (SchedulerException e) {
|
||||
log.error("获取Cron表达式失败", e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建定时任务
|
||||
*/
|
||||
public static void createScheduleJob(Scheduler scheduler, Job scheduleJob) {
|
||||
try {
|
||||
// 构建job信息
|
||||
JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getJobId()))
|
||||
.build();
|
||||
|
||||
// 表达式调度构建器
|
||||
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
|
||||
.withMisfireHandlingInstructionDoNothing();
|
||||
|
||||
// 按新的cronExpression表达式构建一个新的trigger
|
||||
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId()))
|
||||
.withSchedule(scheduleBuilder).build();
|
||||
|
||||
// 放入参数,运行时的方法可以获取
|
||||
jobDetail.getJobDataMap().put(Job.JOB_PARAM_KEY, scheduleJob);
|
||||
|
||||
scheduler.scheduleJob(jobDetail, trigger);
|
||||
|
||||
// 暂停任务
|
||||
if (scheduleJob.getStatus().equals(Job.ScheduleStatus.PAUSE.getValue())) {
|
||||
pauseJob(scheduler, scheduleJob.getJobId());
|
||||
}
|
||||
} catch (SchedulerException e) {
|
||||
log.error("创建定时任务失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新定时任务
|
||||
*/
|
||||
public static void updateScheduleJob(Scheduler scheduler, Job scheduleJob) {
|
||||
try {
|
||||
TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId());
|
||||
|
||||
// 表达式调度构建器
|
||||
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
|
||||
.withMisfireHandlingInstructionDoNothing();
|
||||
|
||||
CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId());
|
||||
|
||||
if (trigger == null) {
|
||||
throw new SchedulerException("获取Cron表达式失败");
|
||||
} else {
|
||||
// 按新的cronExpression表达式重新构建trigger
|
||||
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
|
||||
// 参数
|
||||
trigger.getJobDataMap().put(Job.JOB_PARAM_KEY, scheduleJob);
|
||||
}
|
||||
|
||||
scheduler.rescheduleJob(triggerKey, trigger);
|
||||
|
||||
// 暂停任务
|
||||
if (scheduleJob.getStatus().equals(Job.ScheduleStatus.PAUSE.getValue())) {
|
||||
pauseJob(scheduler, scheduleJob.getJobId());
|
||||
}
|
||||
|
||||
} catch (SchedulerException e) {
|
||||
log.error("更新定时任务失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 立即执行任务
|
||||
*/
|
||||
public static void run(Scheduler scheduler, Job scheduleJob) {
|
||||
try {
|
||||
// 参数
|
||||
JobDataMap dataMap = new JobDataMap();
|
||||
dataMap.put(Job.JOB_PARAM_KEY, scheduleJob);
|
||||
|
||||
scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap);
|
||||
} catch (SchedulerException e) {
|
||||
log.error("执行定时任务失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 暂停任务
|
||||
*/
|
||||
public static void pauseJob(Scheduler scheduler, Long jobId) {
|
||||
try {
|
||||
scheduler.pauseJob(getJobKey(jobId));
|
||||
} catch (SchedulerException e) {
|
||||
log.error("暂停定时任务失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 恢复任务
|
||||
*/
|
||||
public static void resumeJob(Scheduler scheduler, Long jobId) {
|
||||
try {
|
||||
scheduler.resumeJob(getJobKey(jobId));
|
||||
} catch (SchedulerException e) {
|
||||
log.error("恢复定时任务失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除定时任务
|
||||
*/
|
||||
public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
|
||||
try {
|
||||
scheduler.deleteJob(getJobKey(jobId));
|
||||
} catch (SchedulerException e) {
|
||||
log.error("删除定时任务失败", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
37
backend/src/main/resources/mapper/cos/ScoreInfoMapper.xml
Normal file
37
backend/src/main/resources/mapper/cos/ScoreInfoMapper.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<?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="cc.mrbird.febs.cos.dao.ScoreInfoMapper">
|
||||
|
||||
<!-- 分页获取安全评分信息 -->
|
||||
<select id="queryScorePage" resultType="java.util.LinkedHashMap">
|
||||
select
|
||||
si.id,
|
||||
si.staff_code,
|
||||
si.work_score,
|
||||
si.appraiser,
|
||||
si.remark,
|
||||
si.create_date,
|
||||
si.safe_id,
|
||||
|
||||
ai.name,
|
||||
ai.sex,
|
||||
ai.phone,
|
||||
se.title
|
||||
from
|
||||
score_info si
|
||||
left join archives_info ai on
|
||||
(ai.code = si.staff_code)
|
||||
left join safe_education se on
|
||||
(se.id = si.safe_id)
|
||||
where
|
||||
1 = 1
|
||||
<if test="scoreInfo.staffName != null and scoreInfo.staffName != ''">
|
||||
AND ai.name LIKE CONCAT('%',#{scoreInfo.staffName},'%')
|
||||
</if>
|
||||
<if test="scoreInfo.title != null and scoreInfo.title != ''">
|
||||
AND se.title LIKE CONCAT('%',#{scoreInfo.title},'%')
|
||||
</if>
|
||||
order by
|
||||
si.create_date desc
|
||||
</select>
|
||||
</mapper>
|
||||
@@ -1,30 +0,0 @@
|
||||
<?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="cc.mrbird.febs.job.dao.JobMapper">
|
||||
<resultMap id="BaseResultMap" type="cc.mrbird.febs.job.domain.Job">
|
||||
<!--
|
||||
WARNING - @mbg.generated
|
||||
-->
|
||||
<id column="JOB_ID" jdbcType="DECIMAL" property="jobId"/>
|
||||
<result column="BEAN_NAME" jdbcType="VARCHAR" property="beanName"/>
|
||||
<result column="METHOD_NAME" jdbcType="VARCHAR" property="methodName"/>
|
||||
<result column="PARAMS" jdbcType="VARCHAR" property="params"/>
|
||||
<result column="CRON_EXPRESSION" jdbcType="VARCHAR" property="cronExpression"/>
|
||||
<result column="STATUS" jdbcType="CHAR" property="status"/>
|
||||
<result column="REMARK" jdbcType="VARCHAR" property="remark"/>
|
||||
<result column="CREATE_TIME" jdbcType="TIMESTAMP" property="createTime"/>
|
||||
</resultMap>
|
||||
|
||||
<select id="queryList" resultType="job">
|
||||
select job_id jobId,
|
||||
bean_name beanName,
|
||||
method_name methodName,
|
||||
params,
|
||||
cron_expression cronExpression,
|
||||
status,
|
||||
remark,
|
||||
create_time createTime
|
||||
from t_job
|
||||
order by job_id
|
||||
</select>
|
||||
</mapper>
|
||||
6
frontend/.idea/vcs.xml
generated
Normal file
6
frontend/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
157
frontend/.idea/workspace.xml
generated
157
frontend/.idea/workspace.xml
generated
@@ -5,86 +5,30 @@
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="8d94e285-d1b0-4ce5-8593-dca4515a0d01" name="Default Changelist" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/common/config/MyWebMvcConfigurerAdapter.java" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/common/config/MyWebMvcConfigurerAdapter.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/cos/controller/FileController.java" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/cos/controller/FileController.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/resources/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/src/main/resources/application.yml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/application.yml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ArchivesInfoController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ArchivesInfoController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/BulletinInfoController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/BulletinInfoController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ConsumableTypeController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ConsumableTypeController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/GoodsBelongController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/GoodsBelongController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/GoodsRequestController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/GoodsRequestController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/RurchaseRequestController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/RurchaseRequestController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafeEducationController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafeEducationController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafetyInspectionController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafetyInspectionController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafetyTaskController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SafetyTaskController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ScheduleActualController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/ScheduleActualController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SchedulePlanController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/SchedulePlanController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/StationInfoController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/StationInfoController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/StockInfoController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/StockInfoController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/WorkEvaluationController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/WorkEvaluationController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/WorkInfoController.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/controller/WorkInfoController.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/ArchivesInfo.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/ArchivesInfo.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafeEducation.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafeEducation.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafetyInspection.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafetyInspection.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafetyTask.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SafetyTask.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/ScheduleActual.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/ScheduleActual.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SchedulePlan.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/SchedulePlan.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/StationInfo.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/StationInfo.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/WorkEvaluation.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/WorkEvaluation.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/WorkInfo.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/entity/WorkInfo.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/ArchivesInfoMapper.class" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/ConsumableTypeMapper.class" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/SafeEducationMapper.class" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/SafetyInspectionMapper.class" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/SafetyTaskMapper.class" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/ScheduleActualMapper.class" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/SchedulePlanMapper.class" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/StationInfoMapper.class" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/WorkEvaluationMapper.class" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/WorkInfoMapper.class" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/ArchivesInfoMapper.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/ConsumableTypeMapper.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/SafeEducationMapper.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/SafetyInspectionMapper.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/SafetyTaskMapper.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/ScheduleActualMapper.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/SchedulePlanMapper.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/StationInfoMapper.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/WorkEvaluationMapper.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/mapper/xml/WorkInfoMapper.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IArchivesInfoService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IArchivesInfoService.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafeEducationService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafeEducationService.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafetyInspectionService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafetyInspectionService.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafetyTaskService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISafetyTaskService.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IScheduleActualService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IScheduleActualService.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISchedulePlanService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/ISchedulePlanService.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IStationInfoService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IStationInfoService.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IWorkEvaluationService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IWorkEvaluationService.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IWorkInfoService.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/IWorkInfoService.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/ArchivesInfoServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/ArchivesInfoServiceImpl.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafeEducationServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafeEducationServiceImpl.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafetyInspectionServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafetyInspectionServiceImpl.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafetyTaskServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SafetyTaskServiceImpl.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/ScheduleActualServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/ScheduleActualServiceImpl.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SchedulePlanServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/SchedulePlanServiceImpl.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/StationInfoServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/StationInfoServiceImpl.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/WorkEvaluationServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/WorkEvaluationServiceImpl.class" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/WorkInfoServiceImpl.class" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/target/classes/cc/mrbird/febs/cos/service/impl/WorkInfoServiceImpl.class" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/views/manage/score/Score.vue" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/views/manage/score/ScoreAdd.vue" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/views/manage/score/ScoreEdit.vue" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/views/manage/weather/Weather.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/febs_shiro_jwt.iml" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/febs_shiro_jwt.iml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/common/domain/FebsConstant.java" beforeDir="false" afterPath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/common/domain/FebsConstant.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/config/ScheduleConfig.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/controller/JobController.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/controller/JobLogController.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/dao/JobLogMapper.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/dao/JobMapper.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/domain/Job.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/domain/JobLog.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/service/JobLogService.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/service/JobService.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/service/impl/JobLogServiceImpl.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/service/impl/JobServiceImpl.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/task/TestTask.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/util/ScheduleJob.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/util/ScheduleRunnable.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/java/cc/mrbird/febs/job/util/ScheduleUtils.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/../backend/src/main/resources/mapper/job/JobMapper.xml" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/index.html" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/store/modules/setting.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/store/modules/setting.js" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/views/admin/bulletin/Bulletin.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/bulletin/Bulletin.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/views/admin/bulletin/BulletinAdd.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/bulletin/BulletinAdd.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/views/admin/bulletin/BulletinEdit.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/bulletin/BulletinEdit.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/views/login/Login.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/login/Login.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/views/login/Regist.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/login/Regist.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/views/manage/archives/Archives.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/archives/Archives.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/views/manage/education/Education.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/education/Education.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/views/manage/evaluate/Evaluate.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/evaluate/Evaluate.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/views/manage/plan/Plan.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/plan/Plan.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/views/manage/work/Work.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/views/manage/work/Work.vue" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/static/img/river-6968614.png" beforeDir="false" afterPath="$PROJECT_DIR$/static/img/river-6968614.png" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
@@ -102,7 +46,7 @@
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
|
||||
</component>
|
||||
<component name="GitToolBoxStore">
|
||||
<option name="projectConfigVersion" value="2" />
|
||||
<option name="projectConfigVersion" value="5" />
|
||||
</component>
|
||||
<component name="MarkdownSettingsMigration">
|
||||
<option name="stateVersion" value="1" />
|
||||
@@ -115,7 +59,7 @@
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"WebServerToolWindowFactoryState": "false",
|
||||
"last_opened_file_path": "G:/Project/工地安全预警管理系统的设计与实现/construction_cos/frontend",
|
||||
"last_opened_file_path": "G:/Project/工地安全预警管理系统的设计与实现/construction_cos/frontend/src/views/manage/score",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
@@ -126,11 +70,11 @@
|
||||
}]]></component>
|
||||
<component name="RecentsManager">
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="E:\Project\实验室耗材管理系统\frontend\src\utils" />
|
||||
<recent name="E:\Project\实验室耗材管理系统\frontend\src\views\admin\goods" />
|
||||
<recent name="E:\Project\实验室耗材管理系统\frontend\src\views\admin\stockout" />
|
||||
<recent name="E:\Project\实验室耗材管理系统\frontend\src\views\admin\stock" />
|
||||
<recent name="E:\Project\实验室耗材管理系统\frontend\src\views\admin\stockput" />
|
||||
<recent name="G:\Project\工地安全预警管理系统的设计与实现\construction_cos\frontend\src\views\manage\score" />
|
||||
<recent name="G:\Project\工地安全预警管理系统的设计与实现\construction_cos\frontend\src\views\manage\weather" />
|
||||
<recent name="G:\Project\工地安全预警管理系统的设计与实现\construction_cos\frontend\src\views\admin\enterprise" />
|
||||
<recent name="G:\Project\工地安全预警管理系统的设计与实现\construction_cos\frontend\src\views\stu" />
|
||||
<recent name="G:\Project\工地安全预警管理系统的设计与实现\construction_cos\frontend\src\utils" />
|
||||
</key>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
@@ -177,10 +121,51 @@
|
||||
<workItem from="1673073102827" duration="46000" />
|
||||
<workItem from="1673102363106" duration="182000" />
|
||||
<workItem from="1694441740175" duration="2692000" />
|
||||
<workItem from="1694526833351" duration="980000" />
|
||||
<workItem from="1694616755580" duration="1706000" />
|
||||
<workItem from="1694697431973" duration="148000" />
|
||||
<workItem from="1694701907952" duration="1196000" />
|
||||
<workItem from="1695048456863" duration="1316000" />
|
||||
<workItem from="1695216555665" duration="3547000" />
|
||||
<workItem from="1696594635203" duration="943000" />
|
||||
<workItem from="1696856715192" duration="3153000" />
|
||||
<workItem from="1697031546399" duration="21000" />
|
||||
<workItem from="1697032604766" duration="874000" />
|
||||
<workItem from="1697034274913" duration="2301000" />
|
||||
<workItem from="1697118448777" duration="3974000" />
|
||||
<workItem from="1697199871997" duration="2676000" />
|
||||
<workItem from="1701738726338" duration="1108000" />
|
||||
<workItem from="1701750952531" duration="50000" />
|
||||
<workItem from="1701825248558" duration="2988000" />
|
||||
<workItem from="1701923140722" duration="101000" />
|
||||
<workItem from="1701947544083" duration="3081000" />
|
||||
<workItem from="1704718807955" duration="989000" />
|
||||
<workItem from="1708690623863" duration="364000" />
|
||||
<workItem from="1708747912430" duration="2214000" />
|
||||
<workItem from="1708775911626" duration="74000" />
|
||||
<workItem from="1708776751334" duration="3523000" />
|
||||
<workItem from="1708870938604" duration="17000" />
|
||||
<workItem from="1709428199235" duration="4462000" />
|
||||
<workItem from="1709534631706" duration="1255000" />
|
||||
<workItem from="1709606201814" duration="1357000" />
|
||||
<workItem from="1709698384159" duration="124000" />
|
||||
<workItem from="1712758780004" duration="133000" />
|
||||
<workItem from="1743506599927" duration="5198000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
<option name="version" value="3" />
|
||||
</component>
|
||||
<component name="Vcs.Log.Tabs.Properties">
|
||||
<option name="TAB_STATES">
|
||||
<map>
|
||||
<entry key="MAIN">
|
||||
<value>
|
||||
<State />
|
||||
</value>
|
||||
</entry>
|
||||
</map>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
||||
346
frontend/src/views/manage/score/Score.vue
Normal file
346
frontend/src/views/manage/score/Score.vue
Normal file
@@ -0,0 +1,346 @@
|
||||
<template>
|
||||
<a-card :bordered="false" class="card-area">
|
||||
<div :class="advanced ? 'search' : null">
|
||||
<!-- 搜索区域 -->
|
||||
<a-form layout="horizontal">
|
||||
<a-row :gutter="15">
|
||||
<div :class="advanced ? null: 'fold'">
|
||||
<a-col :md="6" :sm="24">
|
||||
<a-form-item
|
||||
label="员工姓名"
|
||||
:labelCol="{span: 4}"
|
||||
:wrapperCol="{span: 18, offset: 2}">
|
||||
<a-input v-model="queryParams.staffName"/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :md="6" :sm="24">
|
||||
<a-form-item
|
||||
label="教育主题"
|
||||
:labelCol="{span: 4}"
|
||||
:wrapperCol="{span: 18, offset: 2}">
|
||||
<a-input v-model="queryParams.title"/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
</div>
|
||||
<span style="float: right; margin-top: 3px;">
|
||||
<a-button type="primary" @click="search">查询</a-button>
|
||||
<a-button style="margin-left: 8px" @click="reset">重置</a-button>
|
||||
</span>
|
||||
</a-row>
|
||||
</a-form>
|
||||
</div>
|
||||
<div>
|
||||
<div class="operator">
|
||||
<a-button type="primary" ghost @click="add">新增</a-button>
|
||||
<a-button @click="batchDelete">删除</a-button>
|
||||
</div>
|
||||
<!-- 表格区域 -->
|
||||
<a-table ref="TableInfo"
|
||||
:columns="columns"
|
||||
:rowKey="record => record.id"
|
||||
:dataSource="dataSource"
|
||||
:pagination="pagination"
|
||||
:loading="loading"
|
||||
:rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
|
||||
:scroll="{ x: 900 }"
|
||||
@change="handleTableChange">
|
||||
<template slot="titleShow" slot-scope="text, record">
|
||||
<template>
|
||||
<a-badge status="processing"/>
|
||||
<a-tooltip>
|
||||
<template slot="title">
|
||||
{{ record.title }}
|
||||
</template>
|
||||
{{ record.title.slice(0, 8) }} ...
|
||||
</a-tooltip>
|
||||
</template>
|
||||
</template>
|
||||
<template slot="contentShow" slot-scope="text, record">
|
||||
<template>
|
||||
<a-tooltip>
|
||||
<template slot="title">
|
||||
{{ record.content }}
|
||||
</template>
|
||||
{{ record.content.slice(0, 30) }} ...
|
||||
</a-tooltip>
|
||||
</template>
|
||||
</template>
|
||||
<template slot="operation" slot-scope="text, record">
|
||||
<a-icon type="setting" theme="twoTone" twoToneColor="#4a9ff5" @click="edit(record)" title="修 改" style="margin-right: 10px"></a-icon>
|
||||
<!-- <a-icon type="bulb" @click="view(record)" title="详 情"></a-icon>-->
|
||||
</template>
|
||||
</a-table>
|
||||
</div>
|
||||
<evaluate-add
|
||||
v-if="evaluateAdd.visiable"
|
||||
@close="handleevaluateAddClose"
|
||||
@success="handleevaluateAddSuccess"
|
||||
:evaluateAddVisiable="evaluateAdd.visiable">
|
||||
</evaluate-add>
|
||||
<evaluate-edit
|
||||
ref="evaluateEdit"
|
||||
@close="handleevaluateEditClose"
|
||||
@success="handleevaluateEditSuccess"
|
||||
:evaluateEditVisiable="evaluateEdit.visiable">
|
||||
</evaluate-edit>
|
||||
</a-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import RangeDate from '@/components/datetime/RangeDate'
|
||||
import evaluateAdd from './ScoreAdd.vue'
|
||||
import evaluateEdit from './ScoreEdit.vue'
|
||||
import {mapState} from 'vuex'
|
||||
import moment from 'moment'
|
||||
moment.locale('zh-cn')
|
||||
|
||||
export default {
|
||||
name: 'evaluate',
|
||||
components: {evaluateAdd, evaluateEdit, RangeDate},
|
||||
data () {
|
||||
return {
|
||||
advanced: false,
|
||||
evaluateAdd: {
|
||||
visiable: false
|
||||
},
|
||||
evaluateEdit: {
|
||||
visiable: false
|
||||
},
|
||||
evaluateView: {
|
||||
visiable: false,
|
||||
data: null
|
||||
},
|
||||
queryParams: {},
|
||||
filteredInfo: null,
|
||||
sortedInfo: null,
|
||||
paginationInfo: null,
|
||||
dataSource: [],
|
||||
selectedRowKeys: [],
|
||||
loading: false,
|
||||
pagination: {
|
||||
pageSizeOptions: ['10', '20', '30', '40', '100'],
|
||||
defaultCurrent: 1,
|
||||
defaultPageSize: 10,
|
||||
showQuickJumper: true,
|
||||
showSizeChanger: true,
|
||||
showTotal: (total, range) => `显示 ${range[0]} ~ ${range[1]} 条记录,共 ${total} 条记录`
|
||||
},
|
||||
userList: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
currentUser: state => state.account.user
|
||||
}),
|
||||
columns () {
|
||||
return [{
|
||||
title: '员工编号',
|
||||
dataIndex: 'staffCode',
|
||||
customRender: (text, row, index) => {
|
||||
if (text !== null) {
|
||||
return text
|
||||
} else {
|
||||
return '- -'
|
||||
}
|
||||
}
|
||||
}, {
|
||||
title: '员工姓名',
|
||||
dataIndex: 'name',
|
||||
customRender: (text, row, index) => {
|
||||
if (text !== null) {
|
||||
return text
|
||||
} else {
|
||||
return '- -'
|
||||
}
|
||||
}
|
||||
}, {
|
||||
title: '联系方式',
|
||||
dataIndex: 'phone',
|
||||
customRender: (text, row, index) => {
|
||||
if (text !== null) {
|
||||
return text
|
||||
} else {
|
||||
return '- -'
|
||||
}
|
||||
}
|
||||
}, {
|
||||
title: '安全评分',
|
||||
dataIndex: 'workScore',
|
||||
customRender: (text, row, index) => {
|
||||
if (text !== null) {
|
||||
return text + '分'
|
||||
} else {
|
||||
return '- -'
|
||||
}
|
||||
}
|
||||
}, {
|
||||
title: '安全教育',
|
||||
dataIndex: 'title',
|
||||
customRender: (text, row, index) => {
|
||||
if (text !== null) {
|
||||
return text
|
||||
} else {
|
||||
return '- -'
|
||||
}
|
||||
}
|
||||
}, {
|
||||
title: '评分时间',
|
||||
dataIndex: 'createDate',
|
||||
customRender: (text, row, index) => {
|
||||
if (text !== null) {
|
||||
return text
|
||||
} else {
|
||||
return '- -'
|
||||
}
|
||||
}
|
||||
}, {
|
||||
title: '操作',
|
||||
dataIndex: 'operation',
|
||||
scopedSlots: {customRender: 'operation'}
|
||||
}]
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
this.fetch()
|
||||
},
|
||||
methods: {
|
||||
view (record) {
|
||||
this.evaluateView.data = record
|
||||
this.evaluateView.visiable = true
|
||||
},
|
||||
onSelectChange (selectedRowKeys) {
|
||||
this.selectedRowKeys = selectedRowKeys
|
||||
},
|
||||
toggleAdvanced () {
|
||||
this.advanced = !this.advanced
|
||||
},
|
||||
add () {
|
||||
this.evaluateAdd.visiable = true
|
||||
},
|
||||
handleevaluateAddClose () {
|
||||
this.evaluateAdd.visiable = false
|
||||
},
|
||||
handleevaluateAddSuccess () {
|
||||
this.evaluateAdd.visiable = false
|
||||
this.$message.success('新增评分成功')
|
||||
this.search()
|
||||
},
|
||||
edit (record) {
|
||||
this.$refs.evaluateEdit.setFormValues(record)
|
||||
this.evaluateEdit.visiable = true
|
||||
},
|
||||
handleevaluateEditClose () {
|
||||
this.evaluateEdit.visiable = false
|
||||
},
|
||||
handleevaluateEditSuccess () {
|
||||
this.evaluateEdit.visiable = false
|
||||
this.$message.success('修改评分成功')
|
||||
this.search()
|
||||
},
|
||||
handleDeptChange (value) {
|
||||
this.queryParams.deptId = value || ''
|
||||
},
|
||||
batchDelete () {
|
||||
if (!this.selectedRowKeys.length) {
|
||||
this.$message.warning('请选择需要删除的记录')
|
||||
return
|
||||
}
|
||||
let that = this
|
||||
this.$confirm({
|
||||
title: '确定删除所选中的记录?',
|
||||
content: '当您点击确定按钮后,这些记录将会被彻底删除',
|
||||
centered: true,
|
||||
onOk () {
|
||||
let ids = that.selectedRowKeys.join(',')
|
||||
that.$delete('/cos/evaluate-info/' + ids).then(() => {
|
||||
that.$message.success('删除成功')
|
||||
that.selectedRowKeys = []
|
||||
that.search()
|
||||
})
|
||||
},
|
||||
onCancel () {
|
||||
that.selectedRowKeys = []
|
||||
}
|
||||
})
|
||||
},
|
||||
search () {
|
||||
let {sortedInfo, filteredInfo} = this
|
||||
let sortField, sortOrder
|
||||
// 获取当前列的排序和列的过滤规则
|
||||
if (sortedInfo) {
|
||||
sortField = sortedInfo.field
|
||||
sortOrder = sortedInfo.order
|
||||
}
|
||||
this.fetch({
|
||||
sortField: sortField,
|
||||
sortOrder: sortOrder,
|
||||
...this.queryParams,
|
||||
...filteredInfo
|
||||
})
|
||||
},
|
||||
reset () {
|
||||
// 取消选中
|
||||
this.selectedRowKeys = []
|
||||
// 重置分页
|
||||
this.$refs.TableInfo.pagination.current = this.pagination.defaultCurrent
|
||||
if (this.paginationInfo) {
|
||||
this.paginationInfo.current = this.pagination.defaultCurrent
|
||||
this.paginationInfo.pageSize = this.pagination.defaultPageSize
|
||||
}
|
||||
// 重置列过滤器规则
|
||||
this.filteredInfo = null
|
||||
// 重置列排序规则
|
||||
this.sortedInfo = null
|
||||
// 重置查询参数
|
||||
this.queryParams = {}
|
||||
this.fetch()
|
||||
},
|
||||
handleTableChange (pagination, filters, sorter) {
|
||||
// 将这三个参数赋值给Vue data,用于后续使用
|
||||
this.paginationInfo = pagination
|
||||
this.filteredInfo = filters
|
||||
this.sortedInfo = sorter
|
||||
|
||||
this.fetch({
|
||||
sortField: sorter.field,
|
||||
sortOrder: sorter.order,
|
||||
...this.queryParams,
|
||||
...filters
|
||||
})
|
||||
},
|
||||
fetch (params = {}) {
|
||||
// 显示loading
|
||||
this.loading = true
|
||||
if (this.paginationInfo) {
|
||||
// 如果分页信息不为空,则设置表格当前第几页,每页条数,并设置查询分页参数
|
||||
this.$refs.TableInfo.pagination.current = this.paginationInfo.current
|
||||
this.$refs.TableInfo.pagination.pageSize = this.paginationInfo.pageSize
|
||||
params.size = this.paginationInfo.pageSize
|
||||
params.current = this.paginationInfo.current
|
||||
} else {
|
||||
// 如果分页信息为空,则设置为默认值
|
||||
params.size = this.pagination.defaultPageSize
|
||||
params.current = this.pagination.defaultCurrent
|
||||
}
|
||||
if (!params.sex) {
|
||||
delete params.sex
|
||||
}
|
||||
this.$get('/cos/score-info/page', {
|
||||
...params
|
||||
}).then((r) => {
|
||||
let data = r.data.data
|
||||
const pagination = {...this.pagination}
|
||||
pagination.total = data.total
|
||||
this.dataSource = data.records
|
||||
this.pagination = pagination
|
||||
// 数据加载完毕,关闭loading
|
||||
this.loading = false
|
||||
})
|
||||
}
|
||||
},
|
||||
watch: {}
|
||||
}
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
@import "../../../../static/less/Common";
|
||||
</style>
|
||||
157
frontend/src/views/manage/score/ScoreAdd.vue
Normal file
157
frontend/src/views/manage/score/ScoreAdd.vue
Normal file
@@ -0,0 +1,157 @@
|
||||
<template>
|
||||
<a-modal v-model="show" title="新增评分" @cancel="onClose" :width="800">
|
||||
<template slot="footer">
|
||||
<a-button key="back" @click="onClose">
|
||||
取消
|
||||
</a-button>
|
||||
<a-button key="submit" type="primary" :loading="loading" @click="handleSubmit">
|
||||
提交
|
||||
</a-button>
|
||||
</template>
|
||||
<a-form :form="form" layout="vertical">
|
||||
<a-row :gutter="20">
|
||||
<a-col :span="12">
|
||||
<a-form-item label='选择员工' v-bind="formItemLayout">
|
||||
<a-select allowClear v-decorator="[
|
||||
'staffCode',
|
||||
{ rules: [{ required: true, message: '请输入员工姓名!' }] }
|
||||
]">
|
||||
<a-select-option :value="item.code" v-for="(item, index) in staffList" :key="index">{{ item.name }}</a-select-option>
|
||||
</a-select>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label='选择安全会议' v-bind="formItemLayout">
|
||||
<a-select allowClear v-decorator="[
|
||||
'safeId',
|
||||
{ rules: [{ required: true, message: '请选择安全会议!' }] }
|
||||
]">
|
||||
<a-select-option :value="item.id" v-for="(item, index) in educationList" :key="index">{{ item.title }}</a-select-option>
|
||||
</a-select>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label='工作得分' v-bind="formItemLayout">
|
||||
<a-input v-decorator="[
|
||||
'workScore',
|
||||
{ rules: [{ required: true, message: '请输入工作得分!' }] }
|
||||
]"/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label='备注' v-bind="formItemLayout">
|
||||
<a-input v-decorator="[
|
||||
'remark'
|
||||
]"/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form>
|
||||
</a-modal>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapState} from 'vuex'
|
||||
function getBase64 (file) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const reader = new FileReader()
|
||||
reader.readAsDataURL(file)
|
||||
reader.onload = () => resolve(reader.result)
|
||||
reader.onerror = error => reject(error)
|
||||
})
|
||||
}
|
||||
const formItemLayout = {
|
||||
labelCol: { span: 24 },
|
||||
wrapperCol: { span: 24 }
|
||||
}
|
||||
export default {
|
||||
name: 'evaluateAdd',
|
||||
props: {
|
||||
evaluateAddVisiable: {
|
||||
default: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
currentUser: state => state.account.user
|
||||
}),
|
||||
show: {
|
||||
get: function () {
|
||||
return this.evaluateAddVisiable
|
||||
},
|
||||
set: function () {
|
||||
}
|
||||
}
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
formItemLayout,
|
||||
form: this.$form.createForm(this),
|
||||
loading: false,
|
||||
fileList: [],
|
||||
previewVisible: false,
|
||||
previewImage: '',
|
||||
staffList: [],
|
||||
educationList: [],
|
||||
stationList: []
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
this.getStaff()
|
||||
this.getSafe()
|
||||
},
|
||||
methods: {
|
||||
getSafe () {
|
||||
this.$get('/cos/safe-education/list').then((r) => {
|
||||
this.educationList = r.data.data
|
||||
})
|
||||
},
|
||||
getStaff () {
|
||||
this.$get('/cos/archives-info/list').then((r) => {
|
||||
this.staffList = r.data.data
|
||||
})
|
||||
},
|
||||
handleCancel () {
|
||||
this.previewVisible = false
|
||||
},
|
||||
async handlePreview (file) {
|
||||
if (!file.url && !file.preview) {
|
||||
file.preview = await getBase64(file.originFileObj)
|
||||
}
|
||||
this.previewImage = file.url || file.preview
|
||||
this.previewVisible = true
|
||||
},
|
||||
picHandleChange ({ fileList }) {
|
||||
this.fileList = fileList
|
||||
},
|
||||
reset () {
|
||||
this.loading = false
|
||||
this.form.resetFields()
|
||||
},
|
||||
onClose () {
|
||||
this.reset()
|
||||
this.$emit('close')
|
||||
},
|
||||
handleSubmit () {
|
||||
this.form.validateFields((err, values) => {
|
||||
if (!err) {
|
||||
values.publisher = this.currentUser.userId
|
||||
this.loading = true
|
||||
this.$post('/cos/score-info', {
|
||||
...values
|
||||
}).then((r) => {
|
||||
this.reset()
|
||||
this.$emit('success')
|
||||
}).catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
186
frontend/src/views/manage/score/ScoreEdit.vue
Normal file
186
frontend/src/views/manage/score/ScoreEdit.vue
Normal file
@@ -0,0 +1,186 @@
|
||||
<template>
|
||||
<a-modal v-model="show" title="修改评分" @cancel="onClose" :width="800">
|
||||
<template slot="footer">
|
||||
<a-button key="back" @click="onClose">
|
||||
取消
|
||||
</a-button>
|
||||
<a-button key="submit" type="primary" :loading="loading" @click="handleSubmit">
|
||||
修改
|
||||
</a-button>
|
||||
</template>
|
||||
<a-form :form="form" layout="vertical">
|
||||
<a-row :gutter="20">
|
||||
<a-col :span="12">
|
||||
<a-form-item label='选择员工' v-bind="formItemLayout">
|
||||
<a-select allowClear v-decorator="[
|
||||
'staffCode',
|
||||
{ rules: [{ required: true, message: '请输入员工姓名!' }] }
|
||||
]">
|
||||
<a-select-option :value="item.code" v-for="(item, index) in staffList" :key="index">{{ item.name }}</a-select-option>
|
||||
</a-select>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label='选择安全会议' v-bind="formItemLayout">
|
||||
<a-select allowClear v-decorator="[
|
||||
'safeId',
|
||||
{ rules: [{ required: true, message: '请选择安全会议!' }] }
|
||||
]">
|
||||
<a-select-option :value="item.id" v-for="(item, index) in educationList" :key="index">{{ item.title }}</a-select-option>
|
||||
</a-select>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label='工作得分' v-bind="formItemLayout">
|
||||
<a-input v-decorator="[
|
||||
'workScore',
|
||||
{ rules: [{ required: true, message: '请输入工作得分!' }] }
|
||||
]"/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label='备注' v-bind="formItemLayout">
|
||||
<a-input v-decorator="[
|
||||
'remark'
|
||||
]"/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form>
|
||||
</a-modal>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapState} from 'vuex'
|
||||
function getBase64 (file) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const reader = new FileReader()
|
||||
reader.readAsDataURL(file)
|
||||
reader.onload = () => resolve(reader.result)
|
||||
reader.onerror = error => reject(error)
|
||||
})
|
||||
}
|
||||
const formItemLayout = {
|
||||
labelCol: { span: 24 },
|
||||
wrapperCol: { span: 24 }
|
||||
}
|
||||
export default {
|
||||
name: 'evaluateEdit',
|
||||
props: {
|
||||
evaluateEditVisiable: {
|
||||
default: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
currentUser: state => state.account.user
|
||||
}),
|
||||
show: {
|
||||
get: function () {
|
||||
return this.evaluateEditVisiable
|
||||
},
|
||||
set: function () {
|
||||
}
|
||||
}
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
rowId: null,
|
||||
formItemLayout,
|
||||
form: this.$form.createForm(this),
|
||||
loading: false,
|
||||
fileList: [],
|
||||
previewVisible: false,
|
||||
previewImage: '',
|
||||
staffList: [],
|
||||
stationList: []
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
this.getStaff()
|
||||
},
|
||||
methods: {
|
||||
getStaff () {
|
||||
this.$get('/cos/archives-info/list').then((r) => {
|
||||
this.staffList = r.data.data
|
||||
})
|
||||
},
|
||||
handleCancel () {
|
||||
this.previewVisible = false
|
||||
},
|
||||
async handlePreview (file) {
|
||||
if (!file.url && !file.preview) {
|
||||
file.preview = await getBase64(file.originFileObj)
|
||||
}
|
||||
this.previewImage = file.url || file.preview
|
||||
this.previewVisible = true
|
||||
},
|
||||
picHandleChange ({ fileList }) {
|
||||
this.fileList = fileList
|
||||
},
|
||||
imagesInit (images) {
|
||||
if (images !== null && images !== '') {
|
||||
let imageList = []
|
||||
images.split(',').forEach((image, index) => {
|
||||
imageList.push({uid: index, name: image, status: 'done', url: 'http://127.0.0.1:9527/imagesWeb/' + image})
|
||||
})
|
||||
this.fileList = imageList
|
||||
}
|
||||
},
|
||||
setFormValues ({...evaluate}) {
|
||||
this.rowId = evaluate.id
|
||||
let fields = ['staffCode', 'attendanceScore', 'workScore', 'qualityScore', 'year', 'month', 'appraiser', 'remark', 'safeId']
|
||||
let obj = {}
|
||||
Object.keys(evaluate).forEach((key) => {
|
||||
if (key === 'images') {
|
||||
this.fileList = []
|
||||
this.imagesInit(evaluate['images'])
|
||||
}
|
||||
if (fields.indexOf(key) !== -1) {
|
||||
this.form.getFieldDecorator(key)
|
||||
obj[key] = evaluate[key]
|
||||
}
|
||||
})
|
||||
this.form.setFieldsValue(obj)
|
||||
},
|
||||
reset () {
|
||||
this.loading = false
|
||||
this.form.resetFields()
|
||||
},
|
||||
onClose () {
|
||||
this.reset()
|
||||
this.$emit('close')
|
||||
},
|
||||
handleSubmit () {
|
||||
// 获取图片List
|
||||
let images = []
|
||||
this.fileList.forEach(image => {
|
||||
if (image.response !== undefined) {
|
||||
images.push(image.response)
|
||||
} else {
|
||||
images.push(image.name)
|
||||
}
|
||||
})
|
||||
this.form.validateFields((err, values) => {
|
||||
values.id = this.rowId
|
||||
values.images = images.length > 0 ? images.join(',') : null
|
||||
if (!err) {
|
||||
this.loading = true
|
||||
this.$put('/cos/score-info', {
|
||||
...values
|
||||
}).then((r) => {
|
||||
this.reset()
|
||||
this.$emit('success')
|
||||
}).catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
332
frontend/src/views/manage/weather/Weather.vue
Normal file
332
frontend/src/views/manage/weather/Weather.vue
Normal file
@@ -0,0 +1,332 @@
|
||||
<template>
|
||||
<div style="width: 100%; padding: 0 1rem">
|
||||
<div class="global-search-main">
|
||||
<div class="global-search-wrapper">
|
||||
<a-auto-complete
|
||||
:dataSource="dataSource"
|
||||
class="global-search"
|
||||
@select="onSelect"
|
||||
@search="handleSearch"
|
||||
placeholder="请输入城市名">
|
||||
<a-input>
|
||||
<a-button slot="suffix" class="search-btn" type="primary" @click.stop="searchWeather">
|
||||
<a-icon type="search"/>
|
||||
</a-button>
|
||||
</a-input>
|
||||
</a-auto-complete>
|
||||
</div>
|
||||
</div>
|
||||
<div class="weather-area" v-show="!loading">
|
||||
<div class="weather-chart-info">
|
||||
<apexchart ref="seven" height="350" type=line :options="seven.chartOptions" :series="seven.series" />
|
||||
</div>
|
||||
<div class="weather-chart-info">
|
||||
<apexchart ref="future" height="350" type=area :options="future.chartOptions" :series="future.series" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="weather-area">
|
||||
<div class="weather-info">
|
||||
<a-card :loading="loading" :title="this.weather.countyName + ' 当前天气'">
|
||||
<a-row>
|
||||
<a-col :span="8"><p>天气:{{this.weather.realtime.weather}}</p></a-col>
|
||||
<a-col :span="8"><p>风向:{{this.weather.realtime.wD}}</p></a-col>
|
||||
<a-col :span="8"><p>风力大小:{{this.weather.realtime.wS}}</p></a-col>
|
||||
</a-row>
|
||||
<a-row>
|
||||
<a-col :span="8"><p>温度:{{this.weather.realtime.temp}}℃</p></a-col>
|
||||
<a-col :span="8"><p>体感温度:{{this.weather.realtime.sendibleTemp}}℃</p></a-col>
|
||||
<a-col :span="8"><p>空气湿度:{{this.weather.realtime.sD}}%</p></a-col>
|
||||
</a-row>
|
||||
<a-row>
|
||||
<a-col :span="8"><p>更新时间:{{this.weather.realtime.time}}</p></a-col>
|
||||
</a-row>
|
||||
</a-card>
|
||||
</div>
|
||||
<div class="weather-info">
|
||||
<a-card :loading="loading" :title="this.weather.countyName + ' 未来天气'">
|
||||
<a-row>
|
||||
<a-col :span="24" v-for="(w, index) in this.weather.weathers" :key="index">
|
||||
<template v-if="index !== 6">
|
||||
<p>{{w.date}}【{{w.week}}】:日出时间 --- {{w.sun_rise_time}} 日落时间 --- {{w.sun_down_time}} 天气 --- {{w.weather}}</p>
|
||||
</template>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-card>
|
||||
</div>
|
||||
<div class="weather-info">
|
||||
<a-card :loading="loading" :title="this.weather.countyName + ' 生活指数'">
|
||||
<a-row>
|
||||
<a-col :span="24" v-for="(i, index) in this.weather.indexes" :key="index">
|
||||
<p>{{i.name}} --- {{i.content}}</p>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-card>
|
||||
</div>
|
||||
<div class="weather-info" v-if="this.weather.alarms.length">
|
||||
<a-card :loading="loading" :title="this.weather.countyName + ' 预警信息'">
|
||||
<a-col :span="24">
|
||||
<p>预警标题 --- {{this.weather.alarms[0].alarmDesc}}</p>
|
||||
<p>预警类型 --- {{this.weather.alarms[0].alarmTypeDesc}}</p>
|
||||
<p>预警等级 --- {{this.weather.alarms[0].alarmLevelNoDesc}}</p>
|
||||
<p>发布时间 --- {{this.weather.alarms[0].publishTime}}</p>
|
||||
<p>预防措施 --- {{this.weather.alarms[0].precaution}}</p>
|
||||
<a-popover title="预警详情">
|
||||
<template slot="content">
|
||||
<div style="max-width: 360px">{{this.weather.alarms[0].alarmContent}}</div>
|
||||
</template>
|
||||
<p>预警详情 --- {{this.weather.alarms[0].alarmContent}}</p>
|
||||
</a-popover>
|
||||
</a-col>
|
||||
</a-card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import axios from 'axios'
|
||||
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
loading: true,
|
||||
seven: {
|
||||
series: [],
|
||||
chartOptions: {
|
||||
chart: {
|
||||
shadow: {
|
||||
enabled: true,
|
||||
color: '#000',
|
||||
top: 18,
|
||||
left: 7,
|
||||
blur: 10,
|
||||
opacity: 1
|
||||
},
|
||||
toolbar: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
colors: ['#f5564e', '#35d0ba'],
|
||||
dataLabels: {
|
||||
enabled: true
|
||||
},
|
||||
stroke: {
|
||||
curve: 'smooth'
|
||||
},
|
||||
markers: {
|
||||
size: 4
|
||||
},
|
||||
xaxis: {},
|
||||
yaxis: {}
|
||||
}
|
||||
},
|
||||
future: {
|
||||
series: [],
|
||||
chartOptions: {
|
||||
chart: {
|
||||
toolbar: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: false
|
||||
},
|
||||
stroke: {
|
||||
curve: 'smooth'
|
||||
},
|
||||
xaxis: {}
|
||||
}
|
||||
},
|
||||
dataSource: [],
|
||||
storage: [],
|
||||
citys: [],
|
||||
areaId: 101090101,
|
||||
weather: {
|
||||
provinceName: '',
|
||||
countyName: '',
|
||||
weathers: [],
|
||||
day_c: [],
|
||||
night_c: [],
|
||||
hours_c: [],
|
||||
dateArr: [],
|
||||
timeArr: [],
|
||||
publishTime: '',
|
||||
alarms: [],
|
||||
realtime: {},
|
||||
indexes: []
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
axios.get('../../../static/file/city.json').then((r) => {
|
||||
this.citys = r.data
|
||||
})
|
||||
this.searchWeather()
|
||||
},
|
||||
methods: {
|
||||
handleSearch (value) {
|
||||
this.dataSource = []
|
||||
this.storage = []
|
||||
this.areaId = ''
|
||||
if (!value) {
|
||||
return
|
||||
}
|
||||
for (let i = 0; i < this.citys.length; i++) {
|
||||
let currentCity = this.citys[i]
|
||||
if (currentCity.countyname.indexOf(value) !== -1) {
|
||||
this.dataSource.push(currentCity.countyname)
|
||||
this.storage.push(currentCity.areaid)
|
||||
}
|
||||
}
|
||||
},
|
||||
onSelect (value) {
|
||||
let index = this.dataSource.indexOf(value)
|
||||
this.areaId = this.storage[index]
|
||||
},
|
||||
searchWeather () {
|
||||
if (!this.areaId) {
|
||||
this.$message.warning('请选择城市')
|
||||
} else {
|
||||
this.$get('weather?areaId=' + this.areaId).then((r) => {
|
||||
let data = JSON.parse(r.data.data)
|
||||
if (data.code === '200') {
|
||||
this.weather = {
|
||||
countyName: '',
|
||||
weathers: [],
|
||||
day_c: [],
|
||||
night_c: [],
|
||||
hours_c: [],
|
||||
dateArr: [],
|
||||
timeArr: [],
|
||||
publishTime: ''
|
||||
}
|
||||
this.loading = false
|
||||
this.weather.provinceName = data.value[0].provinceName
|
||||
this.weather.countyName = data.value[0].city
|
||||
this.weather.weathers = data.value[0].weathers
|
||||
this.weather.alarms = data.value[0].alarms
|
||||
this.weather.realtime = data.value[0].realtime
|
||||
this.weather.indexes = data.value[0].indexes
|
||||
let weathers = this.weather.weathers
|
||||
let min = 0
|
||||
let max = 0
|
||||
for (let i = 0; i < weathers.length; i++) {
|
||||
if (i === weathers.length - 1) {
|
||||
this.weather.day_c.unshift(parseFloat(weathers[i].temp_day_c))
|
||||
this.weather.night_c.unshift(parseFloat(weathers[i].temp_night_c))
|
||||
this.weather.dateArr.unshift(weathers[i].date.split('-')[1] + '-' + weathers[i].date.split('-')[2])
|
||||
} else {
|
||||
this.weather.day_c.push(parseFloat(weathers[i].temp_day_c))
|
||||
this.weather.night_c.push(parseFloat(weathers[i].temp_night_c))
|
||||
this.weather.dateArr.push(weathers[i].date.split('-')[1] + '-' + weathers[i].date.split('-')[2])
|
||||
}
|
||||
if (i === 0) {
|
||||
max = this.weather.day_c[0]
|
||||
min = this.weather.night_c[0]
|
||||
} else {
|
||||
if (this.weather.day_c[i] > max) {
|
||||
max = this.weather.day_c[i]
|
||||
}
|
||||
if (this.weather.night_c[i] < min) {
|
||||
min = this.weather.night_c[i]
|
||||
}
|
||||
}
|
||||
}
|
||||
let weather3HoursDetailsInfos = data.value[0].weatherDetailsInfo.weather3HoursDetailsInfos
|
||||
this.weather.publishTime = data.value[0].weatherDetailsInfo.publishTime
|
||||
for (let i = 0; i < weather3HoursDetailsInfos.length; i++) {
|
||||
let time = weather3HoursDetailsInfos[i].endTime.split(' ')[1].split(':')
|
||||
this.weather.hours_c.push(parseFloat(weather3HoursDetailsInfos[i].highestTemperature))
|
||||
this.weather.timeArr.push(time[0] + ':' + time[1])
|
||||
}
|
||||
this.$refs.seven.updateSeries([
|
||||
{
|
||||
name: '最高温',
|
||||
data: this.weather.day_c
|
||||
},
|
||||
{
|
||||
name: '最低温',
|
||||
data: this.weather.night_c
|
||||
}
|
||||
], true)
|
||||
this.$refs.future.updateSeries([
|
||||
{
|
||||
name: '未来气温',
|
||||
data: this.weather.hours_c
|
||||
}
|
||||
])
|
||||
this.$refs.seven.updateOptions({
|
||||
xaxis: {
|
||||
categories: this.weather.dateArr
|
||||
},
|
||||
yaxis: {
|
||||
min: min - 5,
|
||||
max: max + 5
|
||||
},
|
||||
title: {
|
||||
text: `${this.weather.provinceName} - ${this.weather.countyName}未来七日气温`,
|
||||
align: 'center'
|
||||
}
|
||||
}, true, true)
|
||||
this.$refs.future.updateOptions({
|
||||
xaxis: {
|
||||
categories: this.weather.timeArr
|
||||
},
|
||||
title: {
|
||||
text: `${this.weather.provinceName} - ${this.weather.countyName}未来气温细节`,
|
||||
align: 'center'
|
||||
}
|
||||
}, true, true)
|
||||
}
|
||||
}).catch((r) => {
|
||||
console.error(r)
|
||||
this.$message.error('天气查询失败')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="less">
|
||||
.global-search-main {
|
||||
margin-bottom: 2.5rem;
|
||||
.global-search-wrapper {
|
||||
width: 300px;
|
||||
margin:0 auto;
|
||||
.global-search {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
.weather-area {
|
||||
display: inline;
|
||||
.weather-chart-info {
|
||||
width: 49%;
|
||||
display:inline-block;
|
||||
}
|
||||
.weather-info {
|
||||
margin: .5rem 0;
|
||||
width: 100%;
|
||||
display: inline-block;
|
||||
p {
|
||||
margin-bottom: .4rem !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
.global-search.ant-select-auto-complete {
|
||||
.ant-select-selection--single {
|
||||
margin-right: -46px;
|
||||
}
|
||||
.ant-input-affix-wrapper {
|
||||
.ant-input:not(:last-child) {
|
||||
padding-right: 62px;
|
||||
}
|
||||
.ant-input-suffix {
|
||||
right: 0;
|
||||
}
|
||||
.ant-input-suffix button {
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user