热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

nodejs与bat结合的定时查询功能代码中逻辑定时去查询仪器列表是否需要送去校验

用到的包:dependencies:{mysql:^2.18.1,node-schedule:^1.3.2,nodemailer:^6.4.17,pm

用到的包:

  

"dependencies": {
"mysql": "^2.18.1",
"node-schedule": "^1.3.2",
"nodemailer": "^6.4.17",
"pm2": "^4.5.1"
},
"devDependencies": {
"art-template": "^4.13.2",
"child-process-ext": "^2.1.1",
"child_process": "^1.0.2",
"execa": "^5.0.0",
"moment": "^2.29.1"
}

  连接数据库【link.js】【注意确保npm install  mysql这个包】:

var mysql = require('mysql');
function createConnection() {
var cOnnection= mysql.createConnection({
host: '127.0.0.1',
database: 'demo',
user: 'root',
password: 'root'
});
return connection;
}
module.exports.createCOnnection= createConnection;

  主文件【timer.js】:


1 let timer = require('node-schedule') //使用node-schedule包,这是一个好用的计时模块
2 let mysql = require('./link.js')
3 let moment = require('moment') //时间模块,有官网
4 let template = require('art-template')
5 const { spawn, execFile, exec } = require("child_process") //使用这个模块可以实现调用bat,网上有使用文档
6 //const {bat} = spawn('cmd.exe', ['/c','test1.bat'])
7 let cOnnection= null
8 var p = {}
9 let datarr = []
10 let tomail = []
11 const nodemailer = require('nodemailer');
12 const { callbackPromise } = require('nodemailer/lib/shared')
13 // 创建可重用邮件传输器
14 const transporter = nodemailer.createTransport({
15 host: "yourhost", // 邮件地址
16 port: 25, // 端口
17 secureConnection: false, // use SSL
18 auth: {
19 "user": 'compaltpr@compal.top', // 邮箱账号
20 "pass": 'XUDELIN8800275' // 邮箱的授权码
21 }
22 });
23 const send = (mailOptions, callback) => {
24 transporter.sendMail(mailOptions, function (error, info) {
25 if (error) {
26 return console.log(error);
27 }
28 return callback('ms') //回调传入标志位,表示邮件发送ok
29 });
30 }
31
32 // let code = Math.floor(Math.random() * 999999).toString()
33
34 // let emailCode = code //验证码为6位随机数
35 let email = {
36 title: '仪器校验提醒',
37 htmlBody: ''
38 }
39 let mailOptiOns= {
40 from: 'compal-SOD@compal.top', // 发件人地址
41 to: ['Iori_Liu@compal.com', 'RuiY_Yang@compal.com', 'Bruce_Xu@compal.com'], // 收件人地址,多个收件人可以使用逗号分隔
42 subject: email.title, // 邮件标题
43 html: email.htmlBody // 邮件内容
44 };
45
46 function objtimer() {
47 p = timer.scheduleJob({ second: 30 }, function () {
48 cOnnection= mysql.createConnection()
49 connection.connect()
50 let sql = "select id,yiqimingcheng as epname,xinghao as model,changpai as brand,plant,deptname,jiaoyanriqi as cdate,jiaoyanxingzhi as checktype,jiaoyanbianhao as ckcode, baoguanren as custodian,yiqifuzeren as incharge,step1_master_name as director1,bgr_mail,fzr_mail,dt1_mail from compal_sod_instrument_list "
51 let isql = ""
52 connection.query(sql, function (error, results) {
53 if (error) {
54 console.log(error)
55 throw error
56 }
57 else {
58 //console.log('success')
59 results.forEach((item, i) => {
60 // moment(date,'format') 这个format 令牌,不传这个format参数的话,会报警告,date不是符合格式的日期字符串!!!
61 if (item.cdate !== '' && item.cdate !== null) {
62 item.cdate = moment(item.cdate, ['YYYY-MM-DD HH:mm:ss', 'YYYY/MM/DD', 'YYYY/M/D']).format('YYYY-MM-DD')
63 let now = moment().format('YYYY-MM-DD')
64 if (moment(item.cdate).format('x') > moment(now).format('x')) { //得到unix时间戳
65 if ((moment(moment(item.cdate, 'YYYY-MM-DD')).diff(moment(now, 'YYYY-MM-DD'), 'days')) === 8) { //如果当天离校验日期天数为8的话
66 item.status = 0
67 item.itime = moment().format('YYYY-MM-DD HH::mm:ss')
68 item.step1 = 0
69 item.step2 = 0
70 datarr.push(Object.values(item))
71
72 }
73 }
74 }
75 })
76 //console.log(datarr)
77 if (datarr.length >= 1) {
78
79 isql = "insert into pend_equipitem(`id`,`name`,`model`,`brand`,`plant`,`dept`,`checkdata`,`checktype`,`ckcode`,`custodian`,`incharge`,`director1`,`bgr_mail`,`fzr_mail`,`dt1_mail`,`status`,`itime`,`step1`,`step2`) VALUES ? "
80 connection.query(isql, [datarr], function (err, res) {
81 if (err) {
82 console.log('sql语句执行错误,错误如下:', err.message)
83 return
84 } else {
85 //console.log(res)
86 if (res.affectedRows >= 1) {
87 //console.log('insert success')
88 p.cancel()
89 //console.log('定时器取消')
90
91 let html = ``
92 for (let i = 0; i 93 html +=
94 ''
95 + '' + datarr[i][1] + ''
96 + '' + datarr[i][2] + ''
97 + '' + datarr[i][3] + ''
98 + '' + datarr[i][4] + ''
99 + '' + datarr[i][5] + ''
100 + '' + datarr[i][6] + ''
101 + '' + datarr[i][7] + ''
102 + '' + datarr[i][8] + ''
103 + '' + datarr[i][9] + ''
104 + '' + datarr[i][10] + ''
105 + '' + datarr[i][11] + ''
106 + ''
107
108 let t = [datarr[i][12], datarr[i][13], datarr[i][14]];
109 tomail.push(...t)
110
111 }
112 let chtml = `
113


114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129 ${html}
130
131
以下表格中的数据为近期需要校验的仪器信息,请留意!!!
仪器名称型号厂牌厂区部门校验日期校验性质校验编号保管人负责人保管人主管
`
132 mailOptions.html = chtml
133 //console.log(tomail);
134 for (let q = 0; q 135 if (!mailOptions.to.includes(tomail[q])) {
136 mailOptions.to.push(tomail[q])
137 }
138 }
139
140 console.log(mailOptions)
141 send(mailOptions, function (data) {
142 if (data == 'ms') {
143 console.log(data)
144 execFile('test1.bat', { encoding: 'buffer' }, (error, stdout, stderr) => {//execFile 为child-process的方法,这里用于调用test1.bat
145 if (error) throw error;
146 console.log(exit)
147 });
148 //const bat = spawn('cmd.exe',['/c', 'test1.bat'])
149 // execFile('test1.bat', { encoding: 'buffer' }, (error, stdout, stderr) => {
150 // if (error) throw error;
151
152 // });
153 // bat.stdout.on('data', (data) => {
154 // console.log(data.toString());
155 // });
156
157 // bat.stderr.on('data', (data) => {
158 // console.error(data.toString());
159 // });
160
161 // bat.on('exit', (code) => {
162 // console.log(`子进程退出,退出码 ${code}`);
163 // });
164 }
165 })
166
167
168
169
170 }
171
172
173
174 }
175 })
176 } else {
177 console.log('exit with no data')
178 // exec("taskkill /f /fi 'WINDOWTITLE eq test.cmd' ", (error,stdout,stderr=>{
179 // if (error){
180 // console.log('run error')
181 // }else{
182 // console.log('ok')
183 // }
184 // }
185
186 execFile('test1.bat', { encoding: 'buffer' }, (error, stdout, stderr) => {
187 if (error) throw error;
188 console.log(exit)
189 });
190 }
191 }
192
193 });
194
195
196
197 // 关闭连接 循环往数据库插数据时,尽量别关闭,因为插入一次就关闭连接,第二次往后没有重新开启连接数据就无法插进去,从而报错!!!
198
199
200 })
201 }
202 objtimer()//执行函数
View Code

调用的bat【test1这里主要是关闭调用timer.js后,执行完毕后的黑框,至于为什么要关闭两次,还没搞清楚,一次就是关不掉 。。。】:

【test1.bat】:

taskkill /f /fi "WINDOWTITLE eq test.cmd"
taskkill /f /fi "WINDOWTITLE eq test.cmd"
【test.bat】调用nodejs 执行timerjs:
 @echo off
  title test.bat
  cmd /k "cd C:\Program Files\nodejs&&node D:\phpstudy\WWW\lecturedemo\node\codetest\timer\timer.js"



最后把test.bat 放到任务计划里,就实现了定时判断数据库的功能啦【亲测有效!!!】

  



推荐阅读
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • PatchODAX8: ... [详细]
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 微软评估和规划(MAP)的工具包介绍及应用实验手册
    本文介绍了微软评估和规划(MAP)的工具包,该工具包是一个无代理工具,旨在简化和精简通过网络范围内的自动发现和评估IT基础设施在多个方案规划进程。工具包支持库存和使用用于SQL Server和Windows Server迁移评估,以及评估服务器的信息最广泛使用微软的技术。此外,工具包还提供了服务器虚拟化方案,以帮助识别未被充分利用的资源和硬件需要成功巩固服务器使用微软的Hyper - V技术规格。 ... [详细]
  • 本文介绍了使用FormData对象上传文件同时附带其他参数的方法。通过创建一个表单,将文件和参数添加到FormData对象中,然后使用ajax发送POST请求进行文件上传。在发送请求时,需要设置processData为false,告诉jquery不要处理发送的数据;同时设置contentType为false,告诉jquery不要设置content-Type请求头。 ... [详细]
  • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
author-avatar
cresslyty_723
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有