/*
* @Date: 2022-06-08 14:36:42
* @LastEditors: zeng 1459584248@qq.com
* @LastEditTime: 2022-10-18 16:08:28
* @FilePath: \software-iot-interface-project\app\service\cache.js
*/
const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');
const env = require('dotenv').config()
/**
* @name: 法定节假日 服务
* @return {*}
* @auto: zengye
* @Date: 2022-06-08 14:36:51
* @LastEditTime: Do not edit
*/
class LegalService {
/**
* 初始化构造函数
* @param {*} service
*/
constructor() {
// 保存的 json文件名
const config_file_name = 'LEGAL_CONFIG.json';
// 前缀 注释
const remark_preifx = `
参数: legal 所有节假日的日期
参数: legalWork 所有法定加班日的日期
参数: legalWork 详细的信息
作者: 曾记大排档 1459584248@qq.com 微信:zeng1569838235
`;
this.options = {
url: env.parsed.URL || 'http://www.gov.cn/zhengce/content/2021-10/25/content_5644835.htm', // 爬取的url
query_legal_url: env.parsed.QUERY_LEGAL,
date_join: '-' , // 日期格式为: xxxx-xx-xx
config_file: __dirname + '/' + config_file_name, // 配置文件路径
config_file_name: config_file_name, // 文件名
remark_preifx: remark_preifx
}
// 所有的信息
this.legalObj = {};
// 法定节假日
this.legal = [];
// 法定工作日 (补班)
this.legalWork = [];
// 进行获取到变量
this.getDataFile();
}
/**
* 获取到 变量 放假 工作日加班
* @returns
*/
async getLegal(){
if (!this.legal || this.legal.length == 0) {
await this.curlLegal();
}
return {
legal: this.legal,
legalWork: this.legalWork,
legalObj: this.legalObj,
}
}
/**
* 判断传递的日期 是否为法定节假日
* @param {*} dateStr 传递的日期 或 时间戳
* @returns
*/
checkDateStr (dateStr = '') {
let date = null;
if (!dateStr) {
date = new Date();
} else {
// 判断是否为时间戳 还是日期格式 如果是时间戳 判断是否为 常用时间戳 (js中需要乘以1000)
date = new Date(
dateStr - 0 == dateStr ?
(dateStr.toString().length == 10 ? (dateStr - 0 ) * 1000 : dateStr - 0)
: dateStr
);
}
// 返回的对象
const obj = {
legalDay: 0, // 不是法定节假日
legalWorkDay: 0, // 不是 法定加班日
restDay: 0, // 不是休息日
}
// 日期字符串 判断是否周末周日
dateStr = this.getDateStr(date);
obj.dateStr = dateStr;
if (this.legal.indexOf(dateStr) != -1) {
obj.legalDay = 1;
obj.restDay = 1;
} else if (this.legalWork.indexOf(dateStr) != -1) {
obj.legalWorkDay = 1;
} else if([6,0].indexOf(date.getDay() - 0) != -1){
obj.restDay = 1;
}
return obj;
}
/**
* 爬取到 法定节假日 和 法定工作日
* @url http://www.gov.cn/zhengce/content/2021-10/25/content_5644835.htm
*/
async curlLegal() {
request(this.options.url, (error, response, body) => {
if (!error && response.statusCode == 200) {
// 请求成功的处理逻辑,注意body是json字符串} console.log(body)
const $ = cheerio.load(body);
const legal = [];
const legalWork = [];
$("#UCAP-CONTENT p").each((v,item)=>{
const txt = $(item).text();
// 传递字符串 处理中
this.getChangeTitleStr(txt, legal, legalWork);
})
this.legal = legal;
this.legalWork = legalWork;
this.saveDataFile();
}
});
}
/**
* 爬取到 具体的 法定工作日 公布情况
* @url http://search.www.gov.cn/search/fw/index.do?q=%E8%8A%82%E5%81%87%E6%97%A5
*/
async curlQueryLegalUrl() {
const postData = {
webid: 1,
criteria_field_360: '',
criteria_field_364: '',
criteria_field_363: '',
q: '节假日',
group: true,
p: 1,
pg: 10,
category: 'fwxx',
selectFields: 'pkid,title,url,createdate',
highlightFields: 'title',
pos: 'title,keyword',
};
// 爬取数据中
request.post({
url: this.options.query_legal_url,
form: postData,
json: true,
}, (err,httpResponse,body) => {
if (!err && body) {
let url = '';
for(const i in body.items) {
const item = body.items[i].data;
if(item.title.indexOf('日历') != -1 && item.title.indexOf('节假日') != -1 ) {
url = item.url;
break;
}
}
// 保存到env文件中
url && this.saveEnv(url);
}
})
}
/**
* 通过读取env文件 并替换掉需要查询的url
*/
saveEnv(url) {
try{
this.options.url = url;
let str = fs.readFileSync('.env').toString('utf-8');
str = str.replace(/((URL = |URL= |URL =)((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+)|(URL =|URL=|URL)/g,'URL = ' + url);
fs.writeFile('.env', str,err => {
!err && console.log("写入到.env配置文件成功")
});
}catch(err){
console.log('错误', err);
}
}
/**
* 保存到json文件
*/
saveDataFile() {
const updated_at = new Date().toLocaleString();
const remark = this.options.remark_preifx + "\n\r更新日期:" + updated_at;
const data = {legal: this.legal,legalWork: this.legalWork,legalObj: this.legalObj, remark,updated_at}
fs.writeFile(this.options.config_file,JSON.stringify(data, null, 4), err => {
if(!err) console.log("success~");
});
}
/**
* 通过 文件来读取 变量
*/
getDataFile() {
try{
const data = fs.readFileSync(this.options.config_file);
const str = data.toString();
if(str) {
const obj = JSON.parse(str)
for(const i in obj) {
this[i] = obj[i];
}
} else {
// 重新爬取
this.curlLegal();
return false;
}
}catch(Err){
this.curlLegal();
return false;
}
}
/**
* 需要解析的文本
* @param {*} txt 需要解析的文本
* @param {*} legal 节假日
* @param {*} legalWork 工作日
* @returns
*/
getChangeTitleStr(txt,legal, legalWork) {
const year = new Date().getFullYear();
if (!txt || txt.indexOf('、') == -1 || txt.indexOf(':') == -1 || txt.indexOf('共') == -1) {
return true;
}
// 获取到 什么节
const matchs = txt.match(/、[\u4e00-\u9fa5]{1,10}/g);
if (!matchs) {
return true;
}
const legalTitle = matchs[0].toString().substr(1);
// 获取到 放假天数
const dayMatchs = txt.match(/共\d{1,2}天/g);
if (!dayMatchs || dayMatchs.length == 0) {
return true;
}
const day = parseFloat(dayMatchs[0].split('�
程序猿小D
- 粉丝: 4355
- 资源: 1228
最新资源
- Labview多列列表框操作框架,JKI+队列状态机,带一些OOP,扩展性强,具体看下图
- 移动机器人动态避障仿真,DWA方法,包含静态障碍物和动态障碍物,实现对障碍物避障的路径规划
- 基于stm32芯片仿真的倒车测距提示系统 包含演示视频 报告 proteus仿真 keil代码 以stm32为最小系统电路进行连接,按钮控制系统开关,使用SRF04采集倒车,LM016L液晶显示屏显示
- 魔术公式轮胎模型,m文件,magic formula 可供参考
- Matlab代码:含热网的综合能源系统(IES)优化运行 风电、光伏、CHP机组(燃气燃煤)、燃气锅炉、火力发电机组,吸收式制冷机、电制冷机、蓄电池,蓄热罐等设备 负荷类型:冷、热、电 优化目标:IE
- 昆仑通泰mcgs触摸屏和台达VFD-M变频器和天正变频器的rtu通讯示例硬件:mcgs触摸屏(没屏电脑也可实现),台达vfd-m变频器
- MATLAB环境下一种基于机器学习(霍特林统计量,高斯混合模型,支持向量机)的工业数据异常检测 算法运行环境为MATLAB R2021B,执行基于机器学习(霍特林统计量,高斯混合模型,支持向量机)的
- 基于自适应滑膜观测器的轮胎力估计,可估计纵向轮胎力和侧向轮胎力,估计的结果比dugoff轮胎模型计算轮胎力的精度更高 基于分布式驱动电动汽车的车辆状态估计,分别采用无迹卡尔曼,容积卡尔曼进行估计,可
- 电钻方案,电扳手方案,低速力矩保持,堵转不停,脉冲注入 IPD初始位置检测,无刷电机控制方案,BLDC控制器,电动工具开发套件 含有脉冲注入检测位置,具备电感法 含有过温保护,过流保护,欠压保护等
- 51单片机开发的8层电梯项目,定时模拟版,包括程序源码和protues仿真,程序源码注释详细,非常适合单片机开发人员
- 威纶通MODBUS控制两台台达变频器通讯程序 ~ 可以通过触摸屏控制变频器正反转,运行停止,还能监视变频器的运行频率,输出频率,输出电压,输出电流以及转速 有做笔记,详细内容见笔记 EB8000
- DAB双有源全桥MATLAB双闭环移相ZVS 高频隔离DC DC变器模型(DAB-双有源全桥),基于MATLAB Simulink建模仿真 电压电流双闭环控制,功率双向流动,ZVS软开关 仿真模型
- carsim-simulink联合仿真,ACC自动巡航跟随 在simulink搭建控制策略,上下层分层控制 包含安全距离模型,逆发动机模型,逆制动模型,制动 驱动策略切模块,cpar文件,simf
- soc基于Matlab Simulink实现了以下功能,搭建了储能系统变模型以及钒液流电池模型,仿真效果较好,系统充放电正常 下图为系统模型图,电池输出电压电流以及SOC波形 1.钒液流电池本体建
- Webots 12自由度四足robot仿真模型 四条独立运动的腿,单腿含有三个自由度,每个自由度包含一个电机和一个电机编码器,可以像舵机一样使用位置控制,也可结合编码器使用力矩 单腿的足端包含一个
- 英威腾GD300驱动板IO板主控板方案资料原理图 英威腾变频器GD300量产方案 程序源码 主控板、驱动板、IO板 原理图 PCB bom 工艺文件,源程序
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