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

编程之家收集整理的这篇文章主要介绍了nodejs与bat结合的定时查询功能-代码中逻辑定时去查询仪器列表是否需要送去校验编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

用到的包:

  "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】:

let timer = require('node-schedule') //使用node-schedule包,这是一个好用的计时模块
let MysqL = require('./link.js')
let moment = require('moment') //时间模块,有官网
let template = require('art-template')
const { spawn, execFile, exec } = require("child_process") //使用这个模块可以实现调用bat,网上有使用文档
//const {bat} = spawn('cmd.exe', ['/c','test1.bat'])
let connection = null
var p = {}
let datarr = []
let tomail = []
const nodemailer = require('nodemailer');
const { callbackPromise } = require('nodemailer/lib/shared')
// 创建可重用邮件传输器
const transporter = nodemailer.createTransport({
    host: "yourhost", // 邮件地址
    port: 25, // 端口
    secureConnection: false, // use SSL
    auth: {
        "user": 'compaltpr@compal.top', // 邮箱账号
        "pass": 'XUDELIN8800275' // 邮箱的授权码
    }
});
const send = (mailOptions, callback) => {
    transporter.sendMail(mailOptions, function (error, info) {
        if (error) {
            return console.log(error);
        }
        return callback('ms') //回调传入标志位,表示邮件发送ok
    });
}

// let code = Math.floor(Math.random() * 999999).toString()

// let emailCode = code //验证码为6位随机数
let email = {
    title: '仪器校验提醒',
    htmlBody: '<test>'
}
let mailOptions = {
    from: 'compal-SOD@compal.top', // 发件人地址
    to: ['Iori_Liu@compal.com', 'RuiY_Yang@compal.com', 'Bruce_Xu@compal.com'], // 收件人地址,多个收件人可以使用逗号分隔
    subject: email.title, // 邮件标题
    html: email.htmlBody // 邮件内容
};

function objtimer() {
    p = timer.scheduleJob({ second: 30 }, function () {
        connection = MysqL.createConnection()
        connection.connect()
        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 "
        let isql = ""
        connection.query(sql, function (error, results) {
            if (error) {
                console.log(error)
                throw error
            }
            else {
                //console.log('success')
                results.forEach((item, i) => {
                    // moment(date,'format') 这个format 令牌,不传这个format参数的话,会报警告,date不是符合格式的日期字符串!!!
                    if (item.cdate !== '' && item.cdate !== null) {
                        item.cdate = moment(item.cdate, ['YYYY-MM-DD HH:mm:ss', 'YYYY/MM/DD', 'YYYY/M/D']).format('YYYY-MM-DD')
                        let now = moment().format('YYYY-MM-DD')
                        if (moment(item.cdate).format('x') > moment(now).format('x')) { //得到unix时间戳
                            if ((moment(moment(item.cdate, 'YYYY-MM-DD')).diff(moment(now, 'YYYY-MM-DD'), 'days')) === 8) { //如果当天离校验日期天数为8的话
                                item.status = 0
                                item.itime = moment().format('YYYY-MM-DD HH::mm:ss')
                                item.step1 = 0
                                item.step2 = 0
                                datarr.push(Object.values(item))

                            }
                        }
                    }
                })
                //console.log(datarr)
                if (datarr.length >= 1) {

                    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 ?  "
                    connection.query(isql, [datarr], function (err, res) {
                        if (err) {
                            console.log('sql语句执行错误错误如下:', err.message)
                            return
                        } else {
                            //console.log(res)
                            if (res.affectedRows >= 1) {
                                //console.log('insert success')
                                p.cancel()
                                //console.log('定时器取消')

                                let html = ``
                                for (let i = 0; i < datarr.length; i++) {
                                    html +=
                                        '<tr>'
                                        + '<td style="border:1px solod black;text-align:center;">' + datarr[i][1] + '</td>'
                                        + '<td style="border:1px solod black;text-align:center;">' + datarr[i][2] + '</td>'
                                        + '<td style="border:1px solod black;text-align:center;">' + datarr[i][3] + '</td>'
                                        + '<td style="border:1px solod black;text-align:center;">' + datarr[i][4] + '</td>'
                                        + '<td style="border:1px solod black;text-align:center;">' + datarr[i][5] + '</td>'
                                        + '<td style="border:1px solod black;text-align:center;">' + datarr[i][6] + '</td>'
                                        + '<td style="border:1px solod black;text-align:center;">' + datarr[i][7] + '</td>'
                                        + '<td style="border:1px solod black;text-align:center;">' + datarr[i][8] + '</td>'
                                        + '<td style="border:1px solod black;text-align:center;">' + datarr[i][9] + '</td>'
                                        + '<td style="border:1px solod black;text-align:center;">' + datarr[i][10] + '</td>'
                                        + '<td style="border:1px solod black;text-align:center;">' + datarr[i][11] + '</td>'
                                        + '</tr>'

                                    let t = [datarr[i][12], datarr[i][13], datarr[i][14]];
                                    tomail.push(...t)

                                }
                                let chtml = `
                                    <table border="1" cellspacing="0" cellpadding="0" style="border-spacing:0;bloder-collapse:collapse;margin:10px 0">
                                    <caption style="font-size: 18px;font-weight: bold;margin: 1em 0;">以下表格中的数据为近期需要校验的仪器信息,请留意!!!</caption>
                                    <tbody>
                                        <tr style="border:1px solod black;text-align:center;color:white;">
                                        <th style="background-color:#87ceeb;font-weight:bold;">仪器名称</th>
                                        <th style="background-color:#87ceeb;font-weight:bold;">型号</th>
                                        <th style="background-color:#87ceeb;font-weight:bold;">厂牌</th>
                                        <th style="background-color:#87ceeb;font-weight:bold;">厂区</th>
                                        <th style="background-color:#87ceeb;font-weight:bold;">部门</th>
                                        <th style="background-color:#87ceeb;font-weight:bold;">校验日期</th>
                                        <th style="background-color:#87ceeb;font-weight:bold;">校验性质</th>
                                        <th style="background-color:#87ceeb;font-weight:bold;">校验编号</th>
                                        <th style="background-color:#87ceeb;font-weight:bold;">保管人</th>
                                        <th style="background-color:#87ceeb;font-weight:bold;">负责人</th>
                                        <th style="background-color:#87ceeb;font-weight:bold;">保管人主管</th>
                                        </tr>
                                        ${html}
                                    </tbody>
                                    </table>`
                                mailOptions.html = chtml
                                //console.log(tomail);
                                for (let q = 0; q < tomail.length; q++) {
                                    if (!mailOptions.to.includes(tomail[q])) {
                                        mailOptions.to.push(tomail[q])
                                    }
                                }

                                console.log(mailOptions)
                                send(mailOptions, function (data) {
                                    if (data == 'ms') {
                                        console.log(data)
                                        execFile('test1.bat', { encoding: 'buffer' }, (error, stdout, stderr) => {//execFile 为child-process的方法,这里用于调用test1.bat
                                            if (error) throw error;
                                            console.log(exit)
                                        });
                                        //const bat =    spawn('cmd.exe',['/c', 'test1.bat'])
                                        // execFile('test1.bat', { encoding: 'buffer' }, (error, stdout, stderr) => {
                                        //     if (error) throw error;

                                        // });
                                        // bat.stdout.on('data', (data) => {
                                        //     console.log(data.toString());
                                        // });

                                        // bat.stderr.on('data', (data) => {
                                        //     console.error(data.toString());
                                        // });

                                        // bat.on('exit', (code) => {
                                        //     console.log(`子进程退出退出码 ${code}`);
                                        // });
                                    }
                                })

                            }

                        }
                    })
                } else {
                    console.log('exit with no data')
                    // exec("taskkill /f /fi 'WINDOWTITLE eq test.cmd' ", (error,stdout,stderr=>{
                    //     if (error){
                    //         console.log('run error')
                    //     }else{
                    //         console.log('ok')
                    //     }
                    // }

                    execFile('test1.bat', { encoding: 'buffer' }, (error, stdout, stderr) => {
                        if (error) throw error;
                        console.log(exit)
                    });
                }
            }

        });

        // 关闭连接  循环往数据库插数据时,尽量别关闭,因为插入一次就关闭连接,第二次往后没有重新开启连接数据就无法插进去,从而报错!!!

    })
}
objtimer()//执行函数

