zoukankan      html  css  js  c++  java
  • 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】:

      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": 'xxxxxxxx@xxx.com', //你的 邮箱账号
     20         "pass": 'xxxxxxxxxx' // 你的邮箱的授权码
     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: '<test>'
     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 < datarr.length; i++) {
     93                                     html +=
     94                                         '<tr>'
     95                                         + '<td style="border:1px solod black;text-align:center;">' + datarr[i][1] + '</td>'
     96                                         + '<td style="border:1px solod black;text-align:center;">' + datarr[i][2] + '</td>'
     97                                         + '<td style="border:1px solod black;text-align:center;">' + datarr[i][3] + '</td>'
     98                                         + '<td style="border:1px solod black;text-align:center;">' + datarr[i][4] + '</td>'
     99                                         + '<td style="border:1px solod black;text-align:center;">' + datarr[i][5] + '</td>'
    100                                         + '<td style="border:1px solod black;text-align:center;">' + datarr[i][6] + '</td>'
    101                                         + '<td style="border:1px solod black;text-align:center;">' + datarr[i][7] + '</td>'
    102                                         + '<td style="border:1px solod black;text-align:center;">' + datarr[i][8] + '</td>'
    103                                         + '<td style="border:1px solod black;text-align:center;">' + datarr[i][9] + '</td>'
    104                                         + '<td style="border:1px solod black;text-align:center;">' + datarr[i][10] + '</td>'
    105                                         + '<td style="border:1px solod black;text-align:center;">' + datarr[i][11] + '</td>'
    106                                         + '</tr>'
    107 
    108                                     let t = [datarr[i][12], datarr[i][13], datarr[i][14]];
    109                                     tomail.push(...t)
    110 
    111                                 }
    112                                 let chtml = `
    113                                     <table border="1" cellspacing="0" cellpadding="0" style="border-spacing:0;bloder-collapse:collapse;margin:10px 0">
    114                                     <caption style="font-size: 18px;font-weight: bold;margin: 1em 0;">以下表格中的数据为近期需要校验的仪器信息,请留意!!!</caption>
    115                                     <tbody>
    116                                         <tr style="border:1px solod black;text-align:center;color:white;">
    117                                         <th style="background-color:#87ceeb;font-weight:bold;">仪器名称</th>
    118                                         <th style="background-color:#87ceeb;font-weight:bold;">型号</th>
    119                                         <th style="background-color:#87ceeb;font-weight:bold;">厂牌</th>
    120                                         <th style="background-color:#87ceeb;font-weight:bold;">厂区</th>
    121                                         <th style="background-color:#87ceeb;font-weight:bold;">部门</th>
    122                                         <th style="background-color:#87ceeb;font-weight:bold;">校验日期</th>
    123                                         <th style="background-color:#87ceeb;font-weight:bold;">校验性质</th>
    124                                         <th style="background-color:#87ceeb;font-weight:bold;">校验编号</th>
    125                                         <th style="background-color:#87ceeb;font-weight:bold;">保管人</th>
    126                                         <th style="background-color:#87ceeb;font-weight:bold;">负责人</th>
    127                                         <th style="background-color:#87ceeb;font-weight:bold;">保管人主管</th>
    128                                         </tr>
    129                                         ${html}
    130                                     </tbody>
    131                                     </table>`
    132                                 mailOptions.html = chtml
    133                                 //console.log(tomail);
    134                                 for (let q = 0; q < tomail.length; 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 odejs&&node D:phpstudyWWWlecturedemo odecodetest imer imer.js" //这里记得改成你存放定时器js文件的路径


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

      

  • 相关阅读:
    无所不能的Ant 【转】
    fstream的文件操作
    dos下的for命令详解(zz)
    c++中vector的用法总结
    学习Git上
    IE下的document.onclick问题
    第一次面试实习感触
    大数据概述
    红旗
    词法分析
  • 原文地址:https://www.cnblogs.com/Hijacku/p/14727722.html
Copyright © 2011-2022 走看看