浏览代码

feat:新增节假日配置;

zhangchong 1 年之前
父节点
当前提交
bd50e4a961

+ 7 - 3
package-lock.json

@@ -17,6 +17,7 @@
 				"@wangeditor/editor-for-vue": "^5.1.12",
 				"axios": "^1.2.0",
 				"bin-datav": "^0.2.0",
+				"dayjs": "^1.11.9",
 				"echarts": "^5.4.0",
 				"echarts-gl": "^2.0.9",
 				"echarts-wordcloud": "^2.1.0",
@@ -1518,8 +1519,9 @@
 			}
 		},
 		"node_modules/dayjs": {
-			"version": "1.11.6",
-			"license": "MIT"
+			"version": "1.11.9",
+			"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz",
+			"integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA=="
 		},
 		"node_modules/debug": {
 			"version": "4.3.4",
@@ -5114,7 +5116,9 @@
 			}
 		},
 		"dayjs": {
-			"version": "1.11.6"
+			"version": "1.11.9",
+			"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz",
+			"integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA=="
 		},
 		"debug": {
 			"version": "4.3.4",

+ 1 - 0
package.json

@@ -21,6 +21,7 @@
 		"@wangeditor/editor-for-vue": "^5.1.12",
 		"axios": "^1.2.0",
 		"bin-datav": "^0.2.0",
+		"dayjs": "^1.11.9",
 		"echarts": "^5.4.0",
 		"echarts-gl": "^2.0.9",
 		"echarts-wordcloud": "^2.1.0",

+ 33 - 0
src/api/system/holiday.ts

@@ -0,0 +1,33 @@
+/*
+ * @Author: zc
+ * @Description: 系统配置 - 节假日管理
+ * @version:
+ * @Date: 2022-08-09 16:19:55
+ * @LastEditors: Please set LastEditors
+ * @LastEditTime: 2022-09-21 15:36:01
+ */
+import request from '/@/utils/request';
+/**
+ * @description: 获取节假日
+ * @param {Date} month
+ * @param {string} year
+ * @return {*}
+ */
+export const getDaysSetting = (month:Date,year:string) => {
+    return request({
+        url: `/api/v1/Setting/getdaysettings-month/${month}?year=${year}`,
+        method: 'get'
+    });
+};
+/**
+ * @description: 设置节假日
+ * @param {object} data
+ * @return {*}
+ */
+export const setHolidayApi = (data:object) => {
+    return request({
+        url: `/api/v1/Setting/setdaysettings`,
+        method: 'post',
+        data
+    });
+};

+ 8 - 8
src/components/LogicFlow/PropertySetting/summary.vue

@@ -70,14 +70,14 @@
 					filterable
 				/>
 			</el-form-item>
-			<el-form-item
-				label="部门内部办理"
-				prop="onlySelfOrg"
-				v-if="form.handlerType === 0"
-				:rules="[{ required: false, message: '请选择是否部门内部办理', trigger: 'change' }]"
-			>
-				<el-switch v-model="form.onlySelfOrg" inline-prompt active-text="是" inactive-text="否"></el-switch>
-			</el-form-item>
+<!--			<el-form-item-->
+<!--				label="部门内部办理"-->
+<!--				prop="onlySelfOrg"-->
+<!--				v-if="form.handlerType === 0"-->
+<!--				:rules="[{ required: false, message: '请选择是否部门内部办理', trigger: 'change' }]"-->
+<!--			>-->
+<!--				<el-switch v-model="form.onlySelfOrg" inline-prompt active-text="是" inactive-text="否"></el-switch>-->
+<!--			</el-form-item>-->
 			<el-form-item label="会签" prop="countersignMode" :rules="[{ required: true, message: '请选择会签', trigger: 'change' }]">
 				<el-select v-model="form.countersignMode" class="w100" placeholder="请选择会签">
 					<el-option v-for="item in countersignModeList" :key="item.value" :label="item.label" :value="item.value" />

+ 8 - 8
src/components/LogicFlow/PropertySetting/task.vue

@@ -70,14 +70,14 @@
 					filterable
 				/>
 			</el-form-item>
-			<el-form-item
-				label="部门内部办理"
-				prop="onlySelfOrg"
-				v-if="form.handlerType === 0"
-				:rules="[{ required: false, message: '请选择是否部门内部办理', trigger: 'change' }]"
-			>
-				<el-switch v-model="form.onlySelfOrg" inline-prompt active-text="是" inactive-text="否"></el-switch>
-			</el-form-item>
+<!--			<el-form-item-->
+<!--				label="部门内部办理"-->
+<!--				prop="onlySelfOrg"-->
+<!--				v-if="form.handlerType === 0"-->
+<!--				:rules="[{ required: false, message: '请选择是否部门内部办理', trigger: 'change' }]"-->
+<!--			>-->
+<!--				<el-switch v-model="form.onlySelfOrg" inline-prompt active-text="是" inactive-text="否"></el-switch>-->
+<!--			</el-form-item>-->
 			<el-form-item label="会签" prop="countersignMode" :rules="[{ required: true, message: '请选择会签', trigger: 'change' }]">
 				<el-select v-model="form.countersignMode" class="w100" placeholder="请选择会签">
 					<el-option v-for="item in countersignModeList" :key="item.value" :label="item.label" :value="item.value" />

+ 689 - 0
src/utils/calendar.ts

@@ -0,0 +1,689 @@
+/**
+ * @1900-2100区间内的公历、农历互转
+ * @charset UTF-8
+ * @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]
+ */
+const 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, 0x16a95, 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
+		0x092e0, 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"],
+
+	/**
+	 * 阳历节日
+	 */
+	festival: {
+		'1-1': {title: '元旦节'},
+		'2-14': {title: '情人节'},
+		'5-1': {title: '劳动节'},
+		'5-4': {title: '青年节'},
+		'6-1': {title: '儿童节'},
+		'9-10': {title: '教师节'},
+		'10-1': {title: '国庆节'},
+		'12-25': {title: '圣诞节'},
+
+		'3-8': {title: '妇女节'},
+		'3-12': {title: '植树节'},
+		'4-1': {title: '愚人节'},
+		'5-12': {title: '护士节'},
+		'7-1': {title: '建党节'},
+		'8-1': {title: '建军节'},
+		'12-24': {title: '平安夜'},
+	},
+
+	/**
+	 * 农历节日
+	 */
+	lFestival: {
+		'12-30': {title: '除夕'},
+		'1-1': {title: '春节'},
+		'1-15': {title: '元宵节'},
+		'2-2': {title: '龙抬头'},
+		'5-5': {title: '端午节'},
+		'7-7': {title: '七夕节'},
+		'7-15': {title: '中元节'},
+		'8-15': {title: '中秋节'},
+		'9-9': {title: '重阳节'},
+		'10-1': {title: '寒衣节'},
+		'10-15': {title: '下元节'},
+		'12-8': {title: '腊八节'},
+		'12-23': {title: '北方小年'},
+		'12-24': {title: '南方小年'},
+	},
+
+	/**
+	 * 返回默认定义的阳历节日
+	 */
+	getFestival() {
+		return this.festival
+	},
+
+	/**
+	 * 返回默认定义的内容里节日
+	 */
+	getLunarFestival() {
+		return this.lFestival
+	},
+
+	/**
+	 *
+	 * @param param {Object} 按照festival的格式输入数据,设置阳历节日
+	 */
+	setFestival(param = {}) {
+		this.festival = param
+	},
+
+	/**
+	 *
+	 * @param param {Object} 按照lFestival的格式输入数据,设置农历节日
+	 */
+	setLunarFestival(param = {}) {
+		this.lFestival = param
+	},
+
+	/**
+	 * 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 y lunar Year
+	 * @return Number
+	 * @eg:var count = calendar.lYearDays(1987) ;//count=387
+	 */
+	lYearDays: function (y:number) {
+		let i, 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 y lunar Year
+	 * @return Number (0-12)
+	 * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
+	 */
+	leapMonth: function (y:number) { //闰字编码 \u95f0
+		return (this.lunarInfo[y - 1900] & 0xf);
+	},
+
+	/**
+	 * 返回农历y年闰月的天数 若该年没有闰月则返回0
+	 * @param y lunar Year
+	 * @return Number (0、29、30)
+	 * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
+	 */
+	leapDays: function (y:number) {
+		if (this.leapMonth(y)) {
+			return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29);
+		}
+		return (0);
+	},
+
+	/**
+	 * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
+	 * @param y lunar Year
+	 * @param m lunar Month
+	 * @return Number (-1、29、30)
+	 * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
+	 */
+	monthDays: function (y:number, m:number) {
+		if (m > 12 || m < 1) {
+			return -1
+		}//月份参数从1至12,参数错误返回-1
+		return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29);
+	},
+
+	/**
+	 * 返回公历(!)y年m月的天数
+	 * @param y solar Year
+	 * @param m solar Month
+	 * @return Number (-1、28、29、30、31)
+	 * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
+	 */
+	solarDays: function (y:number, m:number) {
+		if (m > 12 || m < 1) {
+			return -1
+		} //若参数错误 返回-1
+		const 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:number) {
+		let ganKey = (lYear - 3) % 10;
+		let 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:number, cDay:number) {
+		const 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";
+		const arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22];
+		return s.substring(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + "\u5ea7";//座
+	},
+
+	/**
+	 * 传入offset偏移量返回干支
+	 * @param offset 相对甲子的偏移量
+	 * @return Cn string
+	 */
+	toGanZhi: function (offset:number) {
+		return this.Gan[offset % 10] + this.Zhi[offset % 12];
+	},
+
+	/**
+	 * 传入公历(!)y年获得该年第n个节气的公历日期
+	 * @param y y公历年(1900-2100)
+	 * @param n n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
+	 * @return day Number
+	 * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
+	 */
+	getTerm: function (y:number, n:number,) {
+		if (y < 1900 || y > 2100) {
+			return -1;
+		}
+		if (n < 1 || n > 24) {
+			return -1;
+		}
+		const _table = this.sTermInfo[y - 1900];
+		const _info = [
+			parseInt('0x' + _table.substring(0, 5)).toString(),
+			parseInt('0x' + _table.substring(5, 5)).toString(),
+			parseInt('0x' + _table.substring(10, 5)).toString(),
+			parseInt('0x' + _table.substring(15, 5)).toString(),
+			parseInt('0x' + _table.substring(20, 5)).toString(),
+			parseInt('0x' + _table.substring(25, 5)).toString()
+		];
+		const _calcDay = [
+			_info[0].substring(0, 1),
+			_info[0].substring(1, 2),
+			_info[0].substring(3, 1),
+			_info[0].substring(4, 2),
+
+			_info[1].substring(0, 1),
+			_info[1].substring(1, 2),
+			_info[1].substring(3, 1),
+			_info[1].substring(4, 2),
+
+			_info[2].substring(0, 1),
+			_info[2].substring(1, 2),
+			_info[2].substring(3, 1),
+			_info[2].substring(4, 2),
+
+			_info[3].substring(0, 1),
+			_info[3].substring(1, 2),
+			_info[3].substring(3, 1),
+			_info[3].substring(4, 2),
+
+			_info[4].substring(0, 1),
+			_info[4].substring(1, 2),
+			_info[4].substring(3, 1),
+			_info[4].substring(4, 2),
+
+			_info[5].substring(0, 1),
+			_info[5].substring(1, 2),
+			_info[5].substring(3, 1),
+			_info[5].substring(4, 2),
+		];
+		return parseInt(_calcDay[n - 1]);
+	},
+
+	/**
+	 * 传入农历数字月份返回汉语通俗表示法
+	 * @param m lunar month
+	 * @return Cn string
+	 * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
+	 */
+	toChinaMonth: function (m:number,) { // 月 => \u6708
+		if (m > 12 || m < 1) {
+			return -1
+		} //若参数错误 返回-1
+		let s = this.nStr3[m - 1];
+		s += "\u6708";//加上月字
+		return s;
+	},
+
+	/**
+	 * 传入农历日期数字返回汉字表示法
+	 * @param d lunar day
+	 * @return Cn string
+	 * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
+	 */
+	toChinaDay: function (d:number,) { //日 => \u65e5
+		let s;
+		switch (d) {
+			case 10:
+				s = '\u521d\u5341';
+				break;
+			case 20:
+				s = '\u4e8c\u5341';
+				break;
+			case 30:
+				s = '\u4e09\u5341';
+				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:number,) {
+		return this.Animals[(y - 4) % 12]
+	},
+
+	/**
+	 * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
+	 * !important! 公历参数区间1900.1.31~2100.12.31
+	 * @param yPara  solar year
+	 * @param mPara  solar month
+	 * @param dPara  solar day
+	 * @return JSON object
+	 * @eg:console.log(calendar.solar2lunar(1987,11,01));
+	 */
+	solar2lunar: function (yPara:number,mPara:number, dPara:number) {
+		let y = parseInt(String(yPara));
+		let m = parseInt(String(mPara));
+		let d = parseInt(String(dPara));
+		//年份限定、上限
+		if (y < 1900 || y > 2100) {
+			return -1;// undefined转换为数字变为NaN
+		}
+		//公历传参最下限
+		if (y === 1900 && m === 1 && d < 31) {
+			return -1;
+		}
+
+		//未传参  获得当天
+		let objDate;
+		if (!y) {
+			objDate = new Date();
+		} else {
+			objDate = new Date(y, parseInt(String(m)) - 1, d);
+		}
+		let i, leap = 0, temp = 0;
+		//修正ymd参数
+		y = objDate.getFullYear();
+		m = objDate.getMonth() + 1;
+		d = objDate.getDate();
+		let 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--;
+		}
+
+		//是否今天
+		let isTodayObj = new Date(),
+			isToday = false;
+		if (isTodayObj.getFullYear() === y && isTodayObj.getMonth() + 1 === m && isTodayObj.getDate() === d) {
+			isToday = true;
+		}
+		//星期几
+		let nWeek = objDate.getDay(),
+			cWeek = this.nStr1[nWeek];
+		//数字表示周几顺应天朝周一开始的惯例
+		if (nWeek === 0) {
+			nWeek = 7;
+		}
+		//农历年
+		const year = i;
+		leap = this.leapMonth(i); //闰哪个月
+		let isLeap = false;
+
+		//效验闰月
+		for (i = 1; i < 13 && offset > 0; i++) {
+			//闰月
+			if (leap > 0 && i === (leap + 1) && !isLeap) {
+				--i;
+				isLeap = true;
+				temp = this.leapDays(year); //计算农历闰月天数
+			} else {
+				temp = this.monthDays(year, i);//计算农历普通月天数
+			}
+			//解除闰月
+			if (isLeap && 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;
+		}
+		//农历月
+		const month = i;
+		//农历日
+		const day = offset + 1;
+		//天干地支处理
+		const sm = m - 1;
+		const gzY = this.toGanZhiYear(year);
+
+		// 当月的两个节气
+		// bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
+		const firstNode = this.getTerm(y, (m * 2 - 1));//返回当月「节」为几日开始
+		const secondNode = this.getTerm(y, (m * 2));//返回当月「节」为几日开始
+
+		// 依据12节气修正干支月
+		let gzM = this.toGanZhi((y - 1900) * 12 + m + 11);
+		if (d >= firstNode) {
+			gzM = this.toGanZhi((y - 1900) * 12 + m + 12);
+		}
+
+		//传入的日期的节气与否
+		let isTerm = false;
+		let 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 相差天数
+		const dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10;
+		const gzD = this.toGanZhi(dayCyclical + d - 1);
+		//该日期所属的星座
+		const astro = this.toAstro(m, d);
+
+		const solarDate = y + '-' + m + '-' + d;
+		const lunarDate = year + '-' + month + '-' + day;
+
+		const festival:any = this.festival;
+		const lFestival:any = this.lFestival;
+
+		const festivalDate = m + '-' + d;
+		const lunarFestivalDate = month + '-' + day;
+
+		return {
+			date: solarDate,
+			lunarDate: lunarDate,
+			festival: festival[festivalDate] ? festival[festivalDate].title : null,
+			lunarFestival: lFestival[lunarFestivalDate] ? lFestival[lunarFestivalDate].title : null,
+			'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
+	 * !important! 参数区间1900.1.31~2100.12.1
+	 * @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:number, m:number, d:number, isLeapMonth:boolean) {
+		y = parseInt(String(y))
+		m = parseInt(String(m))
+		d = parseInt(String(d))
+		const leapMonth = this.leapMonth(y);
+		this.leapDays(y);
+		if (isLeapMonth && (leapMonth !== m)) {
+			return -1;
+		}//传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
+		if (y === 2100 && m === 12 && d > 1 || y === 1900 && m === 1 && d < 31) {
+			return -1;
+		}//超出了最大极限值
+		const day = this.monthDays(y, m);
+		let _day = day;
+		//bugFix 2016-9-25
+		//if month is leap, _day use leapDays method
+		if (isLeapMonth) {
+			_day = this.leapDays(y);
+		}
+		if (y < 1900 || y > 2100 || d > _day) {
+			return -1;
+		}//参数合法性效验
+
+		//计算农历的时间差
+		let offset = 0;
+		let i;
+		for (i = 1900; i < y; i++) {
+			offset += this.lYearDays(i);
+		}
+		let leap = 0, isAdd = false;
+		for (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秒(该时间也是本农历的最开始起始点)
+		const strap = Date.UTC(1900, 1, 30, 0, 0, 0);
+		const calObj = new Date((offset + d - 31) * 86400000 + strap);
+		const cY = calObj.getUTCFullYear();
+		const cM = calObj.getUTCMonth() + 1;
+		const cD = calObj.getUTCDate();
+
+		return this.solar2lunar(cY, cM, cD);
+	}
+};
+export default calendar

+ 18 - 23
src/views/business/order/accept/orderAdd.vue

@@ -180,28 +180,23 @@
 							</el-col>
 							<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 								<el-form-item label="联系电话" prop="contact" :rules="[
-									{ required: !state.ruleForm.needContact, message: '请填写联系电话', trigger: 'blur' },
+									{ required: true, message: '请填写联系电话', trigger: 'blur' },
 									{
 										pattern: /^((0\d{2,3}(-)?\d{7,8})|(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8})$/,
 										message: '联系电话格式错误',
 										trigger: 'blur',
 									},
 								]">
-									<el-input v-model="state.ruleForm.contact" :disabled="state.ruleForm.needContact"
-										:placeholder="state.ruleForm.needContact ? '无需联系' : '请填写联系电话'" clearable>
+									<el-input v-model="state.ruleForm.contact"
+										placeholder="请填写联系电话" clearable>
 									</el-input>
 								</el-form-item>
 							</el-col>
 							<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 								<el-form-item label="" prop="acceptSms"
 									:rules="[{ required: false, message: '请选择', trigger: 'change' }]">
-									<el-checkbox v-model="state.ruleForm.acceptSms" label="受理短信"
-										:disabled="state.ruleForm.needContact" />
-									<el-checkbox v-model="state.ruleForm.needContact" label="无需联系" @change="() => {
-										ruleFormRef.resetFields('contact');
-										ruleFormRef.resetFields('acceptSms');
-									}
-										" />
+									<el-checkbox v-model="state.ruleForm.acceptSms" label="受理短信" />
+                  <el-checkbox v-model="state.ruleForm.needContact" label="是否保密" />
 								</el-form-item>
 							</el-col>
 							<!-- 当“来电/信人身份”为“企业”时必填 -->