调用的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 放到任务计划里,就实现了定时判断数据库功能啦【亲测有效!!!】

  

总结

以上是编程之家为你收集整理的nodejs与bat结合的定时查询功能-代码中逻辑定时去查询仪器列表是否需要送去校验全部内容,希望文章能够帮你解决nodejs与bat结合的定时查询功能-代码中逻辑定时去查询仪器列表是否需要送去校验所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

相关文章

猜你在找的Node.js相关文章

express包含的内容:1)主体2)cookie,session3)数据4)模板引擎5)路由需要用到的插件:express---web框架express-static------解析静态资源cookie-parser-------解析cookie,服务端读取客户端设置的cookiecookie-session------解析sessionbody-pa...
Node.js学习课程的安排Node.js最大的特点就是:非阻塞IO和事件驱动、模块化驱动  Node的基础概念1)node命令的基本用法(1)进入REPL环境:node,进入REPL环境  .exit     在REPL环境,可以测试Node的一些代码和模块进入window的Powershell环境:cmd  执行:powershell     通过命令行执行...
不推荐使用安装包安装原因:1)以前版本安装的很多全局的工具包需要重新安装2)无法回滚到之前的版本3)无法再多个版本之间切换(很多时候需要特定的版本) 使用NVM的方式安装1)下载:nvm-windows2)解压到一个全英文的路径3)编辑解压目录下的setting.txt文件(不存在则新建)        a、root配置为当前nvm.exe所在目录,例:ro...
1)切换当前目录:cd2)创建目录:mkdir3)查看当前目录列表:dir  (windows系统)    别名:ls(list)(Linux系统)4)清空当前控制台:cls(windows系统)         别名:clear(Linux系统)5)删除文件:del  (windows系统)                    别名:rm(Linux系统)6)返回上一级目录...
1、在express中的get处理表单处理的数据,即服务器获取get方式提交的数据,通过req.query获取提交的数据,格式是json// 客户端代码&amp;lt;!doctype html&amp;gt;&amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;meta charset=&quot;utf-8&quot;/&amp;gt; &amp;lt;/head&amp;gt; &amp;lt;body..
1、cookie的处理设置cookie:给客户端发送cookie,通过res.cookie('属性名',‘值’,{signed:boolean,path:'/',maxAge:毫秒}),req.secret='fdfsdfs'const express = require('express');let server = express();server.listen(8080);...
在express中使用路由Router:把不同的目录对应到不同的模块,实现功能的分开。相当于一个子服务,有router.post()   router.get   router.use具体的例子const express = require('express');let server = express();server.listen(8080);// 目录1:/user 创...
Node 中的文件路径大概有 __dirname,__filename, process.cwd(), ./ 或者 ../,前三个都是绝对路径,为了便于比较,./ 和 ../ 我们通过 path.resolve('./')来转换为绝对路径,path.join()也可以转换为绝对路径。path.resolve():返回一个绝对路径(不包括文件名),从右向左拼接字符串,当遇到“/”停止拼接,如果遇到'...