You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
5.9 KiB
201 lines
5.9 KiB
/* * |
|
@Author: drfu* |
|
@Description: 显示法定节假日班/休情况 |
|
@Date: 2020-10-12 14:29:45* |
|
* @Last Modified by: drfu |
|
* @Last Modified time: 2020-10-16 17:34:13 |
|
*/ |
|
|
|
import { holidays, festival } from './holidays-map' |
|
import { dateUtil, getCalendarData, logger } from '../../utils/index' |
|
|
|
/** |
|
* 当前是否在休假期内 |
|
* @param {object} { year, month } |
|
* @param {object} { start, end, current } |
|
* @returns |
|
*/ |
|
function inHolidays({ year, month }, { start, end, current }) { |
|
const getTimeStamp = dateUtil.getTimeStamp |
|
const startTimestamp = getTimeStamp({ |
|
year, |
|
month, |
|
date: start |
|
}) |
|
const endTimestamp = getTimeStamp({ |
|
year, |
|
month, |
|
date: end |
|
}) |
|
const currentDateTimestamp = getTimeStamp({ |
|
year, |
|
month, |
|
date: current |
|
}) |
|
if ( |
|
currentDateTimestamp >= startTimestamp && |
|
currentDateTimestamp <= endTimestamp |
|
) { |
|
return true |
|
} |
|
return false |
|
} |
|
|
|
function addSpecialFestival(date, component) { |
|
const { convertlLunar2Solar, convertSolarLunar } = component.calendar || {} |
|
const lunarDateInfo = convertSolarLunar(date) |
|
const { lYear, lMonth } = lunarDateInfo || {} |
|
// 春节 |
|
const info = { |
|
type: 'festival', |
|
name: '除夕', |
|
label: '除夕' |
|
} |
|
if (lMonth === 12) { |
|
if (!festival.lunar['12']) festival.lunar['12'] = {} |
|
if (convertlLunar2Solar(`${lYear}-12-30`) === -1) { |
|
festival.lunar['12']['29'] = info |
|
} else { |
|
festival.lunar['12']['30'] = info |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* 是否匹配到节日 |
|
* @param {object} [dateInfo={}] |
|
* @param {object} [component={}] |
|
* @returns {object|boolean} 匹配到的节日数据或者false |
|
*/ |
|
function hasFestivalDate(dateInfo = {}, component = {}) { |
|
const { month, date } = dateInfo |
|
let festivalDate = festival.solar[month] && festival.solar[month][date] |
|
if (!festivalDate) { |
|
const { convertSolarLunar } = component.calendar || {} |
|
const lunarDateInfo = convertSolarLunar(dateInfo) |
|
const { lMonth, lDay } = lunarDateInfo |
|
festivalDate = festival.lunar[lMonth] && festival.lunar[lMonth][lDay] |
|
if (!festivalDate) { |
|
const festivalOfMonth = festival.lunar[lMonth] || {} |
|
const festivalDateKey = Object.keys(festivalOfMonth).find(item => |
|
item.match(new RegExp(`\\b${lDay}\\b`)) |
|
) |
|
if (!festivalDateKey) { |
|
festivalDate = false |
|
} else { |
|
const festivalInfo = festival.lunar[lMonth][festivalDateKey] |
|
if (!festivalInfo) { |
|
festivalDate = false |
|
} else { |
|
const { condition } = festivalInfo |
|
if (typeof condition === 'function') { |
|
festivalDate = condition(lunarDateInfo) |
|
} else { |
|
festivalDate = false |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return festivalDate |
|
} |
|
|
|
export default () => { |
|
return { |
|
name: 'holidays', |
|
beforeRender(calendarData = {}, calendarConfig = {}, component) { |
|
let { dates = [] } = calendarData |
|
if (calendarConfig.showHolidays || calendarConfig.showFestival) { |
|
dates = dates.map(d => { |
|
let item = { ...d } |
|
const { year, month, date } = item |
|
const holidaysOfMonth = |
|
(holidays[year] && holidays[year][month]) || {} |
|
const holidayDate = holidaysOfMonth[date] |
|
if (holidayDate) { |
|
item = { |
|
...item, |
|
...holidayDate |
|
} |
|
} else { |
|
const holidayKeys = Object.keys(holidaysOfMonth).filter(item => |
|
item.includes('-') |
|
) |
|
let target = '' |
|
for (let v of holidayKeys) { |
|
const [start, end] = v.split('-') |
|
if (+d.date >= +start && +d.date <= +end) { |
|
target = v |
|
break |
|
} |
|
} |
|
const [start, end] = target.split('-') |
|
const isInHolidays = inHolidays( |
|
{ |
|
year, |
|
month |
|
}, |
|
{ |
|
start, |
|
end, |
|
current: date |
|
} |
|
) |
|
if (isInHolidays) { |
|
item = { |
|
...item, |
|
...holidaysOfMonth[target] |
|
} |
|
} else if (calendarConfig.showFestival) { |
|
const { convertSolarLunar, convertlLunar2Solar } = |
|
component.calendar || {} |
|
if ( |
|
typeof convertSolarLunar !== 'function' || |
|
typeof convertlLunar2Solar !== 'function' |
|
) { |
|
return logger.warn( |
|
'农历节日显示需要引入农历插件(/component/v2/plugins/solarLunar)' |
|
) |
|
} |
|
addSpecialFestival(item, component) |
|
const festivalDate = hasFestivalDate(item, component) |
|
if (festivalDate) { |
|
item = { |
|
...item, |
|
...festivalDate |
|
} |
|
} |
|
} |
|
} |
|
return item |
|
}) |
|
} |
|
return { |
|
calendarData: { |
|
...calendarData, |
|
dates: dates |
|
}, |
|
calendarConfig |
|
} |
|
}, |
|
methods(component) { |
|
return { |
|
getHolidaysOfCurrentYear() { |
|
const calendar = getCalendarData('calendar', component) |
|
const { curYear } = calendar |
|
return this.methods(component).getHolidaysOfYear(curYear) |
|
}, |
|
getHolidaysOfYear(year) { |
|
if (!year) return logger.warn('getHolidaysOfCurrentYear() 入参错误') |
|
if (!holidays[year]) { |
|
logger.warn('未匹配到当前年份节假日信息,请自行补充') |
|
return { |
|
err: 'not match' |
|
} |
|
} |
|
return holidays[year] |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|