@@ -284,7 +279,7 @@
 								<el-row :gutter="0">
 									<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 										<el-form-item label="事发地址" prop="areaCode"
-											:rules="[{ required: true, message: '请选择事发地址', trigger: 'change' }]">
+											:rules="[{ required: false, message: '请选择事发地址', trigger: 'change' }]">
 											<el-cascader :options="state.areaOptions" filterable
 												:props="{ value: 'id', label: 'areaName', emitPath: false }"
 												placeholder="请选择事发地址" class="w100" v-model="state.ruleForm.areaCode"
@@ -543,18 +538,18 @@ const state = reactive<any>({
 	activeName: 'first', // tabs
 	ruleForm: {
 		// 表单
-		street: '',
-		transferPhone: '',
-		employeeName: '',
-		employeeStaffNo: '',
-		duplicateTitle: '',
-		duplicateId: '',
-		content: '',
-		licenceTypeCode: '',
-		acceptSms: false,
-		needContact: false,
-		fromPhone: '',
-		fromGender: '',
+		street: '',//街道
+		transferPhone: '',//转接电话
+		employeeName: '',//员工姓名
+		employeeStaffNo: '',//员工工号
+		duplicateTitle: '',//重复工单标题
+		duplicateId: '',//重复工单id
+		content: '', // 工单内容
+		licenceTypeCode: '', // 证件类型
+		acceptSms: false, // 是否接收短信
+    isSecret:false, //是否保密
+		fromPhone: '', // 来电号码
+		fromGender: '',// 来电人性别
 	},
 	formLoading: false, // 表单加载状态
 	historyOrderLoading: false, // 历史工单加载状态

+ 19 - 22
src/views/business/order/accept/orderEdit.vue

@@ -176,28 +176,23 @@
 							</el-col>
 							<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 								<el-form-item label="联系电话" prop="contact" :rules="[
-									{ required: !state.ruleForm.needContact, message: '请填写联系电话', trigger: 'blur' },
+									{ required: true, message: '请填写联系电话', trigger: 'blur' },
 									{
 										pattern: /^((0\d{2,3}(-)?\d{7,8})|(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8})$/,
 										message: '联系电话格式错误',
 										trigger: 'blur',
 									},
 								]">
-									<el-input v-model="state.ruleForm.contact" :disabled="state.ruleForm.needContact"
-										:placeholder="state.ruleForm.needContact ? '无需联系' : '请填写联系电话'" clearable>
+									<el-input v-model="state.ruleForm.contact"
+										placeholder="请填写联系电话" clearable>
 									</el-input>
 								</el-form-item>
 							</el-col>
 							<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 								<el-form-item label="" prop="acceptSms"
 									:rules="[{ required: false, message: '请选择', trigger: 'blur' }]">
-									<el-checkbox v-model="state.ruleForm.acceptSms" label="受理短信"
-										:disabled="state.ruleForm.needContact" />
-									<el-checkbox v-model="state.ruleForm.needContact" label="无需联系" @change="() => {
-										ruleFormRef.resetFields('contact');
-										ruleFormRef.resetFields('acceptSms');
-									}
-										" />
+									<el-checkbox v-model="state.ruleForm.acceptSms" label="受理短信" />
+                  <el-checkbox v-model="state.ruleForm.needContact" label="是否保密" />
 								</el-form-item>
 							</el-col>
 							<!-- 当“来电/信人身份”为“企业”时必填 -->
