初始提交
This commit is contained in:
546
pages/workFlow/schedule/calendar/calendar.js
Normal file
546
pages/workFlow/schedule/calendar/calendar.js
Normal file
@@ -0,0 +1,546 @@
|
||||
/**
|
||||
* @1900-2100区间内的公历、农历互转
|
||||
* @charset UTF-8
|
||||
* @github https://github.com/jjonline/calendar.js
|
||||
* @Author Jea杨(JJonline@JJonline.Cn)
|
||||
* @Time 2014-7-21
|
||||
* @Time 2016-8-13 Fixed 2033hex、Attribution Annals
|
||||
* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug
|
||||
* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
|
||||
* @Version 1.0.3
|
||||
* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
|
||||
* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
|
||||
*/
|
||||
/* eslint-disable */
|
||||
var calendar = {
|
||||
|
||||
/**
|
||||
* 农历1900-2100的润大小信息表
|
||||
* @Array Of Property
|
||||
* @return Hex
|
||||
*/
|
||||
lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909
|
||||
0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919
|
||||
0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929
|
||||
0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939
|
||||
0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949
|
||||
0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959
|
||||
0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969
|
||||
0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979
|
||||
0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989
|
||||
0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999
|
||||
0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009
|
||||
0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019
|
||||
0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029
|
||||
0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039
|
||||
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049
|
||||
/** Add By JJonline@JJonline.Cn**/
|
||||
0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059
|
||||
0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069
|
||||
0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079
|
||||
0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089
|
||||
0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099
|
||||
0x0d520], // 2100
|
||||
|
||||
/**
|
||||
* 公历每个月份的天数普通表
|
||||
* @Array Of Property
|
||||
* @return Number
|
||||
*/
|
||||
solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
|
||||
|
||||
/**
|
||||
* 天干地支之天干速查表
|
||||
* @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
|
||||
* @return Cn string
|
||||
*/
|
||||
Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'],
|
||||
|
||||
/**
|
||||
* 天干地支之地支速查表
|
||||
* @Array Of Property
|
||||
* @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
|
||||
* @return Cn string
|
||||
*/
|
||||
Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'],
|
||||
|
||||
/**
|
||||
* 天干地支之地支速查表<=>生肖
|
||||
* @Array Of Property
|
||||
* @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
|
||||
* @return Cn string
|
||||
*/
|
||||
Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'],
|
||||
|
||||
/**
|
||||
* 24节气速查表
|
||||
* @Array Of Property
|
||||
* @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
|
||||
* @return Cn string
|
||||
*/
|
||||
solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'],
|
||||
|
||||
/**
|
||||
* 1900-2100各年的24节气日期速查表
|
||||
* @Array Of Property
|
||||
* @return 0x string For splice
|
||||
*/
|
||||
sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f',
|
||||
'97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
|
||||
'97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',
|
||||
'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',
|
||||
'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',
|
||||
'97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',
|
||||
'97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',
|
||||
'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',
|
||||
'97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',
|
||||
'97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',
|
||||
'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',
|
||||
'97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
|
||||
'97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',
|
||||
'9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',
|
||||
'97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
|
||||
'97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
|
||||
'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',
|
||||
'7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
|
||||
'97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
|
||||
'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',
|
||||
'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
|
||||
'97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
|
||||
'9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',
|
||||
'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
|
||||
'97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
|
||||
'9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
|
||||
'7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
|
||||
'9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
|
||||
'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
|
||||
'97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
|
||||
'9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
|
||||
'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',
|
||||
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',
|
||||
'977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
|
||||
'7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',
|
||||
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
|
||||
'977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
|
||||
'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',
|
||||
'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
|
||||
'977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
|
||||
'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',
|
||||
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',
|
||||
'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',
|
||||
'7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
|
||||
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',
|
||||
'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
|
||||
'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',
|
||||
'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',
|
||||
'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',
|
||||
'7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
|
||||
'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',
|
||||
'7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',
|
||||
'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',
|
||||
'665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
|
||||
'7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',
|
||||
'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'],
|
||||
|
||||
/**
|
||||
* 数字转中文速查表
|
||||
* @Array Of Property
|
||||
* @trans ['日','一','二','三','四','五','六','七','八','九','十']
|
||||
* @return Cn string
|
||||
*/
|
||||
nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'],
|
||||
|
||||
/**
|
||||
* 日期转农历称呼速查表
|
||||
* @Array Of Property
|
||||
* @trans ['初','十','廿','卅']
|
||||
* @return Cn string
|
||||
*/
|
||||
nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'],
|
||||
|
||||
/**
|
||||
* 月份转农历称呼速查表
|
||||
* @Array Of Property
|
||||
* @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
|
||||
* @return Cn string
|
||||
*/
|
||||
nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'],
|
||||
|
||||
/**
|
||||
* 返回农历y年一整年的总天数
|
||||
* @param lunar Year
|
||||
* @return Number
|
||||
* @eg:var count = calendar.lYearDays(1987) ;//count=387
|
||||
*/
|
||||
lYearDays: function (y) {
|
||||
var i; var sum = 348
|
||||
for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 }
|
||||
return (sum + this.leapDays(y))
|
||||
},
|
||||
|
||||
/**
|
||||
* 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
|
||||
* @param lunar Year
|
||||
* @return Number (0-12)
|
||||
* @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
|
||||
*/
|
||||
leapMonth: function (y) { // 闰字编码 \u95f0
|
||||
return (this.lunarInfo[y - 1900] & 0xf)
|
||||
},
|
||||
|
||||
/**
|
||||
* 返回农历y年闰月的天数 若该年没有闰月则返回0
|
||||
* @param lunar Year
|
||||
* @return Number (0、29、30)
|
||||
* @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
|
||||
*/
|
||||
leapDays: function (y) {
|
||||
if (this.leapMonth(y)) {
|
||||
return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29)
|
||||
}
|
||||
return (0)
|
||||
},
|
||||
|
||||
/**
|
||||
* 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
|
||||
* @param lunar Year
|
||||
* @return Number (-1、29、30)
|
||||
* @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
|
||||
*/
|
||||
monthDays: function (y, m) {
|
||||
if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1
|
||||
return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29)
|
||||
},
|
||||
|
||||
/**
|
||||
* 返回公历(!)y年m月的天数
|
||||
* @param solar Year
|
||||
* @return Number (-1、28、29、30、31)
|
||||
* @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
|
||||
*/
|
||||
solarDays: function (y, m) {
|
||||
if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
|
||||
var ms = m - 1
|
||||
if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29
|
||||
return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28)
|
||||
} else {
|
||||
return (this.solarMonth[ms])
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 农历年份转换为干支纪年
|
||||
* @param lYear 农历年的年份数
|
||||
* @return Cn string
|
||||
*/
|
||||
toGanZhiYear: function (lYear) {
|
||||
var ganKey = (lYear - 3) % 10
|
||||
var zhiKey = (lYear - 3) % 12
|
||||
if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干
|
||||
if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支
|
||||
return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1]
|
||||
},
|
||||
|
||||
/**
|
||||
* 公历月、日判断所属星座
|
||||
* @param cMonth [description]
|
||||
* @param cDay [description]
|
||||
* @return Cn string
|
||||
*/
|
||||
toAstro: function (cMonth, cDay) {
|
||||
var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf'
|
||||
var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22]
|
||||
return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入offset偏移量返回干支
|
||||
* @param offset 相对甲子的偏移量
|
||||
* @return Cn string
|
||||
*/
|
||||
toGanZhi: function (offset) {
|
||||
return this.Gan[offset % 10] + this.Zhi[offset % 12]
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入公历(!)y年获得该年第n个节气的公历日期
|
||||
* @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
|
||||
* @return day Number
|
||||
* @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
|
||||
*/
|
||||
getTerm: function (y, n) {
|
||||
if (y < 1900 || y > 2100) { return -1 }
|
||||
if (n < 1 || n > 24) { return -1 }
|
||||
var _table = this.sTermInfo[y - 1900]
|
||||
var _info = [
|
||||
parseInt('0x' + _table.substr(0, 5)).toString(),
|
||||
parseInt('0x' + _table.substr(5, 5)).toString(),
|
||||
parseInt('0x' + _table.substr(10, 5)).toString(),
|
||||
parseInt('0x' + _table.substr(15, 5)).toString(),
|
||||
parseInt('0x' + _table.substr(20, 5)).toString(),
|
||||
parseInt('0x' + _table.substr(25, 5)).toString()
|
||||
]
|
||||
var _calday = [
|
||||
_info[0].substr(0, 1),
|
||||
_info[0].substr(1, 2),
|
||||
_info[0].substr(3, 1),
|
||||
_info[0].substr(4, 2),
|
||||
|
||||
_info[1].substr(0, 1),
|
||||
_info[1].substr(1, 2),
|
||||
_info[1].substr(3, 1),
|
||||
_info[1].substr(4, 2),
|
||||
|
||||
_info[2].substr(0, 1),
|
||||
_info[2].substr(1, 2),
|
||||
_info[2].substr(3, 1),
|
||||
_info[2].substr(4, 2),
|
||||
|
||||
_info[3].substr(0, 1),
|
||||
_info[3].substr(1, 2),
|
||||
_info[3].substr(3, 1),
|
||||
_info[3].substr(4, 2),
|
||||
|
||||
_info[4].substr(0, 1),
|
||||
_info[4].substr(1, 2),
|
||||
_info[4].substr(3, 1),
|
||||
_info[4].substr(4, 2),
|
||||
|
||||
_info[5].substr(0, 1),
|
||||
_info[5].substr(1, 2),
|
||||
_info[5].substr(3, 1),
|
||||
_info[5].substr(4, 2)
|
||||
]
|
||||
return parseInt(_calday[n - 1])
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入农历数字月份返回汉语通俗表示法
|
||||
* @param lunar month
|
||||
* @return Cn string
|
||||
* @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
|
||||
*/
|
||||
toChinaMonth: function (m) { // 月 => \u6708
|
||||
if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1
|
||||
var s = this.nStr3[m - 1]
|
||||
s += '\u6708'// 加上月字
|
||||
return s
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入农历日期数字返回汉字表示法
|
||||
* @param lunar day
|
||||
* @return Cn string
|
||||
* @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
|
||||
*/
|
||||
toChinaDay: function (d) { // 日 => \u65e5
|
||||
var s
|
||||
switch (d) {
|
||||
case 10:
|
||||
s = '\u521d\u5341'; break
|
||||
case 20:
|
||||
s = '\u4e8c\u5341'; break
|
||||
break
|
||||
case 30:
|
||||
s = '\u4e09\u5341'; break
|
||||
break
|
||||
default :
|
||||
s = this.nStr2[Math.floor(d / 10)]
|
||||
s += this.nStr1[d % 10]
|
||||
}
|
||||
return (s)
|
||||
},
|
||||
|
||||
/**
|
||||
* 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
|
||||
* @param y year
|
||||
* @return Cn string
|
||||
* @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
|
||||
*/
|
||||
getAnimal: function (y) {
|
||||
return this.Animals[(y - 4) % 12]
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
|
||||
* @param y solar year
|
||||
* @param m solar month
|
||||
* @param d solar day
|
||||
* @return JSON object
|
||||
* @eg:console.log(calendar.solar2lunar(1987,11,01));
|
||||
*/
|
||||
solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31
|
||||
// 年份限定、上限
|
||||
if (y < 1900 || y > 2100) {
|
||||
return -1// undefined转换为数字变为NaN
|
||||
}
|
||||
// 公历传参最下限
|
||||
if (y == 1900 && m == 1 && d < 31) {
|
||||
return -1
|
||||
}
|
||||
// 未传参 获得当天
|
||||
if (!y) {
|
||||
var objDate = new Date()
|
||||
} else {
|
||||
var objDate = new Date(y, parseInt(m) - 1, d)
|
||||
}
|
||||
var i; var leap = 0; var temp = 0
|
||||
// 修正ymd参数
|
||||
var y = objDate.getFullYear()
|
||||
var m = objDate.getMonth() + 1
|
||||
var d = objDate.getDate()
|
||||
var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000
|
||||
for (i = 1900; i < 2101 && offset > 0; i++) {
|
||||
temp = this.lYearDays(i)
|
||||
offset -= temp
|
||||
}
|
||||
if (offset < 0) {
|
||||
offset += temp; i--
|
||||
}
|
||||
|
||||
// 是否今天
|
||||
var isTodayObj = new Date()
|
||||
var isToday = false
|
||||
if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
|
||||
isToday = true
|
||||
}
|
||||
// 星期几
|
||||
var nWeek = objDate.getDay()
|
||||
var cWeek = this.nStr1[nWeek]
|
||||
// 数字表示周几顺应天朝周一开始的惯例
|
||||
if (nWeek == 0) {
|
||||
nWeek = 7
|
||||
}
|
||||
// 农历年
|
||||
var year = i
|
||||
var leap = this.leapMonth(i) // 闰哪个月
|
||||
var isLeap = false
|
||||
|
||||
// 效验闰月
|
||||
for (i = 1; i < 13 && offset > 0; i++) {
|
||||
// 闰月
|
||||
if (leap > 0 && i == (leap + 1) && isLeap == false) {
|
||||
--i
|
||||
isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数
|
||||
} else {
|
||||
temp = this.monthDays(year, i)// 计算农历普通月天数
|
||||
}
|
||||
// 解除闰月
|
||||
if (isLeap == true && i == (leap + 1)) { isLeap = false }
|
||||
offset -= temp
|
||||
}
|
||||
// 闰月导致数组下标重叠取反
|
||||
if (offset == 0 && leap > 0 && i == leap + 1) {
|
||||
if (isLeap) {
|
||||
isLeap = false
|
||||
} else {
|
||||
isLeap = true; --i
|
||||
}
|
||||
}
|
||||
if (offset < 0) {
|
||||
offset += temp; --i
|
||||
}
|
||||
// 农历月
|
||||
var month = i
|
||||
// 农历日
|
||||
var day = offset + 1
|
||||
// 天干地支处理
|
||||
var sm = m - 1
|
||||
var gzY = this.toGanZhiYear(year)
|
||||
|
||||
// 当月的两个节气
|
||||
// bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
|
||||
var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始
|
||||
var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始
|
||||
|
||||
// 依据12节气修正干支月
|
||||
var gzM = this.toGanZhi((y - 1900) * 12 + m + 11)
|
||||
if (d >= firstNode) {
|
||||
gzM = this.toGanZhi((y - 1900) * 12 + m + 12)
|
||||
}
|
||||
|
||||
// 传入的日期的节气与否
|
||||
var isTerm = false
|
||||
var Term = null
|
||||
if (firstNode == d) {
|
||||
isTerm = true
|
||||
Term = this.solarTerm[m * 2 - 2]
|
||||
}
|
||||
if (secondNode == d) {
|
||||
isTerm = true
|
||||
Term = this.solarTerm[m * 2 - 1]
|
||||
}
|
||||
// 日柱 当月一日与 1900/1/1 相差天数
|
||||
var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10
|
||||
var gzD = this.toGanZhi(dayCyclical + d - 1)
|
||||
// 该日期所属的星座
|
||||
var astro = this.toAstro(m, d)
|
||||
|
||||
return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro }
|
||||
},
|
||||
|
||||
/**
|
||||
* 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
|
||||
* @param y lunar year
|
||||
* @param m lunar month
|
||||
* @param d lunar day
|
||||
* @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
|
||||
* @return JSON object
|
||||
* @eg:console.log(calendar.lunar2solar(1987,9,10));
|
||||
*/
|
||||
lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1
|
||||
var isLeapMonth = !!isLeapMonth
|
||||
var leapOffset = 0
|
||||
var leapMonth = this.leapMonth(y)
|
||||
var leapDay = this.leapDays(y)
|
||||
if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
|
||||
if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值
|
||||
var day = this.monthDays(y, m)
|
||||
var _day = day
|
||||
// bugFix 2016-9-25
|
||||
// if month is leap, _day use leapDays method
|
||||
if (isLeapMonth) {
|
||||
_day = this.leapDays(y, m)
|
||||
}
|
||||
if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验
|
||||
|
||||
// 计算农历的时间差
|
||||
var offset = 0
|
||||
for (var i = 1900; i < y; i++) {
|
||||
offset += this.lYearDays(i)
|
||||
}
|
||||
var leap = 0; var isAdd = false
|
||||
for (var i = 1; i < m; i++) {
|
||||
leap = this.leapMonth(y)
|
||||
if (!isAdd) { // 处理闰月
|
||||
if (leap <= i && leap > 0) {
|
||||
offset += this.leapDays(y); isAdd = true
|
||||
}
|
||||
}
|
||||
offset += this.monthDays(y, i)
|
||||
}
|
||||
// 转换闰月农历 需补充该年闰月的前一个月的时差
|
||||
if (isLeapMonth) { offset += day }
|
||||
// 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
|
||||
var stmap = Date.UTC(1900, 1, 30, 0, 0, 0)
|
||||
var calObj = new Date((offset + d - 31) * 86400000 + stmap)
|
||||
var cY = calObj.getUTCFullYear()
|
||||
var cM = calObj.getUTCMonth() + 1
|
||||
var cD = calObj.getUTCDate()
|
||||
|
||||
return this.solar2lunar(cY, cM, cD)
|
||||
}
|
||||
}
|
||||
|
||||
export default calendar
|
||||
12
pages/workFlow/schedule/calendar/i18n/en.json
Normal file
12
pages/workFlow/schedule/calendar/i18n/en.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"uni-calender.ok": "ok",
|
||||
"uni-calender.cancel": "cancel",
|
||||
"uni-calender.today": "today",
|
||||
"uni-calender.MON": "MON",
|
||||
"uni-calender.TUE": "TUE",
|
||||
"uni-calender.WED": "WED",
|
||||
"uni-calender.THU": "THU",
|
||||
"uni-calender.FRI": "FRI",
|
||||
"uni-calender.SAT": "SAT",
|
||||
"uni-calender.SUN": "SUN"
|
||||
}
|
||||
8
pages/workFlow/schedule/calendar/i18n/index.js
Normal file
8
pages/workFlow/schedule/calendar/i18n/index.js
Normal file
@@ -0,0 +1,8 @@
|
||||
import en from './en.json'
|
||||
import zhHans from './zh-Hans.json'
|
||||
import zhHant from './zh-Hant.json'
|
||||
export default {
|
||||
en,
|
||||
'zh-Hans': zhHans,
|
||||
'zh-Hant': zhHant
|
||||
}
|
||||
12
pages/workFlow/schedule/calendar/i18n/zh-Hans.json
Normal file
12
pages/workFlow/schedule/calendar/i18n/zh-Hans.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"uni-calender.ok": "确定",
|
||||
"uni-calender.cancel": "取消",
|
||||
"uni-calender.today": "今日",
|
||||
"uni-calender.SUN": "日",
|
||||
"uni-calender.MON": "一",
|
||||
"uni-calender.TUE": "二",
|
||||
"uni-calender.WED": "三",
|
||||
"uni-calender.THU": "四",
|
||||
"uni-calender.FRI": "五",
|
||||
"uni-calender.SAT": "六"
|
||||
}
|
||||
12
pages/workFlow/schedule/calendar/i18n/zh-Hant.json
Normal file
12
pages/workFlow/schedule/calendar/i18n/zh-Hant.json
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"uni-calender.ok": "確定",
|
||||
"uni-calender.cancel": "取消",
|
||||
"uni-calender.today": "今日",
|
||||
"uni-calender.SUN": "日",
|
||||
"uni-calender.MON": "一",
|
||||
"uni-calender.TUE": "二",
|
||||
"uni-calender.WED": "三",
|
||||
"uni-calender.THU": "四",
|
||||
"uni-calender.FRI": "五",
|
||||
"uni-calender.SAT": "六"
|
||||
}
|
||||
194
pages/workFlow/schedule/calendar/uni-calendar-item.vue
Normal file
194
pages/workFlow/schedule/calendar/uni-calendar-item.vue
Normal file
@@ -0,0 +1,194 @@
|
||||
<template>
|
||||
<view class="uni-calendar-item__weeks-box" :class="{
|
||||
'uni-calendar-item--disable':weeks.disable,
|
||||
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
|
||||
'uni-calendar-item--checked':(calendar.fullDate === weeks.fullDate && !weeks.isDay) ,
|
||||
'uni-calendar-item--before-checked':weeks.beforeMultiple,
|
||||
'uni-calendar-item--multiple': weeks.multiple,
|
||||
'uni-calendar-item--after-checked':weeks.afterMultiple,
|
||||
}" @click="choiceDate(weeks)">
|
||||
<view class="uni-calendar-item__weeks-box-item">
|
||||
<text v-if="selected&&weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text>
|
||||
<text class="uni-calendar-item__weeks-box-text" :class="{
|
||||
'uni-calendar-item--isDay-text': weeks.isDay,
|
||||
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
|
||||
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
|
||||
'uni-calendar-item--before-checked':weeks.beforeMultiple,
|
||||
'uni-calendar-item--multiple': weeks.multiple,
|
||||
'uni-calendar-item--after-checked':weeks.afterMultiple,
|
||||
'uni-calendar-item--disable':weeks.disable,
|
||||
}">{{weeks.date}}</text>
|
||||
<text v-if="!lunar&&!weeks.extraInfo && weeks.isDay" class="uni-calendar-item__weeks-lunar-text" :class="{
|
||||
'uni-calendar-item--isDay-text':weeks.isDay,
|
||||
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
|
||||
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
|
||||
'uni-calendar-item--before-checked':weeks.beforeMultiple,
|
||||
'uni-calendar-item--multiple': weeks.multiple,
|
||||
'uni-calendar-item--after-checked':weeks.afterMultiple,
|
||||
}">{{todayText}}</text>
|
||||
<text v-if="lunar" class="uni-calendar-item__weeks-lunar-text" :class="{
|
||||
'uni-calendar-item--isDay-text':weeks.isDay,
|
||||
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
|
||||
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
|
||||
'uni-calendar-item--before-checked':weeks.beforeMultiple,
|
||||
'uni-calendar-item--multiple': weeks.multiple,
|
||||
'uni-calendar-item--after-checked':weeks.afterMultiple,
|
||||
'uni-calendar-item--disable':weeks.disable,
|
||||
}">{{weeks.isDay ? todayText : (weeks.lunar.IDayCn === '初一'?weeks.lunar.IMonthCn:weeks.lunar.IDayCn)}}</text>
|
||||
<text v-if="weeks.extraInfo&&weeks.extraInfo.info" class="uni-calendar-item__weeks-lunar-text" :class="{
|
||||
'uni-calendar-item--extra':weeks.extraInfo.info,
|
||||
'uni-calendar-item--isDay-text':weeks.isDay,
|
||||
'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
|
||||
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
|
||||
'uni-calendar-item--before-checked':weeks.beforeMultiple,
|
||||
'uni-calendar-item--multiple': weeks.multiple,
|
||||
'uni-calendar-item--after-checked':weeks.afterMultiple,
|
||||
'uni-calendar-item--disable':weeks.disable,
|
||||
}">{{weeks.extraInfo.info}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
initVueI18n
|
||||
} from '@dcloudio/uni-i18n'
|
||||
import i18nMessages from './i18n/index.js'
|
||||
const {
|
||||
t
|
||||
} = initVueI18n(i18nMessages)
|
||||
|
||||
export default {
|
||||
emits: ['change'],
|
||||
props: {
|
||||
weeks: {
|
||||
type: Object,
|
||||
default () {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
calendar: {
|
||||
type: Object,
|
||||
default: () => {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
selected: {
|
||||
type: Array,
|
||||
default: () => {
|
||||
return []
|
||||
}
|
||||
},
|
||||
lunar: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
todayText() {
|
||||
return t("uni-calender.today")
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
choiceDate(weeks) {
|
||||
this.$emit('change', weeks)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
$uni-font-size-base: 14px;
|
||||
$uni-text-color: #333;
|
||||
$uni-font-size-sm: 12px;
|
||||
$uni-color-error: #e43d33;
|
||||
$uni-opacity-disabled: 0.3;
|
||||
$uni-text-color-disable: #c0c0c0;
|
||||
$uni-primary: #2979ff !default;
|
||||
|
||||
.uni-calendar-item__weeks-box {
|
||||
flex: 1;
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.uni-calendar-item__weeks-box-text {
|
||||
font-size: 16px;
|
||||
color: $uni-text-color;
|
||||
line-height: 36rpx;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.uni-calendar-item__weeks-lunar-text {
|
||||
font-size: $uni-font-size-sm;
|
||||
color: $uni-text-color;
|
||||
}
|
||||
|
||||
.uni-calendar-item__weeks-box-item {
|
||||
position: relative;
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 100rpx;
|
||||
height: 100rpx;
|
||||
}
|
||||
|
||||
.uni-calendar-item__weeks-box-circle {
|
||||
position: absolute;
|
||||
right: 42rpx;
|
||||
bottom: 1rpx;
|
||||
font-size: 20rpx;
|
||||
line-height: 1;
|
||||
display: block;
|
||||
padding: 8rpx;
|
||||
border-radius: 12rpx;
|
||||
background-color: #FE5146;
|
||||
|
||||
}
|
||||
|
||||
.uni-calendar-item--disable {
|
||||
background-color: rgba(249, 249, 249, $uni-opacity-disabled);
|
||||
color: $uni-text-color-disable;
|
||||
}
|
||||
|
||||
.uni-calendar-item--isDay-text {
|
||||
color: $uni-color-primary;
|
||||
}
|
||||
|
||||
.uni-calendar-item--isDay {
|
||||
background-color: $uni-color-primary;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.uni-calendar-item--extra {
|
||||
color: $uni-color-error;
|
||||
}
|
||||
|
||||
.uni-calendar-item--checked {
|
||||
background-color: $uni-color-primary;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.uni-calendar-item--multiple {
|
||||
background-color: $uni-color-primary;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.uni-calendar-item--before-checked {
|
||||
background-color: #ff5a5f;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.uni-calendar-item--after-checked {
|
||||
background-color: #ff5a5f;
|
||||
color: #fff;
|
||||
}
|
||||
</style>
|
||||
579
pages/workFlow/schedule/calendar/uni-calendar.vue
Normal file
579
pages/workFlow/schedule/calendar/uni-calendar.vue
Normal file
@@ -0,0 +1,579 @@
|
||||
<template>
|
||||
<view class="uni-calendar">
|
||||
<view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}"
|
||||
@click="clean"></view>
|
||||
<view v-if="insert || show" class="uni-calendar__content"
|
||||
:class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow}">
|
||||
<view v-if="!insert" class="uni-calendar__header uni-calendar--fixed-top">
|
||||
<view class="uni-calendar__header-btn-box" @click="close">
|
||||
<text class="uni-calendar__header-text uni-calendar--fixed-width">{{cancelText}}</text>
|
||||
</view>
|
||||
<view class="uni-calendar__header-btn-box" @click="confirm">
|
||||
<text class="uni-calendar__header-text uni-calendar--fixed-width">{{okText}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="uni-calendar__header">
|
||||
<view class="uni-calendar__header-btn-box" @click.stop="pre">
|
||||
<view class="uni-calendar__header-btn uni-calendar--left"></view>
|
||||
</view>
|
||||
<picker mode="date" :value="date" fields="month" @change="bindDateChange">
|
||||
<text
|
||||
class="uni-calendar__header-text">{{ (nowDate.year||'') + '年' +( nowDate.month||'') + '月'}}</text>
|
||||
</picker>
|
||||
<view class="uni-calendar__header-btn-box" @click.stop="next">
|
||||
<view class="uni-calendar__header-btn uni-calendar--right"></view>
|
||||
</view>
|
||||
<text class="uni-calendar__backtoday" @click="backToday">回到今天</text>
|
||||
|
||||
</view>
|
||||
<view class="uni-calendar__box">
|
||||
<view v-if="showMonth" class="uni-calendar__box-bg">
|
||||
<text class="uni-calendar__box-bg-text">{{nowDate.month}}</text>
|
||||
</view>
|
||||
<view class="uni-calendar__weeks">
|
||||
<view class="uni-calendar__weeks-day">
|
||||
<text class="uni-calendar__weeks-day-text">{{SUNText}}</text>
|
||||
</view>
|
||||
<view class="uni-calendar__weeks-day">
|
||||
<text class="uni-calendar__weeks-day-text">{{monText}}</text>
|
||||
</view>
|
||||
<view class="uni-calendar__weeks-day">
|
||||
<text class="uni-calendar__weeks-day-text">{{TUEText}}</text>
|
||||
</view>
|
||||
<view class="uni-calendar__weeks-day">
|
||||
<text class="uni-calendar__weeks-day-text">{{WEDText}}</text>
|
||||
</view>
|
||||
<view class="uni-calendar__weeks-day">
|
||||
<text class="uni-calendar__weeks-day-text">{{THUText}}</text>
|
||||
</view>
|
||||
<view class="uni-calendar__weeks-day">
|
||||
<text class="uni-calendar__weeks-day-text">{{FRIText}}</text>
|
||||
</view>
|
||||
<view class="uni-calendar__weeks-day">
|
||||
<text class="uni-calendar__weeks-day-text">{{SATText}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="uni-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex">
|
||||
<view class="uni-calendar__weeks-item" v-for="(weeks,weeksIndex) in item" :key="weeksIndex">
|
||||
<calendar-item class="uni-calendar-item--hook" :weeks="weeks" :calendar="calendar"
|
||||
:selected="selected" :lunar="lunar" @change="choiceDate"></calendar-item>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Calendar from './util.js';
|
||||
import CalendarItem from './uni-calendar-item.vue'
|
||||
|
||||
import {
|
||||
initVueI18n
|
||||
} from '@dcloudio/uni-i18n'
|
||||
import i18nMessages from './i18n/index.js'
|
||||
const {
|
||||
t
|
||||
} = initVueI18n(i18nMessages)
|
||||
|
||||
/**
|
||||
* Calendar 日历
|
||||
* @description 日历组件可以查看日期,选择任意范围内的日期,打点操作。常用场景如:酒店日期预订、火车机票选择购买日期、上下班打卡等
|
||||
* @tutorial https://ext.dcloud.net.cn/plugin?id=56
|
||||
* @property {String} date 自定义当前时间,默认为今天
|
||||
* @property {Boolean} lunar 显示农历
|
||||
* @property {String} startDate 日期选择范围-开始日期
|
||||
* @property {String} endDate 日期选择范围-结束日期
|
||||
* @property {Boolean} range 范围选择
|
||||
* @property {Boolean} insert = [true|false] 插入模式,默认为false
|
||||
* @value true 弹窗模式
|
||||
* @value false 插入模式
|
||||
* @property {Boolean} clearDate = [true|false] 弹窗模式是否清空上次选择内容
|
||||
* @property {Array} selected 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}]
|
||||
* @property {Boolean} showMonth 是否选择月份为背景
|
||||
* @event {Function} change 日期改变,`insert :ture` 时生效
|
||||
* @event {Function} confirm 确认选择`insert :false` 时生效
|
||||
* @event {Function} monthSwitch 切换月份时触发
|
||||
* @example <uni-calendar :insert="true":lunar="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" />
|
||||
*/
|
||||
export default {
|
||||
components: {
|
||||
CalendarItem
|
||||
},
|
||||
emits: ['close', 'confirm', 'change', 'monthSwitch', 'initdate'],
|
||||
props: {
|
||||
date: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
selected: {
|
||||
type: Array,
|
||||
default () {
|
||||
return []
|
||||
}
|
||||
},
|
||||
lunar: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
startDate: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
endDate: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
range: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
insert: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
showMonth: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
clearDate: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
show: false,
|
||||
weeks: [],
|
||||
calendar: {},
|
||||
nowDate: '',
|
||||
aniMaskShow: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
/**
|
||||
* for i18n
|
||||
*/
|
||||
|
||||
okText() {
|
||||
return t("uni-calender.ok")
|
||||
},
|
||||
cancelText() {
|
||||
return t("uni-calender.cancel")
|
||||
},
|
||||
todayText() {
|
||||
return t("uni-calender.today")
|
||||
},
|
||||
monText() {
|
||||
return t("uni-calender.MON")
|
||||
},
|
||||
TUEText() {
|
||||
return t("uni-calender.TUE")
|
||||
},
|
||||
WEDText() {
|
||||
return t("uni-calender.WED")
|
||||
},
|
||||
THUText() {
|
||||
return t("uni-calender.THU")
|
||||
},
|
||||
FRIText() {
|
||||
return t("uni-calender.FRI")
|
||||
},
|
||||
SATText() {
|
||||
return t("uni-calender.SAT")
|
||||
},
|
||||
SUNText() {
|
||||
return t("uni-calender.SUN")
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
date(newVal) {
|
||||
// this.cale.setDate(newVal)
|
||||
this.init(newVal)
|
||||
},
|
||||
startDate(val) {
|
||||
this.cale.resetSatrtDate(val)
|
||||
this.cale.setDate(this.nowDate.fullDate)
|
||||
this.weeks = this.cale.weeks
|
||||
},
|
||||
endDate(val) {
|
||||
this.cale.resetEndDate(val)
|
||||
this.cale.setDate(this.nowDate.fullDate)
|
||||
this.weeks = this.cale.weeks
|
||||
},
|
||||
selected(newVal) {
|
||||
this.cale.setSelectInfo(this.nowDate.fullDate, newVal)
|
||||
this.weeks = this.cale.weeks
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.cale = new Calendar({
|
||||
selected: this.selected,
|
||||
startDate: this.startDate,
|
||||
endDate: this.endDate,
|
||||
range: this.range,
|
||||
})
|
||||
this.init(this.date)
|
||||
},
|
||||
methods: {
|
||||
// 取消穿透
|
||||
clean() {},
|
||||
bindDateChange(e) {
|
||||
const value = e.detail.value + '-1'
|
||||
this.setDate(value)
|
||||
|
||||
const {
|
||||
year,
|
||||
month
|
||||
} = this.cale.getDate(value)
|
||||
this.$emit('monthSwitch', {
|
||||
year,
|
||||
month
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 初始化日期显示
|
||||
* @param {Object} date
|
||||
*/
|
||||
init(date) {
|
||||
this.cale.setDate(date)
|
||||
this.weeks = this.cale.weeks
|
||||
this.nowDate = this.calendar = this.cale.getInfo(date)
|
||||
this.$emit('initdate', this.cale, this.nowDate);
|
||||
},
|
||||
/**
|
||||
* 打开日历弹窗
|
||||
*/
|
||||
open() {
|
||||
// 弹窗模式并且清理数据
|
||||
if (this.clearDate && !this.insert) {
|
||||
this.cale.cleanMultipleStatus()
|
||||
// this.cale.setDate(this.date)
|
||||
this.init(this.date)
|
||||
}
|
||||
this.show = true
|
||||
this.$nextTick(() => {
|
||||
setTimeout(() => {
|
||||
this.aniMaskShow = true
|
||||
}, 50)
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 关闭日历弹窗
|
||||
*/
|
||||
close() {
|
||||
this.aniMaskShow = false
|
||||
this.$nextTick(() => {
|
||||
setTimeout(() => {
|
||||
this.show = false
|
||||
this.$emit('close')
|
||||
}, 300)
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 确认按钮
|
||||
*/
|
||||
confirm() {
|
||||
this.setEmit('confirm')
|
||||
this.close()
|
||||
},
|
||||
/**
|
||||
* 变化触发
|
||||
*/
|
||||
change() {
|
||||
if (!this.insert) return
|
||||
this.setEmit('change')
|
||||
},
|
||||
/**
|
||||
* 选择月份触发
|
||||
*/
|
||||
monthSwitch() {
|
||||
let {
|
||||
year,
|
||||
month
|
||||
} = this.nowDate
|
||||
this.$emit('monthSwitch', {
|
||||
year,
|
||||
month: Number(month)
|
||||
})
|
||||
this.$emit('initdate', this.cale, this.cale.date);
|
||||
},
|
||||
/**
|
||||
* 派发事件
|
||||
* @param {Object} name
|
||||
*/
|
||||
setEmit(name) {
|
||||
let {
|
||||
year,
|
||||
month,
|
||||
date,
|
||||
fullDate,
|
||||
lunar,
|
||||
extraInfo
|
||||
} = this.calendar
|
||||
this.$emit(name, {
|
||||
range: this.cale.multipleStatus,
|
||||
year,
|
||||
month,
|
||||
date,
|
||||
fulldate: fullDate,
|
||||
lunar,
|
||||
extraInfo: extraInfo || {},
|
||||
cale: this.cale
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 选择天触发
|
||||
* @param {Object} weeks
|
||||
*/
|
||||
choiceDate(weeks) {
|
||||
if (weeks.disable) return
|
||||
this.calendar = weeks
|
||||
// 设置多选
|
||||
this.cale.setMultiple(this.calendar.fullDate)
|
||||
this.weeks = this.cale.weeks
|
||||
this.change()
|
||||
},
|
||||
/**
|
||||
* 回到今天
|
||||
*/
|
||||
backToday() {
|
||||
const nowYearMonth = `${this.nowDate.year}-${this.nowDate.month}`
|
||||
const date = this.cale.getDate(new Date())
|
||||
const todayYearMonth = `${date.year}-${date.month}`
|
||||
|
||||
// if (nowYearMonth !== todayYearMonth) {
|
||||
// this.monthSwitch()
|
||||
// }
|
||||
this.init(date.fullDate)
|
||||
// this.change()
|
||||
},
|
||||
/**
|
||||
* 上个月
|
||||
*/
|
||||
pre() {
|
||||
const preDate = this.cale.getDate(this.nowDate.fullDate, -1, 'month').fullDate
|
||||
this.setDate(preDate)
|
||||
this.monthSwitch()
|
||||
|
||||
},
|
||||
/**
|
||||
* 下个月
|
||||
*/
|
||||
next() {
|
||||
const nextDate = this.cale.getDate(this.nowDate.fullDate, +1, 'month').fullDate
|
||||
this.setDate(nextDate)
|
||||
this.monthSwitch()
|
||||
},
|
||||
/**
|
||||
* 设置日期
|
||||
* @param {Object} date
|
||||
*/
|
||||
setDate(date) {
|
||||
this.cale.setDate(date)
|
||||
this.weeks = this.cale.weeks
|
||||
this.nowDate = this.cale.getInfo(date)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
$uni-bg-color-mask: rgba($color: #000000, $alpha: 0.4);
|
||||
$uni-border-color: #EDEDED;
|
||||
$uni-text-color: #333;
|
||||
$uni-bg-color-hover: #f1f1f1;
|
||||
$uni-font-size-base: 14px;
|
||||
$uni-text-color-placeholder: #808080;
|
||||
$uni-color-subtitle: #555555;
|
||||
$uni-text-color-grey: #999;
|
||||
|
||||
.uni-calendar {
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.uni-calendar__mask {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background-color: $uni-bg-color-mask;
|
||||
transition-property: opacity;
|
||||
transition-duration: 0.3s;
|
||||
opacity: 0;
|
||||
/* #ifndef APP-NVUE */
|
||||
z-index: 99;
|
||||
/* #endif */
|
||||
}
|
||||
|
||||
.uni-calendar--mask-show {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
.uni-calendar--fixed {
|
||||
position: fixed;
|
||||
/* #ifdef APP-NVUE */
|
||||
bottom: 0;
|
||||
/* #endif */
|
||||
left: 0;
|
||||
right: 0;
|
||||
transition-property: transform;
|
||||
transition-duration: 0.3s;
|
||||
transform: translateY(460px);
|
||||
/* #ifndef APP-NVUE */
|
||||
bottom: calc(var(--window-bottom));
|
||||
z-index: 99;
|
||||
/* #endif */
|
||||
}
|
||||
|
||||
.uni-calendar--ani-show {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
.uni-calendar__content {
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.uni-calendar__header {
|
||||
position: relative;
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 50px;
|
||||
border-bottom-color: $uni-border-color;
|
||||
border-bottom-style: solid;
|
||||
border-bottom-width: 1px;
|
||||
}
|
||||
|
||||
.uni-calendar--fixed-top {
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
border-top-color: $uni-border-color;
|
||||
border-top-style: solid;
|
||||
border-top-width: 1px;
|
||||
}
|
||||
|
||||
.uni-calendar--fixed-width {
|
||||
width: 50px;
|
||||
}
|
||||
|
||||
.uni-calendar__backtoday {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 25rpx;
|
||||
padding: 0 5px;
|
||||
height: 25px;
|
||||
line-height: 25px;
|
||||
font-size: 12px;
|
||||
color: $uni-text-color;
|
||||
background-color: $uni-bg-color-hover;
|
||||
margin-right: 28rpx;
|
||||
}
|
||||
|
||||
.uni-calendar__header-text {
|
||||
text-align: center;
|
||||
width: 100px;
|
||||
font-size: $uni-font-size-base;
|
||||
color: $uni-text-color;
|
||||
}
|
||||
|
||||
.uni-calendar__header-btn-box {
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.uni-calendar__header-btn {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-left-color: $uni-text-color-placeholder;
|
||||
border-left-style: solid;
|
||||
border-left-width: 2px;
|
||||
border-top-color: $uni-color-subtitle;
|
||||
border-top-style: solid;
|
||||
border-top-width: 2px;
|
||||
}
|
||||
|
||||
.uni-calendar--left {
|
||||
transform: rotate(-45deg);
|
||||
}
|
||||
|
||||
.uni-calendar--right {
|
||||
transform: rotate(135deg);
|
||||
}
|
||||
|
||||
|
||||
.uni-calendar__weeks {
|
||||
position: relative;
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: row;
|
||||
margin: 10rpx 0;
|
||||
}
|
||||
|
||||
.uni-calendar__weeks-item {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.uni-calendar__weeks-day {
|
||||
flex: 1;
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 45px;
|
||||
border-bottom-color: #F5F5F5;
|
||||
border-bottom-style: solid;
|
||||
border-bottom-width: 1px;
|
||||
}
|
||||
|
||||
.uni-calendar__weeks-day-text {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.uni-calendar__box {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.uni-calendar__box-bg {
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.uni-calendar__box-bg-text {
|
||||
font-size: 200px;
|
||||
font-weight: bold;
|
||||
color: $uni-text-color-grey;
|
||||
opacity: 0.1;
|
||||
text-align: center;
|
||||
/* #ifndef APP-NVUE */
|
||||
line-height: 1;
|
||||
/* #endif */
|
||||
}
|
||||
</style>
|
||||
386
pages/workFlow/schedule/calendar/util.js
Normal file
386
pages/workFlow/schedule/calendar/util.js
Normal file
@@ -0,0 +1,386 @@
|
||||
import CALENDAR from './calendar.js'
|
||||
|
||||
class Calendar {
|
||||
constructor({
|
||||
date,
|
||||
selected,
|
||||
startDate,
|
||||
endDate,
|
||||
range
|
||||
} = {}) {
|
||||
// 当前日期
|
||||
this.date = this.getDate(new Date()) // 当前初入日期
|
||||
// 打点信息
|
||||
this.selected = selected || [];
|
||||
// 范围开始
|
||||
this.startDate = startDate
|
||||
// 范围结束
|
||||
this.endDate = endDate
|
||||
this.range = range
|
||||
// 多选状态
|
||||
this.cleanMultipleStatus()
|
||||
// 每周日期
|
||||
this.weeks = {}
|
||||
// this._getWeek(this.date.fullDate)
|
||||
}
|
||||
/**
|
||||
* 设置日期
|
||||
* @param {Object} date
|
||||
*/
|
||||
setDate(date) {
|
||||
this.selectDate = this.getDate(date)
|
||||
this._getWeek(this.selectDate.fullDate)
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理多选状态
|
||||
*/
|
||||
cleanMultipleStatus() {
|
||||
this.multipleStatus = {
|
||||
before: '',
|
||||
after: '',
|
||||
data: []
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置开始日期
|
||||
*/
|
||||
resetSatrtDate(startDate) {
|
||||
// 范围开始
|
||||
this.startDate = startDate
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置结束日期
|
||||
*/
|
||||
resetEndDate(endDate) {
|
||||
// 范围结束
|
||||
this.endDate = endDate
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取任意时间
|
||||
*/
|
||||
getDate(date, AddDayCount = 0, str = 'day') {
|
||||
if (!date) {
|
||||
date = new Date()
|
||||
}
|
||||
if (typeof date !== 'object') {
|
||||
date = date.replace(/-/g, '/')
|
||||
}
|
||||
const dd = new Date(date)
|
||||
switch (str) {
|
||||
case 'day':
|
||||
dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
|
||||
break
|
||||
case 'month':
|
||||
if (dd.getDate() === 31 && AddDayCount > 0) {
|
||||
dd.setDate(dd.getDate() + AddDayCount)
|
||||
} else {
|
||||
const preMonth = dd.getMonth()
|
||||
dd.setMonth(preMonth + AddDayCount) // 获取AddDayCount天后的日期
|
||||
const nextMonth = dd.getMonth()
|
||||
// 处理 pre 切换月份目标月份为2月没有当前日(30 31) 切换错误问题
|
||||
if (AddDayCount < 0 && preMonth !== 0 && nextMonth - preMonth > AddDayCount) {
|
||||
dd.setMonth(nextMonth + (nextMonth - preMonth + AddDayCount))
|
||||
}
|
||||
// 处理 next 切换月份目标月份为2月没有当前日(30 31) 切换错误问题
|
||||
if (AddDayCount > 0 && nextMonth - preMonth > AddDayCount) {
|
||||
dd.setMonth(nextMonth - (nextMonth - preMonth - AddDayCount))
|
||||
}
|
||||
}
|
||||
break
|
||||
case 'year':
|
||||
dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期
|
||||
break
|
||||
}
|
||||
const y = dd.getFullYear()
|
||||
const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
|
||||
const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
|
||||
return {
|
||||
fullDate: y + '-' + m + '-' + d,
|
||||
year: y,
|
||||
month: m,
|
||||
date: d,
|
||||
day: dd.getDay()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取上月剩余天数
|
||||
*/
|
||||
_getLastMonthDays(firstDay, full) {
|
||||
let dateArr = []
|
||||
for (let i = firstDay; i > 0; i--) {
|
||||
const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate()
|
||||
dateArr.push({
|
||||
date: beforeDate,
|
||||
month: full.month - 1,
|
||||
lunar: this.getlunar(full.year, full.month - 1, beforeDate),
|
||||
disable: true
|
||||
})
|
||||
}
|
||||
// 获取打点信息
|
||||
for (let i = 0; i < dateArr.length; i++) {
|
||||
let nowDate = full.year + '-' + (dateArr[i].month < 10 ?
|
||||
'0' + dateArr[i].month : dateArr[i].month) + '-' + (dateArr[i].date < 10 ?
|
||||
'0' + dateArr[i].date : dateArr[i].date)
|
||||
let info = this.selected && this.selected.find((item) => {
|
||||
if (this.dateEqual(nowDate, item.date)) {
|
||||
return item
|
||||
}
|
||||
})
|
||||
if (info) dateArr[i].extraInfo = info
|
||||
}
|
||||
return dateArr
|
||||
}
|
||||
/**
|
||||
* 获取本月天数
|
||||
*/
|
||||
_currentMonthDys(dateData, full) {
|
||||
let dateArr = []
|
||||
let fullDate = this.date.fullDate
|
||||
for (let i = 1; i <= dateData; i++) {
|
||||
let nowDate = full.year + '-' + (full.month < 10 ?
|
||||
full.month : full.month) + '-' + (i < 10 ?
|
||||
'0' + i : i)
|
||||
// 是否今天
|
||||
let isDay = fullDate === nowDate
|
||||
// 获取打点信息
|
||||
let info = this.selected && this.selected.find((item) => {
|
||||
if (this.dateEqual(nowDate, item.date)) {
|
||||
return item
|
||||
}
|
||||
})
|
||||
|
||||
// 日期禁用
|
||||
let disableBefore = true
|
||||
let disableAfter = true
|
||||
if (this.startDate) {
|
||||
// let dateCompBefore = this.dateCompare(this.startDate, fullDate)
|
||||
// disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate)
|
||||
disableBefore = this.dateCompare(this.startDate, nowDate)
|
||||
}
|
||||
|
||||
if (this.endDate) {
|
||||
// let dateCompAfter = this.dateCompare(fullDate, this.endDate)
|
||||
// disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate)
|
||||
disableAfter = this.dateCompare(nowDate, this.endDate)
|
||||
}
|
||||
let multiples = this.multipleStatus.data
|
||||
let checked = false
|
||||
let multiplesStatus = -1
|
||||
if (this.range) {
|
||||
if (multiples) {
|
||||
multiplesStatus = multiples.findIndex((item) => {
|
||||
return this.dateEqual(item, nowDate)
|
||||
})
|
||||
}
|
||||
if (multiplesStatus !== -1) {
|
||||
checked = true
|
||||
}
|
||||
}
|
||||
let data = {
|
||||
fullDate: nowDate,
|
||||
year: full.year,
|
||||
date: i,
|
||||
multiple: this.range ? checked : false,
|
||||
beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate),
|
||||
afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate),
|
||||
month: full.month,
|
||||
lunar: this.getlunar(full.year, full.month, i),
|
||||
disable: !(disableBefore && disableAfter),
|
||||
isDay
|
||||
}
|
||||
if (info) {
|
||||
data.extraInfo = info
|
||||
}
|
||||
|
||||
dateArr.push(data)
|
||||
}
|
||||
return dateArr
|
||||
}
|
||||
/**
|
||||
* 获取下月天数
|
||||
*/
|
||||
_getNextMonthDays(surplus, full) {
|
||||
let dateArr = []
|
||||
for (let i = 1; i < surplus + 1; i++) {
|
||||
dateArr.push({
|
||||
date: i,
|
||||
month: Number(full.month) + 1,
|
||||
lunar: this.getlunar(full.year, Number(full.month) + 1, i),
|
||||
disable: true
|
||||
})
|
||||
}
|
||||
// 获取打点信息
|
||||
for (let i = 0; i < dateArr.length; i++) {
|
||||
let nowDate = full.year + '-' + (dateArr[i].month < 10 ?
|
||||
'0' + dateArr[i].month : dateArr[i].month) + '-' + (dateArr[i].date < 10 ?
|
||||
'0' + dateArr[i].date : dateArr[i].date)
|
||||
let info = this.selected && this.selected.find((item) => {
|
||||
if (this.dateEqual(nowDate, item.date)) {
|
||||
return item
|
||||
}
|
||||
})
|
||||
if (info) dateArr[i].extraInfo = info
|
||||
}
|
||||
return dateArr
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前日期详情
|
||||
* @param {Object} date
|
||||
*/
|
||||
getInfo(date) {
|
||||
if (!date) {
|
||||
date = new Date()
|
||||
}
|
||||
const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate)
|
||||
return dateInfo
|
||||
}
|
||||
|
||||
/**
|
||||
* 比较时间大小
|
||||
*/
|
||||
dateCompare(startDate, endDate) {
|
||||
// 计算截止时间
|
||||
startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
|
||||
// 计算详细项的截止时间
|
||||
endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
|
||||
if (startDate <= endDate) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 比较时间是否相等
|
||||
*/
|
||||
dateEqual(before, after) {
|
||||
// 计算截止时间
|
||||
before = new Date(before.replace('-', '/').replace('-', '/'))
|
||||
// 计算详细项的截止时间
|
||||
after = new Date(after.replace('-', '/').replace('-', '/'))
|
||||
if (before.getTime() - after.getTime() === 0) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取日期范围内所有日期
|
||||
* @param {Object} begin
|
||||
* @param {Object} end
|
||||
*/
|
||||
geDateAll(begin, end) {
|
||||
var arr = []
|
||||
var ab = begin.split('-')
|
||||
var ae = end.split('-')
|
||||
var db = new Date()
|
||||
db.setFullYear(ab[0], ab[1] - 1, ab[2])
|
||||
var de = new Date()
|
||||
de.setFullYear(ae[0], ae[1] - 1, ae[2])
|
||||
var unixDb = db.getTime() - 24 * 60 * 60 * 1000
|
||||
var unixDe = de.getTime() - 24 * 60 * 60 * 1000
|
||||
for (var k = unixDb; k <= unixDe;) {
|
||||
k = k + 24 * 60 * 60 * 1000
|
||||
arr.push(this.getDate(new Date(parseInt(k))).fullDate)
|
||||
}
|
||||
return arr
|
||||
}
|
||||
/**
|
||||
* 计算阴历日期显示
|
||||
*/
|
||||
getlunar(year, month, date) {
|
||||
return CALENDAR.solar2lunar(year, month, date)
|
||||
}
|
||||
/**
|
||||
* 设置打点
|
||||
*/
|
||||
setSelectInfo(data, value) {
|
||||
this.selected = value
|
||||
this._getWeek(data)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取多选状态
|
||||
*/
|
||||
setMultiple(fullDate) {
|
||||
let {
|
||||
before,
|
||||
after
|
||||
} = this.multipleStatus
|
||||
|
||||
if (!this.range) return
|
||||
if (before && after) {
|
||||
this.multipleStatus.before = ''
|
||||
this.multipleStatus.after = ''
|
||||
this.multipleStatus.data = []
|
||||
} else {
|
||||
if (!before) {
|
||||
this.multipleStatus.before = fullDate
|
||||
} else {
|
||||
this.multipleStatus.after = fullDate
|
||||
if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
|
||||
this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus
|
||||
.after);
|
||||
} else {
|
||||
this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus
|
||||
.before);
|
||||
}
|
||||
}
|
||||
}
|
||||
this._getWeek(fullDate)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取每周数据
|
||||
* @param {Object} dateData
|
||||
*/
|
||||
_getWeek(dateData) {
|
||||
const {
|
||||
year,
|
||||
month
|
||||
} = this.getDate(dateData)
|
||||
let firstDay = new Date(year, month - 1, 1).getDay()
|
||||
let currentDay = new Date(year, month, 0).getDate()
|
||||
let dates = {
|
||||
lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天
|
||||
currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数
|
||||
nextMonthDays: [], // 下个月开始几天
|
||||
weeks: []
|
||||
}
|
||||
let canlender = []
|
||||
const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length)
|
||||
dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData))
|
||||
canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays)
|
||||
let weeks = {}
|
||||
// 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天
|
||||
for (let i = 0; i < canlender.length; i++) {
|
||||
if (i % 7 === 0) {
|
||||
weeks[parseInt(i / 7)] = new Array(7)
|
||||
}
|
||||
weeks[parseInt(i / 7)][i % 7] = canlender[i]
|
||||
}
|
||||
this.canlender = canlender
|
||||
this.weeks = weeks
|
||||
}
|
||||
|
||||
//静态方法
|
||||
// static init(date) {
|
||||
// if (!this.instance) {
|
||||
// this.instance = new Calendar(date);
|
||||
// }
|
||||
// return this.instance;
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
export default Calendar
|
||||
281
pages/workFlow/schedule/detail.vue
Normal file
281
pages/workFlow/schedule/detail.vue
Normal file
@@ -0,0 +1,281 @@
|
||||
<template>
|
||||
<view class="">
|
||||
<u-navbar title="详情" :custom-back="back">
|
||||
<template #right>
|
||||
<view class="navbar-right">
|
||||
<view class="message-box right-item" style="padding-right: 20rpx;">
|
||||
<u-icon name='more-dot-fill' @click="show=true" v-if="!groupId"></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
</u-navbar>
|
||||
<view class="scheduleForm-v jnpf-wrap">
|
||||
<u-toast ref="uToast" />
|
||||
<u-form :model="dataForm" ref="dataForm" :errorType="['toast']" label-position="left" label-width="150"
|
||||
label-align="left">
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="标题" prop="title">
|
||||
<u-input input-align='right' v-model="dataForm.title" label-align="right" placeholder=""
|
||||
disabled></u-input>
|
||||
</u-form-item>
|
||||
<u-form-item label="内容" prop="content">
|
||||
<u-input input-align='right' v-model="dataForm.content" type="textarea" placeholder=""
|
||||
disabled></u-input>
|
||||
</u-form-item>
|
||||
</view>
|
||||
<!-- #ifndef APP-HARMONY -->
|
||||
<view class="u-p-l-20 u-p-r-20 u-m-t-20 form-item-box">
|
||||
<u-form-item label="附件" prop="content">
|
||||
<JnpfUploadFile v-model="dataForm.files" detailed />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<!-- #endif -->
|
||||
<!-- #ifdef APP-HARMONY -->
|
||||
<view class="u-p-l-20 u-p-r-20 u-m-t-20 form-item-box">
|
||||
<u-form-item label="附件" prop="content">
|
||||
<JnpfUploadFileH v-model="dataForm.files" detailed />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<!-- #endif -->
|
||||
<view class="jnpf-card">
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="紧急程度" prop="urgent">
|
||||
<u-input input-align='right' v-model="dataForm.urgent" label-align="right" placeholder=""
|
||||
disabled></u-input>
|
||||
</u-form-item>
|
||||
<u-form-item label="类型" prop="category">
|
||||
<u-input input-align='right' v-model="dataForm.category" placeholder="" disabled></u-input>
|
||||
</u-form-item>
|
||||
<u-form-item label="创建人" prop="creatorUserId">
|
||||
<u-input input-align='right' v-model="dataForm.creatorUserId" placeholder=""
|
||||
disabled></u-input>
|
||||
</u-form-item>
|
||||
<u-form-item label="参与人" prop="toUserIds">
|
||||
<u-input input-align='right' v-model="dataForm.toUserIds" placeholder="" disabled></u-input>
|
||||
</u-form-item>
|
||||
</view>
|
||||
</view>
|
||||
<view class="jnpf-card">
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="开始时间" prop="startDay">
|
||||
<datetime :delayMin="0" v-model="startDay" :date="startDate" disabled
|
||||
:showtdatetime='showtdatetime' :type="1" :allDay='dataForm.allDay' placeholder="" />
|
||||
</u-form-item>
|
||||
<u-form-item label="结束时间" prop="endDay">
|
||||
<datetime :delayMin="0" v-model="endDay" :date="endDate" disabled
|
||||
:showtdatetime='showtdatetime' :type="2" :allDay='dataForm.allDay' placeholder="" />
|
||||
</u-form-item>
|
||||
</view>
|
||||
</view>
|
||||
</u-form>
|
||||
</view>
|
||||
<u-action-sheet @click="handleAction" :list="actionList" :tips="{ text:'' , color: '#000' , fontSize: 30 }"
|
||||
v-model="show">
|
||||
</u-action-sheet>
|
||||
<u-action-sheet @click="delAction" :list="delList"
|
||||
:tips="{ text:toUserType===true?dataForm.repetition != '1'?'此为重复日程,将删除(含参与人)应用于':'确认删除(含参与人)当前日程':dataForm.repetition != '1'?'此为重复日程,将删除应用于':'确认删除当前日程' , color: '#000' , fontSize: 30 }"
|
||||
v-model="showBtn">
|
||||
</u-action-sheet>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import datetime from './t-datetime.vue'
|
||||
import {
|
||||
ScheduleDetail,
|
||||
ScheduleDelete
|
||||
} from '@/api/workFlow/schedule.js'
|
||||
import {
|
||||
useBaseStore
|
||||
} from '@/store/modules/base'
|
||||
|
||||
const baseStore = useBaseStore()
|
||||
|
||||
export default {
|
||||
components: {
|
||||
datetime
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showAction: '',
|
||||
userInfo: {},
|
||||
show: false,
|
||||
showtdatetime: false,
|
||||
dataForm: {
|
||||
id: 0,
|
||||
category: '',
|
||||
creatorUserId: 0,
|
||||
userName: '',
|
||||
allDay: 0,
|
||||
urgent: '1',
|
||||
startDay: '',
|
||||
startTime: '',
|
||||
endDay: '',
|
||||
endTime: '',
|
||||
duration: '',
|
||||
content: '',
|
||||
title: '',
|
||||
toUserIds: '',
|
||||
reminderTime: -2,
|
||||
reminderType: 1,
|
||||
send: '',
|
||||
sendName: '',
|
||||
repetition: 1,
|
||||
repeatTime: '',
|
||||
color: '#188ae2'
|
||||
},
|
||||
showBtn: false,
|
||||
startDate: {},
|
||||
endDate: {},
|
||||
repeatDate: {},
|
||||
repeat: '',
|
||||
endDay: '',
|
||||
startDay: '',
|
||||
toUserType: false,
|
||||
actionList: [],
|
||||
delList: [],
|
||||
groupId: ''
|
||||
}
|
||||
},
|
||||
onReady() {
|
||||
this.$refs.dataForm.setRules(this.rules);
|
||||
},
|
||||
onLoad(option) {
|
||||
this.dataForm.id = option.id
|
||||
this.toUserType = option.type
|
||||
this.actionList = []
|
||||
this.delList = []
|
||||
this.groupId = option.groupId
|
||||
if (this.toUserType == 'true') {
|
||||
this.actionList.push({
|
||||
text: '编辑',
|
||||
id: 'update'
|
||||
})
|
||||
this.actionList.push({
|
||||
text: '删除',
|
||||
id: 'deldete',
|
||||
color: '#ff3a3a',
|
||||
})
|
||||
} else {
|
||||
this.actionList.push({
|
||||
text: '删除',
|
||||
id: 'deldete',
|
||||
color: '#ff3a3a',
|
||||
})
|
||||
}
|
||||
ScheduleDetail(this.groupId, option.id).then(res => {
|
||||
let data = res.data || {};
|
||||
data.files = data.files ? JSON.parse(data.files) : [];
|
||||
this.dataForm = data
|
||||
if (this.dataForm.repetition != '1') {
|
||||
this.delList.push({
|
||||
text: '仅删除此日程',
|
||||
id: '1'
|
||||
})
|
||||
this.delList.push({
|
||||
text: '删除此日程及后续日程',
|
||||
id: '2',
|
||||
})
|
||||
this.delList.push({
|
||||
text: '删除所有日程',
|
||||
id: '3',
|
||||
})
|
||||
} else {
|
||||
this.delList.push({
|
||||
text: '删除',
|
||||
id: '3',
|
||||
color: '#ff3a3a',
|
||||
})
|
||||
}
|
||||
this.startDate = this.timestampToTime(this.dataForm.startDay)
|
||||
this.endDate = this.timestampToTime(this.dataForm.endDay)
|
||||
}).catch((err) => {
|
||||
uni.showToast({
|
||||
title: err,
|
||||
complete: () => {
|
||||
setTimeout(() => {
|
||||
uni.navigateBack()
|
||||
}, 300)
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
delAction(index) {
|
||||
if (this.dataForm.repetition != '1') {
|
||||
ScheduleDelete(this.dataForm.id, index + 1).then(res => {
|
||||
uni.showToast({
|
||||
title: res.msg,
|
||||
complete: () => {
|
||||
uni.$emit('refresh')
|
||||
uni.navigateBack()
|
||||
}
|
||||
})
|
||||
})
|
||||
} else {
|
||||
ScheduleDelete(this.dataForm.id, 3).then(res => {
|
||||
uni.showToast({
|
||||
title: res.msg,
|
||||
complete: () => {
|
||||
uni.$emit('refresh')
|
||||
uni.navigateBack()
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
handleAction(index) {
|
||||
if (this.actionList[index].id == 'update') {
|
||||
uni.navigateTo({
|
||||
url: './form?id=' + this.dataForm.id
|
||||
})
|
||||
} else {
|
||||
this.showBtn = true
|
||||
}
|
||||
},
|
||||
back() {
|
||||
uni.navigateBack();
|
||||
},
|
||||
getResult() {
|
||||
uni.navigateBack()
|
||||
},
|
||||
changeSend(id, name) {
|
||||
this.dataForm.send = id
|
||||
this.dataForm.sendName = name
|
||||
},
|
||||
getDictionaryData() {
|
||||
baseStore.getDictionaryData({
|
||||
sort: 'scheduleType'
|
||||
}).then((res) => {
|
||||
this.typeOptions = res
|
||||
})
|
||||
},
|
||||
timestampToTime(timestamp) {
|
||||
let list = {}
|
||||
var date = new Date(timestamp);
|
||||
let Y = date.getFullYear();
|
||||
let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
|
||||
let D = date.getDate();
|
||||
let h = date.getHours();
|
||||
let m = date.getMinutes();
|
||||
let s = date.getSeconds();
|
||||
list.year = Y
|
||||
list.month = M
|
||||
list.date = D
|
||||
list.hours = h < 10 ? 0 + h : h
|
||||
list.minutes = m < 10 ? 0 + m : m
|
||||
list.seconds = s
|
||||
return list
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss">
|
||||
page {
|
||||
background-color: #f0f2f6;
|
||||
}
|
||||
|
||||
.scheduleForm-v {
|
||||
padding-bottom: 110rpx;
|
||||
}
|
||||
</style>
|
||||
610
pages/workFlow/schedule/form.vue
Normal file
610
pages/workFlow/schedule/form.vue
Normal file
@@ -0,0 +1,610 @@
|
||||
<template>
|
||||
<view class="scheduleForm-v jnpf-wrap">
|
||||
<u-toast ref="uToast" />
|
||||
<u-form :model="dataForm" :rules="rules" ref="dataForm" :errorType="['toast']" label-position="left"
|
||||
label-width="150" label-align="left">
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="标题" prop="title" required>
|
||||
<u-input input-align='right' v-model="dataForm.title" placeholder="请输入"></u-input>
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="内容" prop="content">
|
||||
<u-input input-align='right' v-model="dataForm.content" placeholder="请输入" type="textarea"></u-input>
|
||||
</u-form-item>
|
||||
</view>
|
||||
<!-- #ifndef APP-HARMONY -->
|
||||
<view class="jnpf-card u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="附件" prop="files">
|
||||
<JnpfUploadFile v-model="dataForm.files" />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<!-- #endif -->
|
||||
<!-- #ifdef APP-HARMONY -->
|
||||
<view class="jnpf-card u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="附件" prop="files">
|
||||
<JnpfUploadFileH v-model="dataForm.files" />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<!-- #endif -->
|
||||
<view class="jnpf-card">
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="紧急程度" prop="urgent">
|
||||
<JnpfSelect v-model="dataForm.urgent" :options='urgentList' placeholder="请选择" />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="类型" prop="category" required>
|
||||
<JnpfSelect v-model="dataForm.category" :options='categoryOptions' placeholder="请选择" />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="创建人" prop="creatorUserId" required>
|
||||
<JnpfUserSelect v-model="dataForm.creatorUserId" placeholder="请输入" disabled="disabled" />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="参与人" prop="toUserIds">
|
||||
<JnpfUserSelect v-model="dataForm.toUserIds" placeholder="请选择" multiple />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="标签颜色" prop="color">
|
||||
<JnpfColorPicker v-model="dataForm.color" />
|
||||
</u-form-item>
|
||||
</view>
|
||||
</view>
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="全天" prop="allDay">
|
||||
<JnpfSwitch v-model="dataForm.allDay" @change="change_providerType" />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="开始时间" prop="startDay" required>
|
||||
<tdatetime :delayMin="0" v-model="startDay" :date="startDate" placeholder="请选择"
|
||||
:showtdatetime='showtdatetime' :type="1" @confirm='confirm' :allDay='dataForm.allDay' />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="时长" prop="duration" required v-if="dataForm.duration!=-1&&dataForm.allDay==0">
|
||||
<JnpfSelect v-model="dataForm.duration" :options='durationList' />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="结束时间" prop="endDay" required v-if='dataForm.duration==-1||dataForm.allDay'>
|
||||
<tdatetime :delayMin="0" v-model="endDay" :date="endDate" placeholder="请选择"
|
||||
:showtdatetime='showtdatetime' :type="2" @confirm='confirm' :allDay='dataForm.allDay' />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view class="jnpf-card">
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="提醒时间" prop="reminderTime">
|
||||
<JnpfSelect v-model="dataForm.reminderTime"
|
||||
:options='dataForm.allDay?reminderTimeList_:reminderTimeList' placeholder="请选择" />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view v-if="dataForm.reminderTime!=-2" class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="提醒方式" prop="reminderType">
|
||||
<jnpf-select v-model="dataForm.reminderType" :options='remindList'
|
||||
placeholder="请选择"></jnpf-select>
|
||||
</u-form-item>
|
||||
<u-form-item label="发送配置" prop="send" v-if="dataForm.reminderType==2">
|
||||
<sendSelect v-model="dataForm.sendName" :send='dataForm.send' @change='changeSend'
|
||||
placeholder="请选择" />
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="重复提醒" prop="repetition">
|
||||
<jnpf-select v-model="dataForm.repetition" :options='repeatReminderList'
|
||||
@change='repeatTimeChange' placeholder="请选择"></jnpf-select>
|
||||
</u-form-item>
|
||||
</view>
|
||||
<view class="u-p-l-20 u-p-r-20 form-item-box">
|
||||
<u-form-item label="结束重复" prop="repeatTime" required v-if='dataForm.repetition!=1'>
|
||||
<tdatetime :delayMin="0" v-model="repeat" :date="repeatDate" placeholder="请选择"
|
||||
:showtdatetime='showtdatetime' :type="3" @confirm='confirm' :allDay='1' />
|
||||
</u-form-item>
|
||||
</view>
|
||||
</view>
|
||||
</u-form>
|
||||
<view class="flowBefore-actions">
|
||||
<u-button class="buttom-btn" @click="getResult('cancel')">{{$t('common.cancelText')}}</u-button>
|
||||
<u-button class="buttom-btn" type="primary" :loading='btnLoading'
|
||||
@click.stop="save()">{{$t('common.okText')}}</u-button>
|
||||
</view>
|
||||
<u-action-sheet @click="handleAction" :list="actionList"
|
||||
:tips="{ text:'此为重复日程,将修改应用于' , color: '#000' , fontSize: 30 }" v-model="show">
|
||||
</u-action-sheet>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import tdatetime from './t-datetime.vue'
|
||||
import sendSelect from './sendSelect/index.vue'
|
||||
import {
|
||||
ScheduleInfo,
|
||||
ScheduleCreate,
|
||||
ScheduleUpdate
|
||||
} from '@/api/workFlow/schedule.js'
|
||||
import {
|
||||
useBaseStore
|
||||
} from '@/store/modules/base'
|
||||
|
||||
const baseStore = useBaseStore()
|
||||
|
||||
|
||||
export default {
|
||||
components: {
|
||||
tdatetime,
|
||||
sendSelect
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
title: '',
|
||||
userInfo: {},
|
||||
show: false,
|
||||
showtdatetime: false,
|
||||
dataForm: {
|
||||
id: 0,
|
||||
category: '',
|
||||
creatorUserId: 0,
|
||||
userName: '',
|
||||
allDay: 0,
|
||||
urgent: '1',
|
||||
startDay: '',
|
||||
startTime: '',
|
||||
endDay: '',
|
||||
endTime: '',
|
||||
duration: 60,
|
||||
content: '',
|
||||
title: '',
|
||||
toUserIds: [],
|
||||
reminderTime: -2,
|
||||
reminderType: 1,
|
||||
send: '',
|
||||
sendName: '',
|
||||
repetition: 1,
|
||||
repeatTime: '',
|
||||
color: '#FFFFFF',
|
||||
files: []
|
||||
},
|
||||
btnLoading: false,
|
||||
showBtn: false,
|
||||
startDate: {},
|
||||
endDate: {},
|
||||
repeatDate: {},
|
||||
repeat: '',
|
||||
endDay: '',
|
||||
startDay: '',
|
||||
urgentList: [{
|
||||
id: "1",
|
||||
fullName: '普通'
|
||||
}, {
|
||||
id: '2',
|
||||
fullName: '重要'
|
||||
}, {
|
||||
id: '3',
|
||||
fullName: '紧急'
|
||||
}],
|
||||
durationList: [{
|
||||
id: 30,
|
||||
fullName: '30分钟'
|
||||
}, {
|
||||
id: 60,
|
||||
fullName: '1小时'
|
||||
}, {
|
||||
id: 90,
|
||||
fullName: '1小时30分钟'
|
||||
}, {
|
||||
id: 120,
|
||||
fullName: '2小时'
|
||||
}, {
|
||||
id: 180,
|
||||
fullName: '3小时'
|
||||
}, {
|
||||
id: -1,
|
||||
fullName: '自定义'
|
||||
}],
|
||||
categoryOptions: [],
|
||||
repetitionType: false,
|
||||
reminderTimeList: [{
|
||||
id: -2,
|
||||
fullName: '不提醒'
|
||||
}, {
|
||||
id: -1,
|
||||
fullName: '开始时'
|
||||
}, {
|
||||
id: 5,
|
||||
fullName: '提前5分钟'
|
||||
}, {
|
||||
id: 10,
|
||||
fullName: '提前10分钟'
|
||||
}, {
|
||||
id: 15,
|
||||
fullName: '提前15分钟'
|
||||
}, {
|
||||
id: 30,
|
||||
fullName: '提前30分钟'
|
||||
}, {
|
||||
id: 60,
|
||||
fullName: '提前1小时'
|
||||
}, {
|
||||
id: 120,
|
||||
fullName: '提前2小时'
|
||||
}, {
|
||||
id: 1440,
|
||||
fullName: '1天前'
|
||||
}, {
|
||||
id: 2880,
|
||||
fullName: '2天前'
|
||||
}, {
|
||||
id: 10080,
|
||||
fullName: '1周前'
|
||||
}],
|
||||
reminderTimeList_: [{
|
||||
id: -2,
|
||||
fullName: '不提醒'
|
||||
},
|
||||
{
|
||||
id: 1,
|
||||
fullName: '当天8:00'
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
fullName: '当天9:00'
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
fullName: '当天10:00'
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
fullName: '1天前8:00'
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
fullName: '1天前9:00'
|
||||
},
|
||||
{
|
||||
id: 6,
|
||||
fullName: '1天前10:00'
|
||||
},
|
||||
{
|
||||
id: 7,
|
||||
fullName: '2天前8:00'
|
||||
},
|
||||
{
|
||||
id: 8,
|
||||
fullName: '2天前9:00'
|
||||
},
|
||||
{
|
||||
id: 9,
|
||||
fullName: '2天前10:00'
|
||||
},
|
||||
{
|
||||
id: 10,
|
||||
fullName: '1周前8:00'
|
||||
},
|
||||
{
|
||||
id: 11,
|
||||
fullName: '1周前9:00'
|
||||
},
|
||||
{
|
||||
id: 12,
|
||||
fullName: '1周前10:00'
|
||||
}
|
||||
],
|
||||
remindList: [{
|
||||
id: 1,
|
||||
fullName: '默认'
|
||||
}, {
|
||||
id: 2,
|
||||
fullName: '自定义'
|
||||
}],
|
||||
repeatReminderList: [{
|
||||
id: 1,
|
||||
fullName: '不重复'
|
||||
}, {
|
||||
id: 2,
|
||||
fullName: '每天重复'
|
||||
}, {
|
||||
id: 3,
|
||||
fullName: '每周重复'
|
||||
}, {
|
||||
id: 4,
|
||||
fullName: '每月重复'
|
||||
}, {
|
||||
id: 5,
|
||||
fullName: '每年重复'
|
||||
}],
|
||||
actionList: [],
|
||||
rules: {
|
||||
startTime: [{
|
||||
required: true,
|
||||
message: '开始时间不能为空',
|
||||
trigger: 'change',
|
||||
type: 'number'
|
||||
}],
|
||||
startTime: [{
|
||||
required: true,
|
||||
message: '开始时间不能为空',
|
||||
trigger: 'change',
|
||||
type: 'number'
|
||||
}],
|
||||
endTime: [{
|
||||
required: true,
|
||||
message: '结束时间不能为空',
|
||||
trigger: 'change',
|
||||
type: 'number'
|
||||
}],
|
||||
repeat: [{
|
||||
required: true,
|
||||
message: '记录不能为空',
|
||||
trigger: 'change',
|
||||
}],
|
||||
category: [{
|
||||
required: true,
|
||||
message: '请选择类型',
|
||||
trigger: 'change'
|
||||
}],
|
||||
title: [{
|
||||
required: true,
|
||||
message: '请输入标题',
|
||||
trigger: 'blur'
|
||||
}],
|
||||
duration: [{
|
||||
required: true,
|
||||
message: '请选择时长',
|
||||
trigger: 'change',
|
||||
type: 'number'
|
||||
}],
|
||||
send: [{
|
||||
required: true,
|
||||
message: '发送配置不能为空',
|
||||
trigger: 'change'
|
||||
}],
|
||||
reminderType: [{
|
||||
required: true,
|
||||
message: '提醒方式不能为空',
|
||||
trigger: 'change',
|
||||
type: 'number'
|
||||
}]
|
||||
}
|
||||
}
|
||||
},
|
||||
onReady() {
|
||||
this.$refs.dataForm.setRules(this.rules);
|
||||
},
|
||||
onLoad(option) {
|
||||
this.repetitionType = false
|
||||
this.userInfo = uni.getStorageSync('userInfo') || {}
|
||||
this.dataForm.id = option.id
|
||||
this.btnLoading = false
|
||||
this.title = this.dataForm.id ? '编辑' : '新建'
|
||||
uni.setNavigationBarTitle({
|
||||
title: this.title
|
||||
});
|
||||
if (this.dataForm.id) {
|
||||
ScheduleInfo(option.id).then(res => {
|
||||
let data = res.data
|
||||
data.files = data.files ? JSON.parse(data.files) : [];
|
||||
this.dataForm = data
|
||||
this.startDate = this.timestampToTime(this.dataForm.startDay)
|
||||
this.endDate = this.timestampToTime(this.dataForm.endDay)
|
||||
this.repeatDate = this.dataForm.repeatTime ? this.timestampToTime(this.dataForm.repeatTime) :
|
||||
{}
|
||||
if (this.dataForm.repetition != "1") return this.repetitionType = true
|
||||
})
|
||||
} else {
|
||||
let startDate = this.timestampToTime(+new Date())
|
||||
this.startDate = this.timestampToTime(option.startTime || +new Date())
|
||||
this.startDate.hours = startDate.hours + 1
|
||||
this.startDate.minutes = '00'
|
||||
this.confirm(this.startDate, 1)
|
||||
this.endDate = this.timestampToTime(option.startTime || +new Date())
|
||||
this.endDate.hours = startDate.hours + 2
|
||||
this.endDate.minutes = '00'
|
||||
this.confirm(this.endDate, 2)
|
||||
this.repeatDate = {}
|
||||
this.dataForm.creatorUserId = this.userInfo.userId
|
||||
this.dataForm.duration = Number(option.duration) || 60
|
||||
}
|
||||
this.getDictionaryData()
|
||||
},
|
||||
methods: {
|
||||
back() {
|
||||
if (!this.dataForm.id) return uni.navigateBack()
|
||||
uni.navigateBack({
|
||||
delta: 2
|
||||
})
|
||||
},
|
||||
handleAction(index) {
|
||||
ScheduleUpdate(this.dataForm, index + 1).then(res => {
|
||||
uni.showToast({
|
||||
title: res.msg,
|
||||
complete: () => {
|
||||
uni.$emit('refresh')
|
||||
uni.navigateBack({
|
||||
delta: 2
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
change_providerType(val) {
|
||||
if (!val) {
|
||||
let startDate = this.timestampToTime(+new Date())
|
||||
this.startDate = this.timestampToTime(this.dataForm.startDay)
|
||||
this.startDate.hours = startDate.hours + 1
|
||||
this.startDate.minutes = '00'
|
||||
this.confirm(this.startDate, 1)
|
||||
this.endDate = this.timestampToTime(this.dataForm.endDay)
|
||||
this.endDate.hours = startDate.hours + 2
|
||||
this.endDate.minutes = '00'
|
||||
this.confirm(this.endDate, 2)
|
||||
} else {
|
||||
this.dataForm.endDay = this.dataForm.startDay
|
||||
}
|
||||
this.dataForm.reminderTime = -2
|
||||
},
|
||||
repeatTimeChange(val) {
|
||||
let time = new Date()
|
||||
time.setFullYear(time.getFullYear() + 1)
|
||||
if (val != 1) {
|
||||
let date = time.getTime()
|
||||
this.repeatDate = this.timestampToTime(date)
|
||||
this.repeatDate.minutes = '00'
|
||||
this.confirm(this.repeatDate, 3)
|
||||
}
|
||||
},
|
||||
getResult() {
|
||||
if (!this.dataForm.id) return uni.navigateBack()
|
||||
uni.showModal({
|
||||
title: '退出此次编辑?',
|
||||
content: '日程信息将不会保存',
|
||||
success: res => {
|
||||
if (res.confirm) {
|
||||
uni.$emit('refresh')
|
||||
uni.navigateBack({
|
||||
delta: 2
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
changeSend(id, name) {
|
||||
this.dataForm.send = id
|
||||
this.dataForm.sendName = name
|
||||
},
|
||||
getDictionaryData() {
|
||||
baseStore.getDictionaryData({
|
||||
sort: 'scheduleType'
|
||||
}).then((res) => {
|
||||
this.categoryOptions = res || []
|
||||
if (this.categoryOptions.length) this.dataForm.category = this.categoryOptions[0].id
|
||||
})
|
||||
},
|
||||
confirm(e, type) {
|
||||
if (type == 1) {
|
||||
this.dataForm.startDay = e.year + '-' + e.month + '-' + e.date
|
||||
this.dataForm.startDay = new Date(this.dataForm.startDay).getTime()
|
||||
this.dataForm.startTime = e.hours + ":" + e.minutes
|
||||
} else if (type == 2) {
|
||||
this.dataForm.endDay = e.year + '-' + e.month + '-' + e.date
|
||||
this.dataForm.endDay = new Date(this.dataForm.endDay).getTime()
|
||||
this.dataForm.endTime = e.hours + ":" + e.minutes
|
||||
} else {
|
||||
this.dataForm.repeatTime = e.year + '-' + e.month + '-' + e.date
|
||||
this.dataForm.repeatTime = new Date(this.dataForm.repeatTime).getTime()
|
||||
}
|
||||
},
|
||||
save() {
|
||||
this.$refs.dataForm.validate((valid) => {
|
||||
if (valid) {
|
||||
if (this.dataForm.duration == -1) {
|
||||
if (this.dataForm.startDay > this.dataForm.endDay) {
|
||||
this.$refs.uToast.show({
|
||||
title: '结束时间必须晚于开始时间',
|
||||
type: 'error'
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
if (this.dataForm.allDay == 1) {
|
||||
let startDay = this.timestampToData(this.dataForm.startDay)
|
||||
let endDay = this.timestampToData(this.dataForm.endDay)
|
||||
if (this.dataForm.startDay > this.dataForm.endDay) {
|
||||
this.$refs.uToast.show({
|
||||
title: '结束时间必须晚于开始时间',
|
||||
type: 'error'
|
||||
})
|
||||
return
|
||||
}
|
||||
this.dataForm.startDay = new Date(startDay).getTime()
|
||||
this.dataForm.endDay = new Date(endDay).getTime()
|
||||
}
|
||||
if (this.dataForm.repetition != 1) {
|
||||
if (this.dataForm.startDay > this.dataForm.repeatTime) {
|
||||
this.$refs.uToast.show({
|
||||
title: '结束重复时间必须晚于开始时间',
|
||||
type: 'error'
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
if (this.dataForm.id && this.repetitionType) {
|
||||
this.show = true
|
||||
this.actionList = []
|
||||
this.actionList.push({
|
||||
text: '仅修改此日程',
|
||||
id: '1'
|
||||
})
|
||||
this.actionList.push({
|
||||
text: '修改此日程及后续日程',
|
||||
id: '2',
|
||||
})
|
||||
} else {
|
||||
this.btnLoading = true
|
||||
const formMethod = this.dataForm.id ? ScheduleUpdate : ScheduleCreate;
|
||||
const query = {
|
||||
...this.dataForm,
|
||||
files: JSON.stringify(this.dataForm.files)
|
||||
}
|
||||
formMethod(query, 3).then(res => {
|
||||
uni.showToast({
|
||||
title: res.msg,
|
||||
complete: () => {
|
||||
this.btnLoading = false
|
||||
uni.$emit('refresh')
|
||||
if (this.dataForm.id) {
|
||||
uni.navigateBack({
|
||||
delta: 2
|
||||
})
|
||||
} else {
|
||||
uni.navigateBack()
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
timestampToTime(timestamp) {
|
||||
let list = {}
|
||||
timestamp = timestamp || 0
|
||||
var date = new Date(Number(timestamp));
|
||||
let Y = date.getFullYear();
|
||||
let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
|
||||
let D = date.getDate();
|
||||
let h = date.getHours();
|
||||
let m = date.getMinutes();
|
||||
let s = date.getSeconds();
|
||||
list.year = Y
|
||||
list.month = M
|
||||
list.date = D
|
||||
list.hours = h < 10 ? 0 + h : h
|
||||
list.minutes = m < 10 ? 0 + m : m
|
||||
list.seconds = s < 10 ? 0 + s : s
|
||||
return list
|
||||
},
|
||||
timestampToData(timestamp) {
|
||||
var date = new Date(timestamp);
|
||||
let Y = date.getFullYear();
|
||||
let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
|
||||
let D = date.getDate();
|
||||
return Y + '-' + M + '-' + D + " 00:00:00"
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss">
|
||||
page {
|
||||
background-color: #f0f2f6;
|
||||
}
|
||||
|
||||
.scheduleForm-v {
|
||||
padding-bottom: 110rpx;
|
||||
}
|
||||
</style>
|
||||
277
pages/workFlow/schedule/index.vue
Normal file
277
pages/workFlow/schedule/index.vue
Normal file
@@ -0,0 +1,277 @@
|
||||
<template>
|
||||
<view class="schedule-v">
|
||||
<view class="calendar-v">
|
||||
<calendar :lunar="true" :selected="selected" :showMonth="true" @change="change" @initdate="initdate"
|
||||
:key='key' />
|
||||
</view>
|
||||
<view class="u-p-20 block">
|
||||
<view class="block-a u-font-24">
|
||||
{{dateDay}}
|
||||
<div>{{changedate}}</div>
|
||||
</view>
|
||||
<view class="u-m-b-20 list-box">
|
||||
<view v-for="(item,index) in scheduleList" :key="index" class="list">
|
||||
<view class="u-m-t-20 u-flex item" @click="goDetail(item.id,item.creatorUserId)">
|
||||
<text class="u-font-28">{{item.allDay?'全天':item.startTime}}</text>
|
||||
<view class="u-flex-col u-m-l-20 u-p-l-20 content u-font-28">
|
||||
<view>{{item.title}}</view>
|
||||
<view class="u-font-24">{{item.content}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view :class="scheduleList.length<3?'lunar1':'addlunar'">
|
||||
<view @click="goDetail()" class="add-title">+添加日程内容</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import calendar from './calendar/uni-calendar.vue'
|
||||
import {
|
||||
List
|
||||
} from '@/api/workFlow/schedule.js'
|
||||
export default {
|
||||
components: {
|
||||
direction: 'col',
|
||||
calendar,
|
||||
},
|
||||
props: {
|
||||
config: {
|
||||
type: Object,
|
||||
default: () => {}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
selected: [],
|
||||
showForm: false,
|
||||
horizontal: 'right',
|
||||
vertical: 'bottom',
|
||||
direction: 'horizontal',
|
||||
pattern: {
|
||||
color: '#7A7E83',
|
||||
backgroundColor: '#fff',
|
||||
selectedColor: '#007AFF',
|
||||
buttonColor: "#007AFF"
|
||||
},
|
||||
changedate: '',
|
||||
scheduleList: [],
|
||||
exhibitionList: [],
|
||||
startDate: '',
|
||||
endDate: '',
|
||||
dateDay: '',
|
||||
query: {},
|
||||
options: [{
|
||||
text: '删除',
|
||||
style: {
|
||||
backgroundColor: '#dd524d'
|
||||
}
|
||||
}],
|
||||
startTime: "",
|
||||
formVisible: false,
|
||||
userInfo: {},
|
||||
key: +new Date(),
|
||||
toDay: '',
|
||||
sysConfigInfo: {}
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
this.userInfo = uni.getStorageSync('userInfo') || {}
|
||||
this.sysConfigInfo = uni.getStorageSync('sysConfigInfo') || {}
|
||||
},
|
||||
onShow() {
|
||||
uni.$on('refresh', () => {
|
||||
this.key = +new Date()
|
||||
});
|
||||
},
|
||||
onUnload() {
|
||||
uni.$off('refresh')
|
||||
},
|
||||
methods: {
|
||||
/* 初始化请求 */
|
||||
initdate(cale, nowDate) {
|
||||
let canlender = cale.canlender;
|
||||
let weeks = cale.weeks;
|
||||
for (let i = 0; i < canlender.length; i++) {
|
||||
if (canlender[i].fullDate === nowDate.fullDate) {
|
||||
let day = this.toChinaDay(nowDate.lunar.nWeek)
|
||||
this.toDay = nowDate.fullDate
|
||||
this.dateTime = nowDate.fullDate
|
||||
this.dateDay = nowDate.month + '月' + nowDate.date + '日' + " 周" + day +
|
||||
" (今天)"
|
||||
this.changedate = ''
|
||||
if (this.sysConfigInfo.showLunarCalendar) this.changedate = '农历 ' + canlender[i].lunar.IMonthCn +
|
||||
canlender[i].lunar.IDayCn;
|
||||
break;
|
||||
}
|
||||
}
|
||||
let data = {
|
||||
weeks: weeks,
|
||||
canlender: canlender
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
this.handleScheduleList(data)
|
||||
})
|
||||
},
|
||||
handleScheduleList(data) {
|
||||
let canlender = data.canlender
|
||||
let startTime = this.startDate = canlender[0].lunar.cYear + '-' + canlender[0].lunar.cMonth + '-' +
|
||||
canlender[0].lunar
|
||||
.cDay;
|
||||
let endTime = this.endDate = canlender[canlender.length - 1].lunar.cYear + '-' + canlender[canlender
|
||||
.length - 1].lunar
|
||||
.cMonth + '-' + canlender[canlender.length - 1].lunar.cDay;
|
||||
let query = {
|
||||
startTime: startTime,
|
||||
endTime: endTime,
|
||||
dateTime: data.fulldate || this.toDay
|
||||
}
|
||||
List(query).then(res => {
|
||||
let signList = res.data.signList;
|
||||
if (res.data.todayList) {
|
||||
this.scheduleList = res.data.todayList.map(o => ({
|
||||
...o,
|
||||
show: false
|
||||
}));
|
||||
}
|
||||
let selected = []
|
||||
for (let [key, value] of Object.entries(signList)) {
|
||||
const cYear = key.slice(0, 4)
|
||||
const cMonth = key.slice(4, 6)
|
||||
const cDay = key.slice(6, 8)
|
||||
let date = cYear + '-' + cMonth + '-' + cDay
|
||||
if (value && value != 0) {
|
||||
selected.push({
|
||||
date,
|
||||
info: ''
|
||||
})
|
||||
}
|
||||
}
|
||||
this.selected = selected
|
||||
})
|
||||
},
|
||||
change(e) {
|
||||
let weeks = e.cale.weeks;
|
||||
let canlender = e.cale.canlender;
|
||||
let lunar = e.lunar;
|
||||
lunar.cMonth = lunar.cMonth < 10 ? '0' + Number(lunar.cMonth) : lunar.cMonth
|
||||
lunar.cDay = lunar.cDay < 10 ? '0' + Number(lunar.cDay) : lunar.cDay
|
||||
let allDay = lunar.lYear + '-' + lunar.cMonth + '-' + lunar.cDay
|
||||
let srt = this.time(e.fulldate)
|
||||
let day = this.toChinaDay(lunar.nWeek)
|
||||
this.startTime = new Date(e.fulldate).getTime()
|
||||
this.dateDay = lunar.cMonth + '月' + lunar.cDay + '日' + " 周" + day +
|
||||
srt
|
||||
this.changedate = ''
|
||||
if (this.sysConfigInfo.showLunarCalendar) this.changedate = '农历 ' + lunar.IMonthCn + lunar.IDayCn;
|
||||
let data = {
|
||||
weeks: weeks,
|
||||
canlender: canlender,
|
||||
lunar: lunar,
|
||||
fulldate: e.fulldate
|
||||
}
|
||||
this.handleScheduleList(data)
|
||||
},
|
||||
goDetail(id = '', creatorUserId) {
|
||||
let type = this.userInfo.userId == creatorUserId ? true : false
|
||||
let url = id ? `/pages/workFlow/schedule/detail?id=${id}&type=${type}` :
|
||||
`/pages/workFlow/schedule/form?id=${id}&startTime=${this.startTime}&duration=${this.sysConfigInfo.duration}`
|
||||
uni.navigateTo({
|
||||
url
|
||||
})
|
||||
},
|
||||
open(index) {
|
||||
this.scheduleList[index].show = true;
|
||||
this.scheduleList.map((val, idx) => {
|
||||
if (index != idx) this.scheduleList[idx].show = false;
|
||||
})
|
||||
},
|
||||
toChinaDay(d) {
|
||||
if (d == 1) return '一'
|
||||
if (d == 2) return '二'
|
||||
if (d == 3) return '三'
|
||||
if (d == 4) return '四'
|
||||
if (d == 5) return '五'
|
||||
if (d == 6) return '六'
|
||||
if (d == 7) return '日'
|
||||
},
|
||||
time(date) {
|
||||
let time = new Date()
|
||||
if (new Date(date).getFullYear() == time.getFullYear() && new Date(date).getMonth() == time.getMonth()) {
|
||||
let time_str = "";
|
||||
if (new Date(date).getDate() === new Date().getDate()) {
|
||||
time_str = " (今天)";
|
||||
} else if (new Date(date).getDate() === (new Date().getDate() - 1)) {
|
||||
time_str = " (昨天)";
|
||||
} else if (new Date(date).getDate() === (new Date().getDate() + 1)) {
|
||||
time_str = " (明天)";
|
||||
} else if (new Date(date).getDate() < new Date().getDate()) {
|
||||
time_str = "";
|
||||
}
|
||||
return time_str;
|
||||
}
|
||||
return ''
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
page {
|
||||
background-color: #f0f2f6;
|
||||
}
|
||||
|
||||
.schedule-v {
|
||||
width: 100%;
|
||||
|
||||
.block {
|
||||
.block-a {
|
||||
background-color: #fff;
|
||||
padding: 20rpx 30rpx;
|
||||
}
|
||||
|
||||
.list-box {
|
||||
.list {
|
||||
.item {
|
||||
width: 100%;
|
||||
background-color: #fff;
|
||||
height: 120rpx;
|
||||
align-items: center;
|
||||
padding: 0 20rpx;
|
||||
|
||||
.content {
|
||||
flex: 1;
|
||||
border-left: 4rpx solid #2A7DFD;
|
||||
justify-content: center;
|
||||
height: 80rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.lunar1 {
|
||||
height: 124rpx;
|
||||
line-height: 124rpx;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.addlunar {
|
||||
height: 124rpx;
|
||||
line-height: 124rpx;
|
||||
border-top: 1rpx solid rgb(228, 231, 237);
|
||||
}
|
||||
|
||||
.add-title {
|
||||
margin-left: 20rpx;
|
||||
font-size: 24rpx;
|
||||
color: #C0C0C0;
|
||||
}
|
||||
}
|
||||
|
||||
.uni-calendar-item__weeks-box-item {
|
||||
height: 3.23rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
218
pages/workFlow/schedule/sendSelect/Select.vue
Normal file
218
pages/workFlow/schedule/sendSelect/Select.vue
Normal file
@@ -0,0 +1,218 @@
|
||||
<template>
|
||||
<u-popup class="jnpf-tree-select-popup" :maskCloseAble="maskCloseAble" mode="right" v-model="showPopup"
|
||||
:safeAreaInsetBottom="safeAreaInsetBottom" @close="close" :z-index="uZIndex" width="100%">
|
||||
<view class="jnpf-tree-select-body">
|
||||
<view class="jnpf-tree-select-title">
|
||||
<view class="icon-ym icon-ym-report-icon-preview-pagePre u-font-40 backIcon" @tap="close()"></view>
|
||||
<view class="title">选择提醒</view>
|
||||
</view>
|
||||
<view class="jnpf-tree-select-search">
|
||||
<u-search :placeholder="$t('app.apply.pleaseKeyword')" v-model="keyword" height="72"
|
||||
:show-action="false" @change="search()" bg-color="#f0f2f6" shape="square">
|
||||
</u-search>
|
||||
</view>
|
||||
<view class="jnpf-tree-select-tree">
|
||||
<scroll-view style="height: 100%" :refresher-enabled="false" :refresher-threshold="100"
|
||||
:scroll-with-animation='true' :refresher-triggered="triggered" @scrolltolower="handleScrollToLower"
|
||||
:scroll-y="true">
|
||||
<view class="list-box" v-if="list.length">
|
||||
<radio-group class="list-item" :value="innerValue" v-for="(item,index) in list" :key="index"
|
||||
@change="radioChange(item)">
|
||||
<label class="radio-label">
|
||||
<radio class="u-radio" :value="item.id" :checked="item.id === selectId" />
|
||||
<view class="list-item-content u-line-1">{{item.fullName}}</view>
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
<JnpfEmpty v-else></JnpfEmpty>
|
||||
</scroll-view>
|
||||
</view>
|
||||
<!-- 底部按钮 -->
|
||||
<view class="jnpf-bottom-actions">
|
||||
<u-button class="buttom-btn" @click="close()">取消</u-button>
|
||||
<u-button class="buttom-btn" type="primary" @click.stop="handleConfirm()">确定</u-button>
|
||||
</view>
|
||||
</view>
|
||||
</u-popup>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
const defaultProps = {
|
||||
label: 'fullName',
|
||||
value: 'id',
|
||||
}
|
||||
import {
|
||||
getMsgTemplate
|
||||
} from '@/api/portal/portal.js'
|
||||
export default {
|
||||
props: {
|
||||
selectType: {
|
||||
type: String,
|
||||
default: 'all'
|
||||
},
|
||||
clearable: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
query: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
// 是否显示边框
|
||||
border: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
// 通过双向绑定控制组件的弹出与收起
|
||||
modelValue: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// "取消"按钮的颜色
|
||||
cancelColor: {
|
||||
type: String,
|
||||
default: '#606266'
|
||||
},
|
||||
// "确定"按钮的颜色
|
||||
confirmColor: {
|
||||
type: String,
|
||||
default: '#2979ff'
|
||||
},
|
||||
// 弹出的z-index值
|
||||
zIndex: {
|
||||
type: [String, Number],
|
||||
default: 99999
|
||||
},
|
||||
safeAreaInsetBottom: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 是否允许通过点击遮罩关闭Picker
|
||||
maskCloseAble: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
//多选
|
||||
multiple: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
// 顶部标题
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
// 取消按钮的文字
|
||||
cancelText: {
|
||||
type: String,
|
||||
default: '取消'
|
||||
},
|
||||
// 确认按钮的文字
|
||||
confirmText: {
|
||||
type: String,
|
||||
default: '确认'
|
||||
},
|
||||
selectedId: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
keyword: '',
|
||||
selectList: [],
|
||||
list: [],
|
||||
pagination: {
|
||||
currentPage: 1,
|
||||
pageSize: 20,
|
||||
messageSource: 4
|
||||
},
|
||||
total: 0,
|
||||
triggered: false,
|
||||
innerValue: '',
|
||||
selectId: this.selectedId,
|
||||
showPopup: false
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
modelValue: {
|
||||
immediate: true,
|
||||
handler(val) {
|
||||
this.showPopup = val
|
||||
}
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
uZIndex() {
|
||||
// 如果用户有传递z-index值,优先使用
|
||||
return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
|
||||
},
|
||||
realProps() {
|
||||
return {
|
||||
...defaultProps,
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
cleanAll() {
|
||||
this.selectList = [];
|
||||
},
|
||||
radioChange(item) {
|
||||
this.selectId = item.id;
|
||||
this.innerValue = item.id;
|
||||
this.selectList = item
|
||||
},
|
||||
search() {
|
||||
this.searchTimer && clearTimeout(this.searchTimer)
|
||||
this.searchTimer = setTimeout(() => {
|
||||
this.resetData()
|
||||
}, 300)
|
||||
},
|
||||
resetData() {
|
||||
this.list = []
|
||||
this.pagination = {
|
||||
currentPage: 1,
|
||||
pageSize: 20,
|
||||
messageSource: 4
|
||||
}
|
||||
this.upCallback()
|
||||
},
|
||||
handleScrollToLower() {
|
||||
if (this.pagination.pageSize * this.pagination.currentPage < this.total) {
|
||||
this.pagination.currentPage = this.pagination.currentPage + 1;
|
||||
this.upCallback()
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: '没有更多信息啦!',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
},
|
||||
upCallback() {
|
||||
let query = {
|
||||
currentPage: this.pagination.currentPage,
|
||||
pageSize: this.pagination.pageSize,
|
||||
keyword: this.keyword,
|
||||
messageSource: this.pagination.messageSource
|
||||
}
|
||||
this.loading = false
|
||||
getMsgTemplate(query).then(res => {
|
||||
const list = res.data.list;
|
||||
this.list = this.list.concat(list);
|
||||
this.pagination = res.data.pagination
|
||||
this.total = this.pagination.total
|
||||
let item = this.list.filter(o => o.id == this.selectId)[0]
|
||||
if (item) this.selectList = item
|
||||
})
|
||||
},
|
||||
handleConfirm() {
|
||||
this.keyword = '';
|
||||
this.$emit('confirm', this.selectList);
|
||||
this.close();
|
||||
},
|
||||
close() {
|
||||
this.$emit('close', false);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
86
pages/workFlow/schedule/sendSelect/index.vue
Normal file
86
pages/workFlow/schedule/sendSelect/index.vue
Normal file
@@ -0,0 +1,86 @@
|
||||
<template>
|
||||
<view class="jnpf-tree-select">
|
||||
<u-input input-align='right' type="select" :select-open="selectShow" v-model="innerValue"
|
||||
:placeholder="placeholder" @click="openSelect" />
|
||||
<Select v-model="selectShow" :selectedId="selectedId" ref="userTree" @close="handleClose()"
|
||||
@confirm="handleConfirm" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Select from './Select.vue';
|
||||
import {
|
||||
getMsgTemplate
|
||||
} from '@/api/portal/portal.js'
|
||||
import {
|
||||
login
|
||||
} from '@/api/common';
|
||||
export default {
|
||||
components: {
|
||||
Select
|
||||
},
|
||||
props: {
|
||||
modelValue: {
|
||||
default: ''
|
||||
},
|
||||
send: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
placeholder: {
|
||||
type: String,
|
||||
default: '请选择'
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
sendName: {
|
||||
type: String,
|
||||
default: '请选择'
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
selectShow: false,
|
||||
innerValue: '',
|
||||
selectedId: '',
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
send: {
|
||||
handler(val) {
|
||||
if (!val) return this.innerValue = ''
|
||||
this.setDefault(val)
|
||||
},
|
||||
immediate: true
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
setDefault(id) {
|
||||
this.innerValue = this.modelValue
|
||||
this.selectedId = id
|
||||
},
|
||||
openSelect() {
|
||||
if (this.disabled) return
|
||||
this.selectShow = true
|
||||
this.$refs.userTree.resetData()
|
||||
},
|
||||
handleConfirm(e) {
|
||||
this.selectedId = e.id;
|
||||
this.defaultValue = e.id
|
||||
this.innerValue = e.fullName
|
||||
this.$emit('update:modelValue', e.id)
|
||||
this.$emit('change', e.id, e.fullName)
|
||||
},
|
||||
handleClose() {
|
||||
this.selectShow = false
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.jnpf-tree-select {
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
375
pages/workFlow/schedule/t-datetime.vue
Normal file
375
pages/workFlow/schedule/t-datetime.vue
Normal file
@@ -0,0 +1,375 @@
|
||||
<template>
|
||||
<view class="jnpf-dateTime">
|
||||
<u-input input-align='right' type="select" :select-open="selectShow" v-model="innerValue"
|
||||
:placeholder="placeholder" @click="openSelect" :disabled="disabled">
|
||||
</u-input>
|
||||
<u-popup v-model="selectShow" mode="bottom" @click="colse()">
|
||||
<view class="t-pop" @tap.stop>
|
||||
<view class="pop-main">
|
||||
<view class="top">
|
||||
<view class="top-l">
|
||||
<view @click="changeSwp('1')" :style="{color:sindex==1?'#1E79FF':'#333333'}">
|
||||
<text>{{checkyear}}</text>
|
||||
</view>
|
||||
<view @click="changeSwp('2')" :style="{color:sindex==2?'#1E79FF':'#333333'}"
|
||||
v-if="allDay==0">
|
||||
<text>{{checkhour}}:{{checkminute}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="top-r" @click="onOK()">
|
||||
<text>确定</text>
|
||||
</view>
|
||||
</view>
|
||||
<swiper class="swiper" circular :current-item-id="sindex">
|
||||
<swiper-item :item-id="'1'">
|
||||
<view class="mid">
|
||||
<scroll-view scroll-y="true" style="height: 960rpx" @scrolltolower="tolower">
|
||||
<uni-calendar ref="calendar" :insert="insert" :lunar='lunar'
|
||||
@change='calendarChange' :date='today' />
|
||||
</scroll-view>
|
||||
</view>
|
||||
</swiper-item>
|
||||
<swiper-item :item-id="'2'" v-if="allDay==0">
|
||||
<picker-view :indicator-style="indicatorStyle" :value="swiperTime" @change="bindChange"
|
||||
class="picker-view">
|
||||
<picker-view-column>
|
||||
<view class="item" v-for="(v,i) in 24" :key="i">{{i<10?'0'+i:i}}时</view>
|
||||
</picker-view-column>
|
||||
<picker-view-column>
|
||||
<view class="item" v-for="(v,i) in 12" :key="i">{{i<2?'0'+i*5:i*5}}分
|
||||
</view>
|
||||
</picker-view-column>
|
||||
</picker-view>
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</u-popup>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "t-datetime",
|
||||
props: {
|
||||
type: {
|
||||
type: Number,
|
||||
default: 0 //默认时间后推0分钟
|
||||
},
|
||||
allDay: {
|
||||
type: Number,
|
||||
default: 0
|
||||
},
|
||||
modelValue: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
date: {
|
||||
type: Object,
|
||||
default: () => {}
|
||||
},
|
||||
placeholder: {
|
||||
type: String,
|
||||
default: '请选择'
|
||||
},
|
||||
delayMin: {
|
||||
type: Number,
|
||||
default: 0 //默认时间后推0分钟
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
canToday: { //是否可选择当天之前的时间
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
textList: ['日', '一', '二', '三', '四', '五', '六'],
|
||||
mList: [],
|
||||
checkyear: 0,
|
||||
checkmonth: 0,
|
||||
checkdate: 0,
|
||||
checkhour: 0,
|
||||
checkminute: 0,
|
||||
indicatorStyle: `height: 50px;`,
|
||||
sindex: '1',
|
||||
nowYear: 0,
|
||||
nowMonth: 0,
|
||||
nowDate: 0,
|
||||
lunar: false,
|
||||
insert: true,
|
||||
innerValue: '',
|
||||
selectShow: false,
|
||||
swiperTime: [],
|
||||
year: 0,
|
||||
hours: '',
|
||||
minutes: '',
|
||||
today: ''
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
allDay(val) {
|
||||
let allTime = this.date.year + '-' + this.date.month + '-' + this.date.date
|
||||
this.today = allTime
|
||||
let srt = this.time(allTime)
|
||||
this.innerValue = ''
|
||||
if (srt) {
|
||||
this.innerValue = srt + this.date.month + '月' + this.date.date + '日'
|
||||
} else {
|
||||
if (this.date.year == this.year) {
|
||||
this.innerValue = this.date.month + '月' + this.date.date + '日'
|
||||
} else {
|
||||
this.innerValue = this.date.year + '年' + this.date.month + '月' + this.date.date + '日'
|
||||
}
|
||||
}
|
||||
if (this.allDay == 0) {
|
||||
this.innerValue = this.innerValue + ' ' + this.hours + ':' +
|
||||
this.minutes
|
||||
}
|
||||
},
|
||||
date(val) {
|
||||
this.init()
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.timestampToTime(+new Date())
|
||||
this.init()
|
||||
},
|
||||
methods: {
|
||||
tolower() {
|
||||
this.init()
|
||||
},
|
||||
openSelect() {
|
||||
if (this.disabled) return
|
||||
this.selectShow = true
|
||||
this.init()
|
||||
},
|
||||
calendarChange(e) {
|
||||
this.date.year = e.year
|
||||
this.date.month = e.month
|
||||
this.date.date = e.date
|
||||
this.date.date = this.date.date < 10 ? '0' + Number(this.date.date) : this.date.date
|
||||
this.date.month = this.date.month < 10 ? '0' + Number(this.date.month) : this.date.month
|
||||
this.checkyear = this.year == this.date.year ? this.date.month + '月' + this.date.date + '日' : this.date
|
||||
.year +
|
||||
'年' + this.date.month + '月' + this.date.date + '日'
|
||||
this.sindex = '2'
|
||||
},
|
||||
init() {
|
||||
this.innerValue = ''
|
||||
this.today = this.date.year + '-' + this.date.month + '-' + this.date.date
|
||||
this.date.minutes = this.date.minutes < 10 ? '0' + Number(this.date.minutes) : this.date.minutes
|
||||
this.date.hours = this.date.hours < 10 ? '0' + Number(this.date.hours) : this.date.hours
|
||||
this.date.date = this.date.date < 10 ? '0' + Number(this.date.date) : this.date.date
|
||||
this.date.month = this.date.month < 10 ? '0' + Number(this.date.month) : this.date.month
|
||||
this.checkyear = this.year == this.date.year ? this.date.month + '月' + this.date.date + '日' : this.date
|
||||
.year + '年' + this.date.month + '月' + this.date.date + '日'
|
||||
this.checkhour = this.date.hours
|
||||
this.checkminute = this.date.minutes < 10 ? '0' + Number(this.date.minutes) : this.date.minutes
|
||||
let checkminute = this.date.minutes / 5
|
||||
this.swiperTime = [Number(this.checkhour), checkminute]
|
||||
this.hours = this.date.hours
|
||||
this.minutes = this.date.minutes
|
||||
let allTime = this.date.year + '-' + this.date.month + '-' + this.date.date
|
||||
let srt = this.time(allTime)
|
||||
if (srt) {
|
||||
this.innerValue = srt + this.date.month + '月' + this.date.date + '日'
|
||||
} else {
|
||||
if (this.date.year == this.year) {
|
||||
this.innerValue = this.date.month + '月' + this.date.date + '日'
|
||||
} else {
|
||||
this.innerValue = this.date.year + '年' + this.date.month + '月' + this.date.date + '日'
|
||||
}
|
||||
}
|
||||
if (this.allDay == 0) {
|
||||
this.innerValue = this.innerValue + ' ' + this.hours + ':' +
|
||||
this.checkminute
|
||||
}
|
||||
|
||||
},
|
||||
colse() {
|
||||
this.selectShow = false
|
||||
},
|
||||
bindChange(e) {
|
||||
const val = e.detail.value
|
||||
this.swiperTime = [val[0], val[1]]
|
||||
this.checkhour = Number(val[0]) < 10 ? '0' + val[0] : val[0]
|
||||
this.checkminute = val[1] == '天' ? '00' : val[1] < 2 ? '0' + val[1] * 5 : val[1] * 5
|
||||
},
|
||||
changeSwp(i) {
|
||||
this.sindex = i
|
||||
},
|
||||
onOK() {
|
||||
if (this.allDay == 1) {
|
||||
this.date.hours = '00'
|
||||
this.date.minutes = '00'
|
||||
} else {
|
||||
this.date.hours = this.checkhour
|
||||
this.date.minutes = this.checkminute
|
||||
}
|
||||
this.selectShow = false
|
||||
let allTime = this.date.year + '-' + this.date.month + '-' + this.date.date
|
||||
let srt = this.time(allTime)
|
||||
if (srt) {
|
||||
this.innerValue = srt + this.date.month + '月' + this.date.date + '日'
|
||||
if (this.allDay == 0) {
|
||||
this.innerValue = this.innerValue + ' ' + this.date.hours +
|
||||
':' + this.date.minutes
|
||||
}
|
||||
} else {
|
||||
if (this.date.year == this.year) {
|
||||
this.innerValue = this.date.month + '月' + this.date.date + '日'
|
||||
} else {
|
||||
this.innerValue = this.date.year + '年' + this.date.month + '月' + this.date.date + '日'
|
||||
}
|
||||
if (this.allDay == 0) {
|
||||
this.innerValue = this.innerValue + ' ' + this.date.hours +
|
||||
':' + this.date.minutes
|
||||
}
|
||||
|
||||
}
|
||||
this.selectShow = false
|
||||
this.$emit('confirm', this.date, this.type)
|
||||
},
|
||||
timestampToTime(timestamp) {
|
||||
var date = new Date(timestamp);
|
||||
this.year = date.getFullYear();
|
||||
},
|
||||
time(date) {
|
||||
if (this.date.year != this.year) return false
|
||||
let time_str = "";
|
||||
if (new Date(date).getDate() === new Date().getDate()) {
|
||||
time_str = "今天 · ";
|
||||
} else if (new Date(date).getDate() === (new Date().getDate() - 1)) {
|
||||
time_str = "昨天 · ";
|
||||
} else if (new Date(date).getDate() === (new Date().getDate() + 1)) {
|
||||
time_str = "明天 · ";
|
||||
} else if (new Date(date).getDate() < new Date().getDate()) {
|
||||
time_str = "";
|
||||
}
|
||||
return time_str;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.jnpf-dateTime {
|
||||
width: 100%;
|
||||
|
||||
:deep(.u-drawer) {
|
||||
z-index: 999 !important;
|
||||
}
|
||||
}
|
||||
|
||||
:deep(.uni-calendar-item__weeks-box-item) {
|
||||
line-height: 36rpx;
|
||||
}
|
||||
|
||||
.t-pop {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
.pop-main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background-color: #fff;
|
||||
border-radius: 24px;
|
||||
height: 900rpx;
|
||||
width: 100%;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.swiper {
|
||||
height: 840rpx;
|
||||
width: 100vw;
|
||||
}
|
||||
|
||||
.top {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
margin: 20rpx 0;
|
||||
|
||||
.top-l {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-left: 30rpx;
|
||||
}
|
||||
|
||||
.top-r {
|
||||
margin-right: 30rpx;
|
||||
color: #1E79FF;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.calendar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
width: 100vw;
|
||||
position: relative;
|
||||
|
||||
}
|
||||
|
||||
.ca-top {
|
||||
width: 14.2vw;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 66rpx;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.cell {
|
||||
width: 60rpx;
|
||||
height: 60rpx;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
align-content: center;
|
||||
border-radius: 30rpx;
|
||||
}
|
||||
|
||||
.cell-active {
|
||||
background-color: #1E79FF;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.cabg {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
width: 100vw;
|
||||
font-size: 180rpx;
|
||||
color: beige;
|
||||
position: absolute;
|
||||
z-index: 9;
|
||||
}
|
||||
|
||||
.picker-view {
|
||||
width: 750rpx;
|
||||
height: 600rpx;
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
|
||||
.item {
|
||||
height: 50px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user