package com.aps.job.controller; import com.aps.common.core.constant.Constants; import com.aps.common.core.exception.job.TaskException; import com.aps.common.core.utils.StringUtils; import com.aps.common.core.utils.poi.ExcelUtil; import com.aps.common.core.utils.uuid.Sequence; import com.aps.common.core.web.controller.BaseController; import com.aps.common.core.web.domain.AjaxResult; import com.aps.common.core.web.page.TableDataInfo; import com.aps.common.log.annotation.Log; import com.aps.common.log.enums.BusinessType; import com.aps.common.security.utils.SecurityUtils; import com.aps.job.domain.SysJob; import com.aps.job.service.*; import com.aps.job.util.CronUtils; import com.aps.job.util.ScheduleUtils; import com.aps.system.api.RemoteCoreService; import jakarta.servlet.http.HttpServletResponse; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.List; /** * 调度任务信息操作处理 * * @author ruoyi */ @RestController @RequestMapping("/job") public class SysJobController extends BaseController { @Autowired private ISysJobService jobService; @Autowired private IApsWorkOrderProcessService apsWorkOrderProcessService; @Autowired private IApsWorkOrderJobService apsWorkOrderJobService; @Autowired private IApsBomHeaderJobService apsBomHeaderJobService; @Autowired private Sequence sequence; @Autowired private IApsMaterialStorageManagementJobService apsMaterialStorageManagementJobService; @Autowired private IApsStandardProcessRouteHeaderJobService apsStandardProcessRouteHeaderJobService; @Autowired private RemoteCoreService remoteCoreService; @Autowired public RedisTemplate redisTemplate; @Autowired private IApsMaterialManagementJobService apsMaterialManagementJobService; /** * 查询定时任务列表 */ /* @RequiresPermissions("monitor:job:list")*/ @GetMapping("/list") public TableDataInfo list(SysJob sysJob) { startPage(); List list = jobService.selectJobList(sysJob); return getDataTable(list); } /** * 导出定时任务列表 */ /*@RequiresPermissions("monitor:job:export")*/ @Log(title = "定时任务", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, SysJob sysJob) { List list = jobService.selectJobList(sysJob); ExcelUtil util = new ExcelUtil(SysJob.class); util.exportExcel(response, list, "定时任务"); } /** * 获取定时任务详细信息 */ /*@RequiresPermissions("monitor:job:query")*/ @GetMapping(value = "/{jobId}") public AjaxResult getInfo(@PathVariable("jobId") Long jobId) { return success(jobService.selectJobById(jobId)); } /** * 新增定时任务 */ /* @RequiresPermissions("monitor:job:add")*/ @Log(title = "定时任务", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException { if (!CronUtils.isValid(job.getCronExpression())) { return error("新增任务'" + job.getJobName() + "'失败,Cron表达式不正确"); } else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) { return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) { return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) { return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) { return error("新增任务'" + job.getJobName() + "'失败,目标字符串存在违规"); } else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) { return error("新增任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); } job.setCreateBy(SecurityUtils.getUsername()); return toAjax(jobService.insertJob(job)); } /** * 修改定时任务 */ /* @RequiresPermissions("monitor:job:edit")*/ @Log(title = "定时任务", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException { if (!CronUtils.isValid(job.getCronExpression())) { return error("修改任务'" + job.getJobName() + "'失败,Cron表达式不正确"); } else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) { return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) { return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) { return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) { return error("修改任务'" + job.getJobName() + "'失败,目标字符串存在违规"); } else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) { return error("修改任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); } job.setUpdateBy(SecurityUtils.getUsername()); return toAjax(jobService.updateJob(job)); } /** * 定时任务状态修改 */ /* @RequiresPermissions("monitor:job:changeStatus")*/ @Log(title = "定时任务", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException { SysJob newJob = jobService.selectJobById(job.getJobId()); newJob.setStatus(job.getStatus()); return toAjax(jobService.changeStatus(newJob)); } /** * 定时任务立即执行一次 */ /* @RequiresPermissions("monitor:job:changeStatus")*/ @Log(title = "定时任务", businessType = BusinessType.UPDATE) @PutMapping("/run") public AjaxResult run(@RequestBody SysJob job) throws SchedulerException { boolean result = jobService.run(job); return result ? success() : error("任务不存在或已过期!"); } /** * 删除定时任务 */ /* @RequiresPermissions("monitor:job:remove")*/ @Log(title = "定时任务", businessType = BusinessType.DELETE) @DeleteMapping("/{jobIds}") public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException { jobService.deleteJobByIds(jobIds); return success(); } @PostMapping("/refreshBomData") public AjaxResult refreshBomData() throws SchedulerException, TaskException { try { boolean res = apsBomHeaderJobService.syncBomDataJob(1, 1000, "", ""); if(res){ return success(); }else { return error(); } } catch (Exception e) { e.printStackTrace(); return error(); } } @PostMapping("/refreshProcessRouteData") public AjaxResult refreshProcessRouteData() throws SchedulerException, TaskException { try { boolean res = apsStandardProcessRouteHeaderJobService.syncProcessRouteDataJob(1, 1000, "", ""); if(res){ return success(); }else { return error(); } } catch (Exception e) { e.printStackTrace(); return error(); } } @PutMapping("/test") public void test(@RequestBody SysJob job) throws Exception { System.out.println("start"); //同步工单数据 // boolean continueFlag = true; // Integer currentPage = 1; // ApsWorkOrderJobParam param=new ApsWorkOrderJobParam(); // param.setPageIndex(currentPage); // param.setDocState(Arrays.asList(0,1,2,4)); // param.setPageSize(500); // while (continueFlag){ // param.setPageIndex(currentPage); // continueFlag= apsWorkOrderJobService.batchSaveByPager(param); // currentPage++; // } //同步物料数据 // apsMaterialManagementJobService.syncApsMaterialData(1, 1000, "", ""); //同步工艺路线数据 // apsStandardProcessRouteHeaderJobService.syncProcessRouteData(1, 1000, "", ""); //获取Redis缓存中的BOM数据 // JSONArray jsonArray = (JSONArray)redisTemplate.opsForValue().get("BOM:BOM_FORTUNA_A6501-001080"); //将BOM数据存进Redis中 // remoteCoreService.setBomDataToRedis(SecurityConstants.INNER); //同步物料库存数据 apsMaterialStorageManagementJobService.syncApsMaterialStorageData(1, 1000, "", ""); //同步BOM数据 // apsBomHeaderJobService.syncBomData(1, 1000, "", ""); // System.out.println(sequence.nextId()); // List docNos = new ArrayList<>(); // docNos.add("MO-240328010093"); // apsWorkOrderProcessService.getWorkOrderProcessFromU9(docNos); // apsWorkOrderProcessService.syncWorkOrderProcessData("", 100); // apsWorkOrderJobService.syncPartOrderData(); // apsWorkOrderJobService.syncPlateOrderData(); // apsWorkOrderJobService.syncGasPipingData(); // apsWorkOrderProcessService.syncProcessRouteData(); System.out.println("end"); //生成数据字典 // HikariConfig hikariConfig = new HikariConfig(); // hikariConfig.setDriverClassName("org.postgresql.Driver"); // hikariConfig.setJdbcUrl("jdbc:postgresql://192.168.50.160:5432/postgres?stringtype=unspecified"); // hikariConfig.setUsername("postgres"); // hikariConfig.setPassword("pwd@aps"); // //设置可以获取tables remarks信息 // hikariConfig.addDataSourceProperty("useInformationSchema", "true"); // hikariConfig.setMinimumIdle(2); // hikariConfig.setMaximumPoolSize(5); // DataSource dataSource = new HikariDataSource(hikariConfig); // //生成配置 // EngineConfig engineConfig = EngineConfig.builder() // //生成文件路径 // .fileOutputDir("D:\\projects\\aps\\文档") // //打开目录 // .openOutputDir(true) // //文件类型 // .fileType(EngineFileType.WORD) // //生成模板实现 // .produceType(EngineTemplateType.freemarker) // //自定义文件名称 // .fileName("自定义文件名称").build(); // // //忽略表 // ArrayList ignoreTableName = new ArrayList<>(); // ignoreTableName.add("test_user"); // ignoreTableName.add("test_group"); // //忽略表前缀 // ArrayList ignorePrefix = new ArrayList<>(); // ignorePrefix.add("test_"); // //忽略表后缀 // ArrayList ignoreSuffix = new ArrayList<>(); // ignoreSuffix.add("_test"); // ProcessConfig processConfig = ProcessConfig.builder() // //指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置 // //根据名称指定表生成 // .designatedTableName(new ArrayList<>()) // //根据表前缀生成 // .designatedTablePrefix(new ArrayList<>()) // //根据表后缀生成 // .designatedTableSuffix(new ArrayList<>()) // //忽略表名 // .ignoreTableName(ignoreTableName) // //忽略表前缀 // .ignoreTablePrefix(ignorePrefix) // //忽略表后缀 // .ignoreTableSuffix(ignoreSuffix).build(); // //配置 // Configuration config = Configuration.builder() // //版本 // .version("1.0.0") // //描述 // .description("数据库设计文档生成") // //数据源 // .dataSource(dataSource) // //生成配置 // .engineConfig(engineConfig) // //生成配置 // .produceConfig(processConfig) // .build(); // //执行生成 // new DocumentationExecute(config).execute(); // System.out.println("end"); } public static void main(String[] args) { BigDecimal a = new BigDecimal("0.1234"); Double b = a.doubleValue()*60*60*1000; LocalDateTime now = LocalDateTime.now(); //将now换成成毫秒 然后加上a 然后转换成LocalDateTime //a转换成毫秒 System.out.println(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); System.out.println(b/1000/60); Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(); milliSecond += b.longValue(); System.out.println(LocalDateTime.ofInstant(Instant.ofEpochMilli(milliSecond), ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); System.out.println(new BigDecimal(585).divide(BigDecimal.valueOf(1232), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(100))); new BigDecimal(585).divide(BigDecimal.valueOf(1232), 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)); } }