@@ -280,7 +275,7 @@
 								<el-row :gutter="0">
 									<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
 										<el-form-item label="事发地址" prop="areaCode"
-											:rules="[{ required: true, message: '请选择事发地址', trigger: 'change' }]">
+											:rules="[{ required: false, message: '请选择事发地址', trigger: 'change' }]">
 											<el-cascader :options="state.areaOptions" filterable
 												:props="{ value: 'id', label: 'areaName', emitPath: false }"
 												placeholder="请选择事发地址" class="w100" v-model="state.ruleForm.areaCode"
@@ -538,16 +533,18 @@ const state = reactive<any>({
 	activeName: 'first', // tabs
 	ruleForm: {
 		// 表单
-		street: '',
-		transferPhone: '',
-		employeeName: '',
-		employeeStaffNo: '',
-		duplicateTitle: '',
-		duplicateId: '',
-		content: '',
-		acceptSms: false,
-		needContact: false,
-		fromPhone: '',
+    street: '',//街道
+    transferPhone: '',//转接电话
+    employeeName: '',//员工姓名
+    employeeStaffNo: '',//员工工号
+    duplicateTitle: '',//重复工单标题
+    duplicateId: '',//重复工单id
+    content: '', // 工单内容
+    licenceTypeCode: '', // 证件类型
+    acceptSms: false, // 是否接收短信
+    isSecret:false, //是否保密
+    fromPhone: '', // 来电号码
+    fromGender: '',// 来电人性别
 	},
 	formLoading: false, // 表单加载状态
 	historyOrderLoading: false, // 历史工单加载状态
@@ -865,7 +862,7 @@ const onSupply = (val: any) => {
 const onSupplySuccess = () => {
 	searchHistory();
 };
-onMounted(async () => {
+onMounted(() => {
 	nextTick(async () => {
 		state.formLoading = true;
 		state.historyOrderLoading = true;

+ 210 - 0
src/views/system/config/holiday/index.vue

@@ -0,0 +1,210 @@
+<template>
+	<div class="system-holidayConfig-container layout-pd">
+		<el-card shadow="never">
+			<el-calendar v-model="today" :range="dateRange" v-loading="loading">
+				<template #header="{ date }">
+					<div>
+						<el-date-picker v-model="month" type="month" :clearable="false" placeholder="请选择月份" @change="selectMonth" />
+					</div>
+	 				<el-button-group>
+						<el-button type="primary" @click="setHoliday" :disabled="!multipleDates.length"> <SvgIcon name="ele-Sunny" class="mr3"/> 设定节假日</el-button>
+						<el-button type="primary" @click="setWorkDay" :disabled="!multipleDates.length"> <SvgIcon name="ele-Monitor" class="mr3"/> 设定工作日</el-button>
+            <el-button type="primary" @click="clearSelect" :disabled="!multipleDates.length"><SvgIcon name="ele-Delete" class="mr3"/> 清空选择</el-button>
+					</el-button-group>
+          <el-button-group>
+            <el-button @click="setWorkTime" ><SvgIcon name="ele-AlarmClock" class="mr3"/>设定工作时间</el-button>
+          </el-button-group>
+				</template>
+				<template #date-cell="{ data }">
+          <template v-for="(item, index) in state.calendarData" :key="index">
+            <div v-if="data.day === item.currantTime" class="h100">
+              <el-checkbox v-model="item.checked" class="w100 h100">
+                <div>
+                  {{dayjs(data.day).format('D')}}<span :style="item.isWorkDay ? 'color:var(--el-color-info)' : 'color:var(--el-color-success)'">({{ item.isWorkDay ? '工作日' :'节假日'}})</span>
+                </div>
+                <div class="lunar"  :style="isFestival( data) ? 'color:var(--el-color-danger);font-weight:bold;' :''">{{ solarToLunar(data) }}</div>
+              </el-checkbox>
+            </div>
+          </template>
+				</template>
+			</el-calendar>
+		</el-card>
+
+		<!--  工作时间设置  -->
+		<el-dialog title="设定工作时间" v-model="isShowDialog" width="600px" draggable>
+			<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="120px">
+				<el-row :gutter="35">
+					<el-col>
+						<el-form-item label="节假日工作时间" prop="orgName" :rules="[{ required: true, message: '请选择节假日工作时间', trigger: 'change' }]">
+							<el-time-picker v-model="state.ruleForm.time" is-range range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
+						</el-form-item>
+					</el-col>
+					<el-col>
+						<el-form-item label="工作日工作时间" prop="orgName" :rules="[{ required: true, message: '请选择工作日工作时间', trigger: 'change' }]">
+							<el-time-picker v-model="state.ruleForm.time1" is-range range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="isShowDialog = false" class="default-button">取 消</el-button>
+					<el-button type="primary" @click="onSubmit(ruleFormRef)" :loading="loading">确 定 </el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script setup lang="ts" name="holidayConfig">
+import {ref, reactive, onMounted, computed} from 'vue';
+import {ElMessage, ElMessageBox, FormInstance} from 'element-plus';
+import dayjs from "dayjs";
+import calendar from '/@/utils/calendar.js'
+import {getDaysSetting, setHolidayApi} from '/@/api/system/holiday';
+
+const today = ref(new Date()); // 当前日期
+const month = ref(new Date()); // 月份
+const isShowDialog = ref(false); // 是否显示弹窗
+const loading = ref(false); // 加载状态
+const state = reactive<any>({
+	ruleForm: {
+		orgName: '',
+	},
+  calendarData : [] // 日历数据
+});
+// 选择月份
+const selectMonth = async (val: Date) => {
+  state.calendarData = [];
+  const days:any = dayjs(val).daysInMonth();
+  for(let i = 0;i<days;i++){
+    state.calendarData.push({
+      currantTime:dayjs(dayjs(val).startOf('month')).add(i,'day').format('YYYY-MM-DD'),
+      checked:false
+    })
+  }
+
+  dateRange.value = [new Date(dayjs(val).startOf('month').format('YYYY-MM-DD')),
+    new Date(dayjs(val).endOf('month').format('YYYY-MM-DD'))];
+  today.value = val;
+  await getSetting(dayjs(today.value).format('MM'),dayjs(today.value).format('YYYY'));
+};
+// 日期范围
+const dateRange = ref([new Date(dayjs(today.value).startOf('month').format('YYYY-MM-DD')),
+  new Date(dayjs(today.value).endOf('month').format('YYYY-MM-DD'))]); // 日期范围
+// 设置节假日
+const setHoliday = () => {
+  ElMessageBox.confirm(
+      `您确定要将【${multipleDates.value.map((item:any) => dayjs(item).format('YYYY-MM-DD')).join(',')}】设为节假日吗?`,
+      '提示',
+      {
+        type: 'warning',
+        draggable:true
+      }
+  ).then(() => {
+    setHolidayApi({
+      list:multipleDates.value,isWorkDay:false
+    }).then(() => {
+      ElMessage.success('设置成功');
+      selectMonth(today.value);
+    })
+  }).catch(()=>{})
+};
+// 设置工作日
+const setWorkDay = () => {
+  ElMessageBox.confirm(
+      `您确定要将【${multipleDates.value.map((item:any) => dayjs(item).format('YYYY-MM-DD')).join(',')}】设为工作日吗?`,
+      '提示',
+      {
+        type: 'warning',
+        draggable:true
+      }
+  ).then(() => {
+    setHolidayApi({
+      list:multipleDates.value,isWorkDay:true
+    }).then(() => {
+      ElMessage.success('设置成功');
+      selectMonth(today.value);
+    })
+  }).catch(()=>{})
+};
+// 设置工作时间
+const setWorkTime = () => {
+	isShowDialog.value = true;
+};
+// 清除选择
+const clearSelect = () => {
+  state.calendarData.forEach((item:any) => {
+    item.checked = false;
+  })
+};
+// 获取所选中的日期
+const multipleDates = computed(() => {
+  return state.calendarData.filter((item:any) => item.checked).map((item:any) => item.currantTime);
+});
+const changeChecked = (item:any)=>{
+  item.checked = !item.checked;
+}
+// 表单ref
+const ruleFormRef = ref<RefType>();
+// 表单提交
+const onSubmit = async (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	await formEl.validate((valid) => {
+		if (valid) {
+			console.log('submit!');
+		} else {
+			console.log('error submit!!');
+			return false;
+		}
+	});
+};
+// 获取节假日设置
+const getSetting = async (dateMoth:string,dateYear:string)=>{
+  loading.value = true;
+  try {
+    const {result} = await getDaysSetting(dateMoth,dateYear);
+    for(let i of result){
+      for(let j of state.calendarData){
+        if(dayjs(i.day).format('YYYY-MM-DD') === j.currantTime){
+          j.isWorkDay = i.isWorkDay;
+        }
+      }
+    }
+    loading.value = false;
+  }catch{
+    loading.value = false;
+  }
+}
+// 是否节假日
+const isFestival = (slotData:any)=> {
+  let solarDayArr = slotData.day.split('-');
+  let lunarDay:any = calendar.solar2lunar(solarDayArr[0], solarDayArr[1], solarDayArr[2])
+  return lunarDay.lunarFestival  || lunarDay.festival;
+};
+// 公历转农历
+const solarToLunar = (slotData:any)=> {
+  let solarDayArr = slotData.day.split('-');
+  let lunarDay:any = calendar.solar2lunar(solarDayArr[0], solarDayArr[1], solarDayArr[2])
+  // 农历日期
+  let lunarMD = lunarDay.IMonthCn + lunarDay.IDayCn;
+  return lunarDay.lunarFestival ? lunarDay.lunarFestival : lunarDay.festival ? lunarDay.festival : lunarMD
+};
+onMounted(async ()=>{
+  const days:any = dayjs(today.value).daysInMonth();
+  for(let i = 0;i<days;i++){
+    state.calendarData.push({
+      currantTime:dayjs(dayjs(today.value).startOf('month')).add(i,'day').format('YYYY-MM-DD'),
+      checked:false
+    })
+  }
+  await getSetting(dayjs(today.value).format('MM'),dayjs(today.value).format('YYYY'));
+})
+</script>
+<style scoped lang="scss">
+/**日期div的样式-农历*/
+.el-calendar-table .el-calendar-day > div .lunar {
+  padding-top: 10px;
+  text-align: center
+}
+</style>

+ 39 - 9
src/views/system/organize/component/Org-add.vue

@@ -46,6 +46,25 @@
 							</el-cascader>
 						</el-form-item>
 					</el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+            <el-form-item label="所属区域" prop="areaCode" :rules="[{ required: true, message: '请选择所属区域', trigger: 'change' }]">
+              <el-cascader
+                  :options="state.areaOptions"
+                  filterable
+                  :props="{ value: 'id', label: 'areaName', emitPath: false,checkStrictly: true }"
+                  placeholder="请选择经营地址"
+                  class="w100"
+                  v-model="state.ruleForm.areaCode"
+                  ref="areaRef"
+                  @change="changeArea"
+              >
+                <template #default="{ node, data }">
+                  <span>{{ data.areaName }}</span>
+                  <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+                </template>
+              </el-cascader>
+            </el-form-item>
+          </el-col>
 				</el-row>
 			</el-form>
 			<template #footer>
@@ -59,10 +78,11 @@
 </template>
 
 <script setup lang="ts" name="systemAddOrg">
-import { reactive, ref } from 'vue';
+import {onMounted, reactive, ref} from 'vue';
 import { ElMessage, FormInstance } from 'element-plus';
 import { addOrg } from '/@/api/system/organize';
 import mittBus from '/@/utils/mitt';
+import { treeArea } from '/@/api/business/commonP';
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
 
@@ -71,13 +91,15 @@ const ruleFormRef = ref<FormInstance>();
 const state = reactive<any>({
 	isShowDialog: false,
 	ruleForm: {
-		orgName: '',
-		orgCode: '',
-		parentId: '',
-		parentName: '',
-		orgShortName: '',
-		orgType: '',
-		isEnable: true,
+		orgName: '', // 部门名称
+		orgCode: '', // 部门编码
+		parentId: '',// 上级部门id
+		parentName: '',// 上级部门名称
+		orgShortName: '',// 部门简称
+		orgType: '',// 部门类别
+    areaName:'',// 所属区域名称
+    areaCode:'',// 所属区域编码
+		isEnable: true,// 是否启用
 		children: [],
 	},
 	orgData: [], // 上级部门数据
@@ -87,7 +109,7 @@ const state = reactive<any>({
 	telsList: [],
 });
 // 打开弹窗
-const openDialog = (orgData: any, orgType: any, row?: any) => {
+const openDialog = async (orgData: any, orgType: any, row?: any) => {
 	state.orgData = orgData ?? [];
 	state.orgType = orgType ?? [];
 	ruleFormRef.value?.clearValidate();
@@ -101,6 +123,8 @@ const openDialog = (orgData: any, orgType: any, row?: any) => {
 		state.ruleForm.parentName = '';
 		state.disabled = false;
 	}
+  const area: any = await treeArea();
+  state.areaOptions = area.result ?? []; //省市区数据
 	state.isShowDialog = true;
 };
 // 关闭弹窗
@@ -137,6 +161,12 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
 		}
 	});
 };
+// 省市区选择
+const areaRef = ref<RefType>();
+const changeArea = () => {
+  const currentNode = areaRef.value.getCheckedNodes();
+  state.ruleForm.areaName = currentNode[0]?.label ?? '';
+};
 // 暴露变量
 defineExpose({
 	openDialog,

+ 38 - 8
src/views/system/organize/component/Org-edit.vue

@@ -34,6 +34,25 @@
 							</el-cascader>
 						</el-form-item>
 					</el-col>
+          <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+            <el-form-item label="所属区域" prop="areaCode" :rules="[{ required: true, message: '请选择所属区域', trigger: 'change' }]">
+              <el-cascader
+                  :options="state.areaOptions"
+                  filterable
+                  :props="{ value: 'id', label: 'areaName', emitPath: false,checkStrictly: true }"
+                  placeholder="请选择经营地址"
+                  class="w100"
+                  v-model="state.ruleForm.areaCode"
+                  ref="areaRef"
+                  @change="changeArea"
+              >
+                <template #default="{ node, data }">
+                  <span>{{ data.areaName }}</span>
+                  <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+                </template>
+              </el-cascader>
+            </el-form-item>
+          </el-col>
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="部门类别" prop="orgType" :rules="[{ required: true, message: '请选择部门类别', trigger: 'change' }]">
 							<el-select v-model="state.ruleForm.orgType" placeholder="请选择部门类别" class="w100">
@@ -59,13 +78,14 @@
 </template>
 
 <script setup lang="ts" name="systemEditOrg">
-import { reactive, ref } from 'vue';
+import { reactive, ref} from 'vue';
 import { ElMessage, FormInstance } from 'element-plus';
 import mittBus from '/@/utils/mitt';
 import { auth } from '/@/utils/authFunction';
 import { excludeSelfById } from '/@/utils/tools';
 import other from '/@/utils/other';
 import { updateOrg, getOrgById } from '/@/api/system/organize';
+import { treeArea } from '/@/api/business/commonP';
 
 // 定义子组件向父组件传值/事件
 const emit = defineEmits(['updateList']);
@@ -75,13 +95,15 @@ const ruleFormRef = ref<FormInstance>();
 const state = reactive<any>({
 	isShowDialog: false,
 	ruleForm: {
-		orgName: '',
-		orgCode: '',
-		parentId: '',
-		parentName: '',
-		orgType: '',
-		isEnable: true,
-		orgShortName: '',
+    orgName: '', // 部门名称
+    orgCode: '', // 部门编码
+    parentId: '',// 上级部门id
+    parentName: '',// 上级部门名称
+    orgShortName: '',// 部门简称
+    orgType: '',// 部门类别
+    areaName:'',// 所属区域名称
+    areaCode:'',// 所属区域编码
+    isEnable: true,// 是否启用
 		children: [],
 	},
 	orgData: [], // 上级部门数据
@@ -100,6 +122,8 @@ const openDialog = async (row: any, orgData: any, orgType: any) => {
 			state.orgData = excludeSelfById(state.orgData, row.id);
 			const res: any = await getOrgById(row.id);
 			state.ruleForm = res.result;
+      const area: any = await treeArea();
+      state.areaOptions = area.result ?? []; //省市区数据
 			state.isShowDialog = true;
 		} catch (error) {
 			console.log(error);
@@ -140,6 +164,12 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
 		}
 	});
 };
+// 省市区选择
+const areaRef = ref<RefType>();
+const changeArea = () => {
+  const currentNode = areaRef.value.getCheckedNodes();
+  state.ruleForm.areaName = currentNode[0]?.label ?? '';
+};
 // 暴露变量
 defineExpose({
 	openDialog,