kaoqin-services
Version:
考勤系统服务库 (重构版 - 支持n8n webhook)
1 lines • 3.64 kB
JavaScript
;const fs=require("fs"),path=require("path"),dayjs=require("dayjs");class HolidayService{constructor(a={}){this.holidayFilePath=a.holidayFilePath||path.join(__dirname,"../../holiday.json"),this.holidayData=this.loadHolidayData(),this.stateManager=a.stateManager}loadHolidayData(){try{if(fs.existsSync(this.holidayFilePath)){const a=fs.readFileSync(this.holidayFilePath,"utf8"),b=JSON.parse(a);return console.log("\u5DF2\u52A0\u8F7D\u8282\u5047\u65E5\u6570\u636E"),b}return console.log("\u8282\u5047\u65E5\u6570\u636E\u6587\u4EF6\u4E0D\u5B58\u5728"),null}catch(a){return console.error("\u8BFB\u53D6\u8282\u5047\u65E5\u6570\u636E\u5931\u8D25:",a),null}}async queryHolidayInfo(a){const b=dayjs(a).format("YYYY-MM-DD");try{if(console.log(`查询节假日信息: ${b}`),!this.holidayData||!this.holidayData.Years)return console.warn("\u8282\u5047\u65E5\u6570\u636E\u4E0D\u5B58\u5728\u6216\u683C\u5F0F\u9519\u8BEF\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u89C4\u5219"),this.getDefaultHolidayInfo(a);const c=b.substring(0,4),d=new Date(b);let e=null,f=!1,g=!1;if(this.holidayData.Years[c]){const a=this.holidayData.Years[c];for(const c of a)if(c.CompDays&&c.CompDays.includes(b)){g=!0,e=`${c.Name}补班`;break}if(!g)for(const b of a){const a=new Date(b.StartDate),c=new Date(b.EndDate);if(d>=a&&d<=c){f=!0,e=b.Name;break}}}else return console.warn(`节假日数据中没有${c}年的信息,使用默认规则`),this.getDefaultHolidayInfo(a);const h=dayjs(a).isoWeekday(),i=5<h;f||g||!i||(e=6===h?"\u5468\u516D":"\u5468\u65E5");const j=g||!f&&!i,k={isWorkday:j,holidayName:e,isWeekend:i&&!g,isHoliday:f,isInLieu:g};return k}catch(b){return console.error("\u67E5\u8BE2\u8282\u5047\u65E5\u4FE1\u606F\u5931\u8D25:",b.message),this.getDefaultHolidayInfo(a)}}getDefaultHolidayInfo(a){const b=dayjs(a).isoWeekday(),c=5<b;return{isWorkday:!c,holidayName:c?6===b?"\u5468\u516D":"\u5468\u65E5":null,isWeekend:c,isHoliday:!1,isInLieu:!1}}async isWorkday(a){return await this.queryHolidayInfo(a)}async getHolidayName(a){const b=await this.queryHolidayInfo(a);return b.holidayName}generateGreeting(a,b){if(!b)return null;let c=`今天是${b},祝您假日愉快!`;return b.includes("\u6625\u8282")||b.includes("\u9664\u5915")?c=`${b}到了,祝您新年快乐,万事如意!`:b.includes("\u5143\u65E6")?c=`${b}到了,祝您新的一年平安喜乐!`:b.includes("\u4E2D\u79CB")?c=`${b}到了,祝您阖家团圆,月圆人圆!`:b.includes("\u56FD\u5E86")?c=`${b}到了,祝祖国繁荣昌盛,祝您假期愉快!`:b.includes("\u52B3\u52A8\u8282")?c=`${b}到了,祝您劳有所得,假期愉快!`:(b.includes("\u5468\u516D")||b.includes("\u5468\u65E5"))&&(c=`今天是${b},祝您周末愉快!`),c}async sendHolidayGreeting(a,b){try{const c=dayjs(a).format("YYYY-MM-DD"),d=dayjs(a).format("YYYY\u5E74MM\u6708DD\u65E5");if(this.stateManager){const a=this.stateManager.get("lastDate");a!==c&&(console.log(`状态日期(${a})与目标日期(${c})不一致,重置状态`),this.stateManager.resetState(c))}if(this.stateManager&&this.stateManager.get("hasSentHolidayGreeting"))return console.log(`今日节假日问候已发送,不重复发送`),!1;const e=await this.queryHolidayInfo(a),f=e.holidayName||"\u5047\u65E5",g=this.generateGreeting(a,f);return!!(g&&b)&&(await b.sendHolidayGreeting(d,f,g),console.log(`已发送${f}问候消息`),this.stateManager&&(this.stateManager.set("hasSentHolidayGreeting",!0),console.log("\u8BBE\u7F6E\u8282\u5047\u65E5\u95EE\u5019\u6807\u8BC6\u4E3A\u5DF2\u53D1\u9001")),!0)}catch(a){return console.error("\u53D1\u9001\u8282\u65E5\u95EE\u5019\u5931\u8D25:",a),!1}}}module.exports=HolidayService;