diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index fcd1ef5..733af54 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { baseRoutes } from './modules/base' import { systemRouters } from './modules/system' import { accessRouters } from './modules/access' +import { attendanceRouters } from './modules/attendance' /** * hidden: true if `hidden:true` will not show in the sidebar(default is false) @@ -73,6 +74,7 @@ export const asyncRouterMap = [ ...accessRouters, ...baseRoutes, + ...attendanceRouters, ...systemRouters, { path: '*', redirect: '/404', hidden: true } ] diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index fcd1ef5..733af54 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { baseRoutes } from './modules/base' import { systemRouters } from './modules/system' import { accessRouters } from './modules/access' +import { attendanceRouters } from './modules/attendance' /** * hidden: true if `hidden:true` will not show in the sidebar(default is false) @@ -73,6 +74,7 @@ export const asyncRouterMap = [ ...accessRouters, ...baseRoutes, + ...attendanceRouters, ...systemRouters, { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/attendance.js b/src/router/modules/attendance.js new file mode 100644 index 0000000..f7cf021 --- /dev/null +++ b/src/router/modules/attendance.js @@ -0,0 +1,55 @@ +/* Layout */ +import Layout from '../../views/layout/Layout' + +export const attendanceRouters = [ + { + path: '/attendance', + component: Layout, + redirect: '/atd', + name: 'Atd', + meta: { + title: '考勤统计', + icon: 'task', // 图标 + permission: ['/attendance']// 权限名称 + }, + children: [ + { + path: '/listReport', + name: 'ListReport', + component: () => import('@/views/attendance/listReport'), + meta: { title: '查询报表数据', icon: 'function', permission: ['/listReport'] } + }, + { + path: '/makeReport', + name: 'MakeReport', + component: () => import('@/views/attendance/makeReport'), + meta: { title: '生成考勤报表', icon: 'function', permission: ['/makeReport'] } + } + ] + }, + { + path: '/atdSetting', + component: Layout, + redirect: '/atdSetting', + name: 'AtdSetting', + meta: { + title: '考勤设置', + icon: 'task', // 图标 + permission: ['/atdSetting']// 权限名称 + }, + children: [ + { + path: '/regular', + name: 'Regular', + component: () => import('@/views/attendance/regular'), + meta: { title: '考勤规则', icon: 'function', permission: ['/regular'] } + }, + { + path: '/specialDay', + name: 'SpecialDay', + component: () => import('@/views/attendance/specialDay'), + meta: { title: '特殊考勤日管理', icon: 'function', permission: ['/specialDay'] } + } + ] + } +] diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index fcd1ef5..733af54 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { baseRoutes } from './modules/base' import { systemRouters } from './modules/system' import { accessRouters } from './modules/access' +import { attendanceRouters } from './modules/attendance' /** * hidden: true if `hidden:true` will not show in the sidebar(default is false) @@ -73,6 +74,7 @@ export const asyncRouterMap = [ ...accessRouters, ...baseRoutes, + ...attendanceRouters, ...systemRouters, { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/attendance.js b/src/router/modules/attendance.js new file mode 100644 index 0000000..f7cf021 --- /dev/null +++ b/src/router/modules/attendance.js @@ -0,0 +1,55 @@ +/* Layout */ +import Layout from '../../views/layout/Layout' + +export const attendanceRouters = [ + { + path: '/attendance', + component: Layout, + redirect: '/atd', + name: 'Atd', + meta: { + title: '考勤统计', + icon: 'task', // 图标 + permission: ['/attendance']// 权限名称 + }, + children: [ + { + path: '/listReport', + name: 'ListReport', + component: () => import('@/views/attendance/listReport'), + meta: { title: '查询报表数据', icon: 'function', permission: ['/listReport'] } + }, + { + path: '/makeReport', + name: 'MakeReport', + component: () => import('@/views/attendance/makeReport'), + meta: { title: '生成考勤报表', icon: 'function', permission: ['/makeReport'] } + } + ] + }, + { + path: '/atdSetting', + component: Layout, + redirect: '/atdSetting', + name: 'AtdSetting', + meta: { + title: '考勤设置', + icon: 'task', // 图标 + permission: ['/atdSetting']// 权限名称 + }, + children: [ + { + path: '/regular', + name: 'Regular', + component: () => import('@/views/attendance/regular'), + meta: { title: '考勤规则', icon: 'function', permission: ['/regular'] } + }, + { + path: '/specialDay', + name: 'SpecialDay', + component: () => import('@/views/attendance/specialDay'), + meta: { title: '特殊考勤日管理', icon: 'function', permission: ['/specialDay'] } + } + ] + } +] diff --git a/src/views/attendance/editRemarks.vue b/src/views/attendance/editRemarks.vue new file mode 100644 index 0000000..58aa8f3 --- /dev/null +++ b/src/views/attendance/editRemarks.vue @@ -0,0 +1,328 @@ + + + + + + + 数据列表 + + 添加备注 + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 因公 + 因私 + + + + + + + + + + + diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index fcd1ef5..733af54 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { baseRoutes } from './modules/base' import { systemRouters } from './modules/system' import { accessRouters } from './modules/access' +import { attendanceRouters } from './modules/attendance' /** * hidden: true if `hidden:true` will not show in the sidebar(default is false) @@ -73,6 +74,7 @@ export const asyncRouterMap = [ ...accessRouters, ...baseRoutes, + ...attendanceRouters, ...systemRouters, { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/attendance.js b/src/router/modules/attendance.js new file mode 100644 index 0000000..f7cf021 --- /dev/null +++ b/src/router/modules/attendance.js @@ -0,0 +1,55 @@ +/* Layout */ +import Layout from '../../views/layout/Layout' + +export const attendanceRouters = [ + { + path: '/attendance', + component: Layout, + redirect: '/atd', + name: 'Atd', + meta: { + title: '考勤统计', + icon: 'task', // 图标 + permission: ['/attendance']// 权限名称 + }, + children: [ + { + path: '/listReport', + name: 'ListReport', + component: () => import('@/views/attendance/listReport'), + meta: { title: '查询报表数据', icon: 'function', permission: ['/listReport'] } + }, + { + path: '/makeReport', + name: 'MakeReport', + component: () => import('@/views/attendance/makeReport'), + meta: { title: '生成考勤报表', icon: 'function', permission: ['/makeReport'] } + } + ] + }, + { + path: '/atdSetting', + component: Layout, + redirect: '/atdSetting', + name: 'AtdSetting', + meta: { + title: '考勤设置', + icon: 'task', // 图标 + permission: ['/atdSetting']// 权限名称 + }, + children: [ + { + path: '/regular', + name: 'Regular', + component: () => import('@/views/attendance/regular'), + meta: { title: '考勤规则', icon: 'function', permission: ['/regular'] } + }, + { + path: '/specialDay', + name: 'SpecialDay', + component: () => import('@/views/attendance/specialDay'), + meta: { title: '特殊考勤日管理', icon: 'function', permission: ['/specialDay'] } + } + ] + } +] diff --git a/src/views/attendance/editRemarks.vue b/src/views/attendance/editRemarks.vue new file mode 100644 index 0000000..58aa8f3 --- /dev/null +++ b/src/views/attendance/editRemarks.vue @@ -0,0 +1,328 @@ + + + + + + + 数据列表 + + 添加备注 + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 因公 + 因私 + + + + + + + + + + + diff --git a/src/views/attendance/editSpecialDay.vue b/src/views/attendance/editSpecialDay.vue new file mode 100644 index 0000000..b416ddc --- /dev/null +++ b/src/views/attendance/editSpecialDay.vue @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 是 + 否 + + + + + + + + + + + diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index fcd1ef5..733af54 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { baseRoutes } from './modules/base' import { systemRouters } from './modules/system' import { accessRouters } from './modules/access' +import { attendanceRouters } from './modules/attendance' /** * hidden: true if `hidden:true` will not show in the sidebar(default is false) @@ -73,6 +74,7 @@ export const asyncRouterMap = [ ...accessRouters, ...baseRoutes, + ...attendanceRouters, ...systemRouters, { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/attendance.js b/src/router/modules/attendance.js new file mode 100644 index 0000000..f7cf021 --- /dev/null +++ b/src/router/modules/attendance.js @@ -0,0 +1,55 @@ +/* Layout */ +import Layout from '../../views/layout/Layout' + +export const attendanceRouters = [ + { + path: '/attendance', + component: Layout, + redirect: '/atd', + name: 'Atd', + meta: { + title: '考勤统计', + icon: 'task', // 图标 + permission: ['/attendance']// 权限名称 + }, + children: [ + { + path: '/listReport', + name: 'ListReport', + component: () => import('@/views/attendance/listReport'), + meta: { title: '查询报表数据', icon: 'function', permission: ['/listReport'] } + }, + { + path: '/makeReport', + name: 'MakeReport', + component: () => import('@/views/attendance/makeReport'), + meta: { title: '生成考勤报表', icon: 'function', permission: ['/makeReport'] } + } + ] + }, + { + path: '/atdSetting', + component: Layout, + redirect: '/atdSetting', + name: 'AtdSetting', + meta: { + title: '考勤设置', + icon: 'task', // 图标 + permission: ['/atdSetting']// 权限名称 + }, + children: [ + { + path: '/regular', + name: 'Regular', + component: () => import('@/views/attendance/regular'), + meta: { title: '考勤规则', icon: 'function', permission: ['/regular'] } + }, + { + path: '/specialDay', + name: 'SpecialDay', + component: () => import('@/views/attendance/specialDay'), + meta: { title: '特殊考勤日管理', icon: 'function', permission: ['/specialDay'] } + } + ] + } +] diff --git a/src/views/attendance/editRemarks.vue b/src/views/attendance/editRemarks.vue new file mode 100644 index 0000000..58aa8f3 --- /dev/null +++ b/src/views/attendance/editRemarks.vue @@ -0,0 +1,328 @@ + + + + + + + 数据列表 + + 添加备注 + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 因公 + 因私 + + + + + + + + + + + diff --git a/src/views/attendance/editSpecialDay.vue b/src/views/attendance/editSpecialDay.vue new file mode 100644 index 0000000..b416ddc --- /dev/null +++ b/src/views/attendance/editSpecialDay.vue @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 是 + 否 + + + + + + + + + + + diff --git a/src/views/attendance/listReport.vue b/src/views/attendance/listReport.vue new file mode 100644 index 0000000..92a5c6a --- /dev/null +++ b/src/views/attendance/listReport.vue @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + 仅显示无备注 + + + 仅显示异常 + + + 搜索 + 重新同步识别记录 + + + + + + + 数据列表 + + 导出记录 + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 编辑 + + + + + + + + + + + + + + + diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index fcd1ef5..733af54 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { baseRoutes } from './modules/base' import { systemRouters } from './modules/system' import { accessRouters } from './modules/access' +import { attendanceRouters } from './modules/attendance' /** * hidden: true if `hidden:true` will not show in the sidebar(default is false) @@ -73,6 +74,7 @@ export const asyncRouterMap = [ ...accessRouters, ...baseRoutes, + ...attendanceRouters, ...systemRouters, { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/attendance.js b/src/router/modules/attendance.js new file mode 100644 index 0000000..f7cf021 --- /dev/null +++ b/src/router/modules/attendance.js @@ -0,0 +1,55 @@ +/* Layout */ +import Layout from '../../views/layout/Layout' + +export const attendanceRouters = [ + { + path: '/attendance', + component: Layout, + redirect: '/atd', + name: 'Atd', + meta: { + title: '考勤统计', + icon: 'task', // 图标 + permission: ['/attendance']// 权限名称 + }, + children: [ + { + path: '/listReport', + name: 'ListReport', + component: () => import('@/views/attendance/listReport'), + meta: { title: '查询报表数据', icon: 'function', permission: ['/listReport'] } + }, + { + path: '/makeReport', + name: 'MakeReport', + component: () => import('@/views/attendance/makeReport'), + meta: { title: '生成考勤报表', icon: 'function', permission: ['/makeReport'] } + } + ] + }, + { + path: '/atdSetting', + component: Layout, + redirect: '/atdSetting', + name: 'AtdSetting', + meta: { + title: '考勤设置', + icon: 'task', // 图标 + permission: ['/atdSetting']// 权限名称 + }, + children: [ + { + path: '/regular', + name: 'Regular', + component: () => import('@/views/attendance/regular'), + meta: { title: '考勤规则', icon: 'function', permission: ['/regular'] } + }, + { + path: '/specialDay', + name: 'SpecialDay', + component: () => import('@/views/attendance/specialDay'), + meta: { title: '特殊考勤日管理', icon: 'function', permission: ['/specialDay'] } + } + ] + } +] diff --git a/src/views/attendance/editRemarks.vue b/src/views/attendance/editRemarks.vue new file mode 100644 index 0000000..58aa8f3 --- /dev/null +++ b/src/views/attendance/editRemarks.vue @@ -0,0 +1,328 @@ + + + + + + + 数据列表 + + 添加备注 + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 因公 + 因私 + + + + + + + + + + + diff --git a/src/views/attendance/editSpecialDay.vue b/src/views/attendance/editSpecialDay.vue new file mode 100644 index 0000000..b416ddc --- /dev/null +++ b/src/views/attendance/editSpecialDay.vue @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 是 + 否 + + + + + + + + + + + diff --git a/src/views/attendance/listReport.vue b/src/views/attendance/listReport.vue new file mode 100644 index 0000000..92a5c6a --- /dev/null +++ b/src/views/attendance/listReport.vue @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + 仅显示无备注 + + + 仅显示异常 + + + 搜索 + 重新同步识别记录 + + + + + + + 数据列表 + + 导出记录 + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 编辑 + + + + + + + + + + + + + + + diff --git a/src/views/attendance/makeReport.vue b/src/views/attendance/makeReport.vue new file mode 100644 index 0000000..7e4da1b --- /dev/null +++ b/src/views/attendance/makeReport.vue @@ -0,0 +1,84 @@ + + + + + 请选择考勤月 + + + + + + + + + 生成报表 + + + + + + + + + + diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index fcd1ef5..733af54 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { baseRoutes } from './modules/base' import { systemRouters } from './modules/system' import { accessRouters } from './modules/access' +import { attendanceRouters } from './modules/attendance' /** * hidden: true if `hidden:true` will not show in the sidebar(default is false) @@ -73,6 +74,7 @@ export const asyncRouterMap = [ ...accessRouters, ...baseRoutes, + ...attendanceRouters, ...systemRouters, { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/attendance.js b/src/router/modules/attendance.js new file mode 100644 index 0000000..f7cf021 --- /dev/null +++ b/src/router/modules/attendance.js @@ -0,0 +1,55 @@ +/* Layout */ +import Layout from '../../views/layout/Layout' + +export const attendanceRouters = [ + { + path: '/attendance', + component: Layout, + redirect: '/atd', + name: 'Atd', + meta: { + title: '考勤统计', + icon: 'task', // 图标 + permission: ['/attendance']// 权限名称 + }, + children: [ + { + path: '/listReport', + name: 'ListReport', + component: () => import('@/views/attendance/listReport'), + meta: { title: '查询报表数据', icon: 'function', permission: ['/listReport'] } + }, + { + path: '/makeReport', + name: 'MakeReport', + component: () => import('@/views/attendance/makeReport'), + meta: { title: '生成考勤报表', icon: 'function', permission: ['/makeReport'] } + } + ] + }, + { + path: '/atdSetting', + component: Layout, + redirect: '/atdSetting', + name: 'AtdSetting', + meta: { + title: '考勤设置', + icon: 'task', // 图标 + permission: ['/atdSetting']// 权限名称 + }, + children: [ + { + path: '/regular', + name: 'Regular', + component: () => import('@/views/attendance/regular'), + meta: { title: '考勤规则', icon: 'function', permission: ['/regular'] } + }, + { + path: '/specialDay', + name: 'SpecialDay', + component: () => import('@/views/attendance/specialDay'), + meta: { title: '特殊考勤日管理', icon: 'function', permission: ['/specialDay'] } + } + ] + } +] diff --git a/src/views/attendance/editRemarks.vue b/src/views/attendance/editRemarks.vue new file mode 100644 index 0000000..58aa8f3 --- /dev/null +++ b/src/views/attendance/editRemarks.vue @@ -0,0 +1,328 @@ + + + + + + + 数据列表 + + 添加备注 + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 因公 + 因私 + + + + + + + + + + + diff --git a/src/views/attendance/editSpecialDay.vue b/src/views/attendance/editSpecialDay.vue new file mode 100644 index 0000000..b416ddc --- /dev/null +++ b/src/views/attendance/editSpecialDay.vue @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 是 + 否 + + + + + + + + + + + diff --git a/src/views/attendance/listReport.vue b/src/views/attendance/listReport.vue new file mode 100644 index 0000000..92a5c6a --- /dev/null +++ b/src/views/attendance/listReport.vue @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + 仅显示无备注 + + + 仅显示异常 + + + 搜索 + 重新同步识别记录 + + + + + + + 数据列表 + + 导出记录 + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 编辑 + + + + + + + + + + + + + + + diff --git a/src/views/attendance/makeReport.vue b/src/views/attendance/makeReport.vue new file mode 100644 index 0000000..7e4da1b --- /dev/null +++ b/src/views/attendance/makeReport.vue @@ -0,0 +1,84 @@ + + + + + 请选择考勤月 + + + + + + + + + 生成报表 + + + + + + + + + + diff --git a/src/views/attendance/regular.vue b/src/views/attendance/regular.vue new file mode 100644 index 0000000..0fac7f8 --- /dev/null +++ b/src/views/attendance/regular.vue @@ -0,0 +1,155 @@ + + + + 工作日设置 + + + + + {{ week.label }} + + + + + 考勤时间设置 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 迟到规则设置 + + + + + + + 说明:晚到时长在此时间范围之内不视为迟到 + + + + + + + + 说明:晚到时长超过此时间范围则将视为旷工 + + + + 放弃修改 + 保存 + + + + + + + + + diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index fcd1ef5..733af54 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { baseRoutes } from './modules/base' import { systemRouters } from './modules/system' import { accessRouters } from './modules/access' +import { attendanceRouters } from './modules/attendance' /** * hidden: true if `hidden:true` will not show in the sidebar(default is false) @@ -73,6 +74,7 @@ export const asyncRouterMap = [ ...accessRouters, ...baseRoutes, + ...attendanceRouters, ...systemRouters, { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/attendance.js b/src/router/modules/attendance.js new file mode 100644 index 0000000..f7cf021 --- /dev/null +++ b/src/router/modules/attendance.js @@ -0,0 +1,55 @@ +/* Layout */ +import Layout from '../../views/layout/Layout' + +export const attendanceRouters = [ + { + path: '/attendance', + component: Layout, + redirect: '/atd', + name: 'Atd', + meta: { + title: '考勤统计', + icon: 'task', // 图标 + permission: ['/attendance']// 权限名称 + }, + children: [ + { + path: '/listReport', + name: 'ListReport', + component: () => import('@/views/attendance/listReport'), + meta: { title: '查询报表数据', icon: 'function', permission: ['/listReport'] } + }, + { + path: '/makeReport', + name: 'MakeReport', + component: () => import('@/views/attendance/makeReport'), + meta: { title: '生成考勤报表', icon: 'function', permission: ['/makeReport'] } + } + ] + }, + { + path: '/atdSetting', + component: Layout, + redirect: '/atdSetting', + name: 'AtdSetting', + meta: { + title: '考勤设置', + icon: 'task', // 图标 + permission: ['/atdSetting']// 权限名称 + }, + children: [ + { + path: '/regular', + name: 'Regular', + component: () => import('@/views/attendance/regular'), + meta: { title: '考勤规则', icon: 'function', permission: ['/regular'] } + }, + { + path: '/specialDay', + name: 'SpecialDay', + component: () => import('@/views/attendance/specialDay'), + meta: { title: '特殊考勤日管理', icon: 'function', permission: ['/specialDay'] } + } + ] + } +] diff --git a/src/views/attendance/editRemarks.vue b/src/views/attendance/editRemarks.vue new file mode 100644 index 0000000..58aa8f3 --- /dev/null +++ b/src/views/attendance/editRemarks.vue @@ -0,0 +1,328 @@ + + + + + + + 数据列表 + + 添加备注 + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 因公 + 因私 + + + + + + + + + + + diff --git a/src/views/attendance/editSpecialDay.vue b/src/views/attendance/editSpecialDay.vue new file mode 100644 index 0000000..b416ddc --- /dev/null +++ b/src/views/attendance/editSpecialDay.vue @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 是 + 否 + + + + + + + + + + + diff --git a/src/views/attendance/listReport.vue b/src/views/attendance/listReport.vue new file mode 100644 index 0000000..92a5c6a --- /dev/null +++ b/src/views/attendance/listReport.vue @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + 仅显示无备注 + + + 仅显示异常 + + + 搜索 + 重新同步识别记录 + + + + + + + 数据列表 + + 导出记录 + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 编辑 + + + + + + + + + + + + + + + diff --git a/src/views/attendance/makeReport.vue b/src/views/attendance/makeReport.vue new file mode 100644 index 0000000..7e4da1b --- /dev/null +++ b/src/views/attendance/makeReport.vue @@ -0,0 +1,84 @@ + + + + + 请选择考勤月 + + + + + + + + + 生成报表 + + + + + + + + + + diff --git a/src/views/attendance/regular.vue b/src/views/attendance/regular.vue new file mode 100644 index 0000000..0fac7f8 --- /dev/null +++ b/src/views/attendance/regular.vue @@ -0,0 +1,155 @@ + + + + 工作日设置 + + + + + {{ week.label }} + + + + + 考勤时间设置 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 迟到规则设置 + + + + + + + 说明:晚到时长在此时间范围之内不视为迟到 + + + + + + + + 说明:晚到时长超过此时间范围则将视为旷工 + + + + 放弃修改 + 保存 + + + + + + + + + diff --git a/src/views/attendance/specialDay.vue b/src/views/attendance/specialDay.vue new file mode 100644 index 0000000..5ab4934 --- /dev/null +++ b/src/views/attendance/specialDay.vue @@ -0,0 +1,260 @@ + + + + + + + + + + + + 搜索 + + + + + + + 数据列表 + + 新增 + + + 批量导入 + + 模板下载 + + + + + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + + 编辑 + 删除 + + + + + + + + + + + + + + diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index fcd1ef5..733af54 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { baseRoutes } from './modules/base' import { systemRouters } from './modules/system' import { accessRouters } from './modules/access' +import { attendanceRouters } from './modules/attendance' /** * hidden: true if `hidden:true` will not show in the sidebar(default is false) @@ -73,6 +74,7 @@ export const asyncRouterMap = [ ...accessRouters, ...baseRoutes, + ...attendanceRouters, ...systemRouters, { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/attendance.js b/src/router/modules/attendance.js new file mode 100644 index 0000000..f7cf021 --- /dev/null +++ b/src/router/modules/attendance.js @@ -0,0 +1,55 @@ +/* Layout */ +import Layout from '../../views/layout/Layout' + +export const attendanceRouters = [ + { + path: '/attendance', + component: Layout, + redirect: '/atd', + name: 'Atd', + meta: { + title: '考勤统计', + icon: 'task', // 图标 + permission: ['/attendance']// 权限名称 + }, + children: [ + { + path: '/listReport', + name: 'ListReport', + component: () => import('@/views/attendance/listReport'), + meta: { title: '查询报表数据', icon: 'function', permission: ['/listReport'] } + }, + { + path: '/makeReport', + name: 'MakeReport', + component: () => import('@/views/attendance/makeReport'), + meta: { title: '生成考勤报表', icon: 'function', permission: ['/makeReport'] } + } + ] + }, + { + path: '/atdSetting', + component: Layout, + redirect: '/atdSetting', + name: 'AtdSetting', + meta: { + title: '考勤设置', + icon: 'task', // 图标 + permission: ['/atdSetting']// 权限名称 + }, + children: [ + { + path: '/regular', + name: 'Regular', + component: () => import('@/views/attendance/regular'), + meta: { title: '考勤规则', icon: 'function', permission: ['/regular'] } + }, + { + path: '/specialDay', + name: 'SpecialDay', + component: () => import('@/views/attendance/specialDay'), + meta: { title: '特殊考勤日管理', icon: 'function', permission: ['/specialDay'] } + } + ] + } +] diff --git a/src/views/attendance/editRemarks.vue b/src/views/attendance/editRemarks.vue new file mode 100644 index 0000000..58aa8f3 --- /dev/null +++ b/src/views/attendance/editRemarks.vue @@ -0,0 +1,328 @@ + + + + + + + 数据列表 + + 添加备注 + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 因公 + 因私 + + + + + + + + + + + diff --git a/src/views/attendance/editSpecialDay.vue b/src/views/attendance/editSpecialDay.vue new file mode 100644 index 0000000..b416ddc --- /dev/null +++ b/src/views/attendance/editSpecialDay.vue @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 是 + 否 + + + + + + + + + + + diff --git a/src/views/attendance/listReport.vue b/src/views/attendance/listReport.vue new file mode 100644 index 0000000..92a5c6a --- /dev/null +++ b/src/views/attendance/listReport.vue @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + 仅显示无备注 + + + 仅显示异常 + + + 搜索 + 重新同步识别记录 + + + + + + + 数据列表 + + 导出记录 + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 编辑 + + + + + + + + + + + + + + + diff --git a/src/views/attendance/makeReport.vue b/src/views/attendance/makeReport.vue new file mode 100644 index 0000000..7e4da1b --- /dev/null +++ b/src/views/attendance/makeReport.vue @@ -0,0 +1,84 @@ + + + + + 请选择考勤月 + + + + + + + + + 生成报表 + + + + + + + + + + diff --git a/src/views/attendance/regular.vue b/src/views/attendance/regular.vue new file mode 100644 index 0000000..0fac7f8 --- /dev/null +++ b/src/views/attendance/regular.vue @@ -0,0 +1,155 @@ + + + + 工作日设置 + + + + + {{ week.label }} + + + + + 考勤时间设置 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 迟到规则设置 + + + + + + + 说明:晚到时长在此时间范围之内不视为迟到 + + + + + + + + 说明:晚到时长超过此时间范围则将视为旷工 + + + + 放弃修改 + 保存 + + + + + + + + + diff --git a/src/views/attendance/specialDay.vue b/src/views/attendance/specialDay.vue new file mode 100644 index 0000000..5ab4934 --- /dev/null +++ b/src/views/attendance/specialDay.vue @@ -0,0 +1,260 @@ + + + + + + + + + + + + 搜索 + + + + + + + 数据列表 + + 新增 + + + 批量导入 + + 模板下载 + + + + + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + + 编辑 + 删除 + + + + + + + + + + + + + + diff --git a/src/views/memberManage/addPerson.vue b/src/views/memberManage/addPerson.vue index da6fca2..deb53a9 100644 --- a/src/views/memberManage/addPerson.vue +++ b/src/views/memberManage/addPerson.vue @@ -1,6 +1,6 @@ - + @@ -65,6 +65,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -137,6 +187,7 @@ import { getProject } from '@/utils/baseConfig' import { getBirthdayByIdNO, getSexByIdNO } from '@/utils/dataAnalysis' import { isIE } from '@/utils/browser' +import { attendanceEnable } from '@/main.js' export default { name: 'AddPerson', @@ -153,7 +204,73 @@ callback(new Error('身份证号不能为空')) } } + // 校验年假 + const validateInitAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入0-20之间的数字')) + } else { + if (value < (this.personForm.ext.annualLeave ? this.personForm.ext.annualLeave : 0) || value > 20) { + callback(new Error('请输入0-20之间且不小于剩余年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('年假不能为空')) + } + } + // 校验剩余年假 + const validateAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入数字')) + } else { + if (value < 0 || value > (this.personForm.ext.initAnnualLeave ? this.personForm.ext.initAnnualLeave : 20)) { + callback(new Error('请输入0-20之间且不大于年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('剩余年假不能为空')) + } + } return { + formSize: 'large', // 如果启动了考勤功能,条目太多,size设置为small,否则为large + attendanceEnable: attendanceEnable, dialogFormVisible: false, // 对话框是否显示 dialogStatus: '', // 对话框类型:create,update isEditMode: false, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -174,7 +291,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -191,7 +314,13 @@ deptid: [{ required: true, message: '单位/部门必选', trigger: 'change' }], duty: [{ required: true, message: '职务必选', trigger: 'change' }], sex: [{ required: true, message: '性别必选', trigger: 'blur' }], - birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }] + birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }], + 'ext.isKaoqin': [{ required: true, message: '是否考勤必选', trigger: ['change'] }], + 'ext.isOt': [{ required: true, message: '是否统计加班必选', trigger: ['change'] }], + 'ext.isZhuanwu': [{ required: true, message: '是否专务必选', trigger: ['change'] }], + 'ext.isLeader': [{ required: true, message: '是否正职领导必选', trigger: ['change'] }], + 'ext.initAnnualLeave': [{ validator: validateInitAnnualLeave, required: true, trigger: ['blur'] }], + 'ext.annualLeave': [{ validator: validateAnnualLeave, required: true, trigger: ['blur'] }] }, dialogVisible: false, labelPosition: 'right', @@ -209,6 +338,9 @@ } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchNationType() // 获取民族列表 @@ -275,7 +407,13 @@ photo: personForm.photo, ext: { certificationUnit: personForm.ext.certificationUnit, // 颁发证件单位, - address: personForm.ext.address// 住址 + address: personForm.ext.address, // 住址 + isKaoqin: personForm.ext.isKaoqin, + isOt: personForm.ext.isOt, + isZhuanwu: personForm.ext.isZhuanwu, + isLeader: personForm.ext.isLeader, + initAnnualLeave: personForm.ext.initAnnualLeave, + annualLeave: personForm.ext.annualLeave } } if (personForm.photo !== '') { @@ -325,7 +463,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } this.photo = '' diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index fcd1ef5..733af54 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { baseRoutes } from './modules/base' import { systemRouters } from './modules/system' import { accessRouters } from './modules/access' +import { attendanceRouters } from './modules/attendance' /** * hidden: true if `hidden:true` will not show in the sidebar(default is false) @@ -73,6 +74,7 @@ export const asyncRouterMap = [ ...accessRouters, ...baseRoutes, + ...attendanceRouters, ...systemRouters, { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/attendance.js b/src/router/modules/attendance.js new file mode 100644 index 0000000..f7cf021 --- /dev/null +++ b/src/router/modules/attendance.js @@ -0,0 +1,55 @@ +/* Layout */ +import Layout from '../../views/layout/Layout' + +export const attendanceRouters = [ + { + path: '/attendance', + component: Layout, + redirect: '/atd', + name: 'Atd', + meta: { + title: '考勤统计', + icon: 'task', // 图标 + permission: ['/attendance']// 权限名称 + }, + children: [ + { + path: '/listReport', + name: 'ListReport', + component: () => import('@/views/attendance/listReport'), + meta: { title: '查询报表数据', icon: 'function', permission: ['/listReport'] } + }, + { + path: '/makeReport', + name: 'MakeReport', + component: () => import('@/views/attendance/makeReport'), + meta: { title: '生成考勤报表', icon: 'function', permission: ['/makeReport'] } + } + ] + }, + { + path: '/atdSetting', + component: Layout, + redirect: '/atdSetting', + name: 'AtdSetting', + meta: { + title: '考勤设置', + icon: 'task', // 图标 + permission: ['/atdSetting']// 权限名称 + }, + children: [ + { + path: '/regular', + name: 'Regular', + component: () => import('@/views/attendance/regular'), + meta: { title: '考勤规则', icon: 'function', permission: ['/regular'] } + }, + { + path: '/specialDay', + name: 'SpecialDay', + component: () => import('@/views/attendance/specialDay'), + meta: { title: '特殊考勤日管理', icon: 'function', permission: ['/specialDay'] } + } + ] + } +] diff --git a/src/views/attendance/editRemarks.vue b/src/views/attendance/editRemarks.vue new file mode 100644 index 0000000..58aa8f3 --- /dev/null +++ b/src/views/attendance/editRemarks.vue @@ -0,0 +1,328 @@ + + + + + + + 数据列表 + + 添加备注 + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 因公 + 因私 + + + + + + + + + + + diff --git a/src/views/attendance/editSpecialDay.vue b/src/views/attendance/editSpecialDay.vue new file mode 100644 index 0000000..b416ddc --- /dev/null +++ b/src/views/attendance/editSpecialDay.vue @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 是 + 否 + + + + + + + + + + + diff --git a/src/views/attendance/listReport.vue b/src/views/attendance/listReport.vue new file mode 100644 index 0000000..92a5c6a --- /dev/null +++ b/src/views/attendance/listReport.vue @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + 仅显示无备注 + + + 仅显示异常 + + + 搜索 + 重新同步识别记录 + + + + + + + 数据列表 + + 导出记录 + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 编辑 + + + + + + + + + + + + + + + diff --git a/src/views/attendance/makeReport.vue b/src/views/attendance/makeReport.vue new file mode 100644 index 0000000..7e4da1b --- /dev/null +++ b/src/views/attendance/makeReport.vue @@ -0,0 +1,84 @@ + + + + + 请选择考勤月 + + + + + + + + + 生成报表 + + + + + + + + + + diff --git a/src/views/attendance/regular.vue b/src/views/attendance/regular.vue new file mode 100644 index 0000000..0fac7f8 --- /dev/null +++ b/src/views/attendance/regular.vue @@ -0,0 +1,155 @@ + + + + 工作日设置 + + + + + {{ week.label }} + + + + + 考勤时间设置 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 迟到规则设置 + + + + + + + 说明:晚到时长在此时间范围之内不视为迟到 + + + + + + + + 说明:晚到时长超过此时间范围则将视为旷工 + + + + 放弃修改 + 保存 + + + + + + + + + diff --git a/src/views/attendance/specialDay.vue b/src/views/attendance/specialDay.vue new file mode 100644 index 0000000..5ab4934 --- /dev/null +++ b/src/views/attendance/specialDay.vue @@ -0,0 +1,260 @@ + + + + + + + + + + + + 搜索 + + + + + + + 数据列表 + + 新增 + + + 批量导入 + + 模板下载 + + + + + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + + 编辑 + 删除 + + + + + + + + + + + + + + diff --git a/src/views/memberManage/addPerson.vue b/src/views/memberManage/addPerson.vue index da6fca2..deb53a9 100644 --- a/src/views/memberManage/addPerson.vue +++ b/src/views/memberManage/addPerson.vue @@ -1,6 +1,6 @@ - + @@ -65,6 +65,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -137,6 +187,7 @@ import { getProject } from '@/utils/baseConfig' import { getBirthdayByIdNO, getSexByIdNO } from '@/utils/dataAnalysis' import { isIE } from '@/utils/browser' +import { attendanceEnable } from '@/main.js' export default { name: 'AddPerson', @@ -153,7 +204,73 @@ callback(new Error('身份证号不能为空')) } } + // 校验年假 + const validateInitAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入0-20之间的数字')) + } else { + if (value < (this.personForm.ext.annualLeave ? this.personForm.ext.annualLeave : 0) || value > 20) { + callback(new Error('请输入0-20之间且不小于剩余年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('年假不能为空')) + } + } + // 校验剩余年假 + const validateAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入数字')) + } else { + if (value < 0 || value > (this.personForm.ext.initAnnualLeave ? this.personForm.ext.initAnnualLeave : 20)) { + callback(new Error('请输入0-20之间且不大于年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('剩余年假不能为空')) + } + } return { + formSize: 'large', // 如果启动了考勤功能,条目太多,size设置为small,否则为large + attendanceEnable: attendanceEnable, dialogFormVisible: false, // 对话框是否显示 dialogStatus: '', // 对话框类型:create,update isEditMode: false, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -174,7 +291,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -191,7 +314,13 @@ deptid: [{ required: true, message: '单位/部门必选', trigger: 'change' }], duty: [{ required: true, message: '职务必选', trigger: 'change' }], sex: [{ required: true, message: '性别必选', trigger: 'blur' }], - birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }] + birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }], + 'ext.isKaoqin': [{ required: true, message: '是否考勤必选', trigger: ['change'] }], + 'ext.isOt': [{ required: true, message: '是否统计加班必选', trigger: ['change'] }], + 'ext.isZhuanwu': [{ required: true, message: '是否专务必选', trigger: ['change'] }], + 'ext.isLeader': [{ required: true, message: '是否正职领导必选', trigger: ['change'] }], + 'ext.initAnnualLeave': [{ validator: validateInitAnnualLeave, required: true, trigger: ['blur'] }], + 'ext.annualLeave': [{ validator: validateAnnualLeave, required: true, trigger: ['blur'] }] }, dialogVisible: false, labelPosition: 'right', @@ -209,6 +338,9 @@ } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchNationType() // 获取民族列表 @@ -275,7 +407,13 @@ photo: personForm.photo, ext: { certificationUnit: personForm.ext.certificationUnit, // 颁发证件单位, - address: personForm.ext.address// 住址 + address: personForm.ext.address, // 住址 + isKaoqin: personForm.ext.isKaoqin, + isOt: personForm.ext.isOt, + isZhuanwu: personForm.ext.isZhuanwu, + isLeader: personForm.ext.isLeader, + initAnnualLeave: personForm.ext.initAnnualLeave, + annualLeave: personForm.ext.annualLeave } } if (personForm.photo !== '') { @@ -325,7 +463,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } this.photo = '' diff --git a/src/views/memberManage/addPersonIris.vue b/src/views/memberManage/addPersonIris.vue index cef176f..2d2eae5 100644 --- a/src/views/memberManage/addPersonIris.vue +++ b/src/views/memberManage/addPersonIris.vue @@ -2,7 +2,7 @@ - + @@ -67,6 +67,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -154,6 +204,7 @@ // import { getProject } from '@/utils/baseConfig' import { getBirthdayByIdNO, getSexByIdNO } from '@/utils/dataAnalysis' // import { isIE } from '@/utils/browser' +import { attendanceEnable } from '@/main.js' export default { name: 'AddPersonIris', @@ -170,7 +221,73 @@ callback(new Error('身份证号不能为空')) } } + // 校验年假 + const validateInitAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入0-20之间的数字')) + } else { + if (value < (this.personForm.ext.annualLeave ? this.personForm.ext.annualLeave : 0) || value > 20) { + callback(new Error('请输入0-20之间且不小于剩余年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('年假不能为空')) + } + } + // 校验剩余年假 + const validateAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入数字')) + } else { + if (value < 0 || value > (this.personForm.ext.initAnnualLeave ? this.personForm.ext.initAnnualLeave : 20)) { + callback(new Error('请输入0-20之间且不大于年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('剩余年假不能为空')) + } + } return { + formSize: 'large', // 如果启动了考勤功能,条目太多,size设置为small,否则为large + attendanceEnable: attendanceEnable, // 读取全局变量,是否启用考勤功能配置 dialogFormVisible: false, // 对话框是否显示 dialogStatus: '', // 对话框类型:create,update isEditMode: false, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -191,7 +308,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -208,7 +331,13 @@ deptid: [{ required: true, message: '单位/部门必选', trigger: 'change' }], duty: [{ required: true, message: '职务必选', trigger: 'change' }], sex: [{ required: true, message: '性别必选', trigger: 'blur' }], - birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }] + birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }], + 'ext.isKaoqin': [{ required: true, message: '是否考勤必选', trigger: ['change'] }], + 'ext.isOt': [{ required: true, message: '是否统计加班必选', trigger: ['change'] }], + 'ext.isZhuanwu': [{ required: true, message: '是否专务必选', trigger: ['change'] }], + 'ext.isLeader': [{ required: true, message: '是否正职领导必选', trigger: ['change'] }], + 'ext.initAnnualLeave': [{ validator: validateInitAnnualLeave, required: true, trigger: ['blur'] }], + 'ext.annualLeave': [{ validator: validateAnnualLeave, required: true, trigger: ['blur'] }] }, dialogVisible: false, labelPosition: 'right', @@ -240,6 +369,9 @@ } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } // 接收iframe的传值 window['vueDefined'] = (receiveParams) => { this.receiveParamsFromHtml(receiveParams) @@ -318,7 +450,13 @@ photo: personForm.photo, ext: { certificationUnit: personForm.ext.certificationUnit, // 颁发证件单位, - address: personForm.ext.address// 住址 + address: personForm.ext.address, // 住址 + isKaoqin: personForm.ext.isKaoqin, + isOt: personForm.ext.isOt, + isZhuanwu: personForm.ext.isZhuanwu, + isLeader: personForm.ext.isLeader, + initAnnualLeave: personForm.ext.initAnnualLeave, + annualLeave: personForm.ext.annualLeave } } if (personForm.photo !== '') { @@ -368,7 +506,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } this.photo = '' diff --git a/config/dev.env.js b/config/dev.env.js index c21f267..bc033b0 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -6,6 +6,6 @@ // 将两个配置对象合并,最终结果是 NODE_ENV:‘"development"' module.exports = merge(prodEnv, { NODE_ENV: '"development"', - // BASE_API: '"http://139.198.16.38:20005"' - BASE_API: '"http://192.168.0.225:8093"' + BASE_API: '"http://139.198.16.38:20005"' + // BASE_API: '"http://192.168.0.18:8093"' }) diff --git a/src/api/attendance.js b/src/api/attendance.js new file mode 100644 index 0000000..c7e9922 --- /dev/null +++ b/src/api/attendance.js @@ -0,0 +1,123 @@ +/** + * 设备管理接口 + */ +import request from '@/utils/request' +import qs from 'qs' + +export function makeReport() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 获取考勤规则 +export function getRegular() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 保存考勤规则 +export function updateRegular(params) { + return request({ + url: 'device/listAll', + method: 'post', + params + }) +} +// 批量导入特殊考勤日 +export function batchImportSpecialDay(fileobj) { + const param = new FormData() + param.append('file', fileobj) + return request({ + url: 'irisCollect/batchImport', + method: 'post', + headers: { 'Content-Type': 'multipart/form-data' }, + data: param + }) +} + +// 模板下载 +export function downloadTemplate(deviceType) { + return request({ + url: 'device/model', + method: 'get', + params: { + deviceType: deviceType + } + }) +} + +// 添加特殊考勤日 +export function addSpecialDay(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} +// 修改特殊考勤日 +export function updateSpecialDay(params) { + return request({ + url: 'device/update', + method: 'post', + params + }) +} +// 删除特殊考勤日 +export function delSpecialDay(ids) { + return request({ + url: 'device/delete', + method: 'post', + params: { + ids: ids + }, + paramsSerializer: params => { + return qs.stringify(params, { indices: false }) + } + }) +} + +export function getSpecialDayList() { + return request({ + url: 'device/list', + method: 'get' + }) +} +// 批量导出 +export function batchExportDevice(params) { + return request({ + url: 'device/batchExport', + method: 'get', + timeout: 120000, + params, + responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob + }) +} +// 添加考勤备注 +export function addRemarks(params) { + return request({ + url: 'device/add', + method: 'post', + params + }) +} + +// 获取已备注列表 +export function getRemarksList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + +// 获取可备注的类型 +export function getRemarksTypeList(params) { + return request({ + url: 'remarks/list', + method: 'get', + params + }) +} + diff --git a/src/api/query.js b/src/api/query.js index 2fdedee..5117a9c 100644 --- a/src/api/query.js +++ b/src/api/query.js @@ -99,4 +99,4 @@ params, responseType: 'blob' // 这一步也很关键,一定要加上 responseType 值为 blob }) -} \ No newline at end of file +} diff --git a/src/main.js b/src/main.js index 3e00bc4..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -64,6 +64,9 @@ import VCharts from 'v-charts' Vue.use(VCharts) +// 配置是否启用考勤功能 +export const attendanceEnable = true + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index fcd1ef5..733af54 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -11,6 +11,7 @@ import { baseRoutes } from './modules/base' import { systemRouters } from './modules/system' import { accessRouters } from './modules/access' +import { attendanceRouters } from './modules/attendance' /** * hidden: true if `hidden:true` will not show in the sidebar(default is false) @@ -73,6 +74,7 @@ export const asyncRouterMap = [ ...accessRouters, ...baseRoutes, + ...attendanceRouters, ...systemRouters, { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/router/modules/attendance.js b/src/router/modules/attendance.js new file mode 100644 index 0000000..f7cf021 --- /dev/null +++ b/src/router/modules/attendance.js @@ -0,0 +1,55 @@ +/* Layout */ +import Layout from '../../views/layout/Layout' + +export const attendanceRouters = [ + { + path: '/attendance', + component: Layout, + redirect: '/atd', + name: 'Atd', + meta: { + title: '考勤统计', + icon: 'task', // 图标 + permission: ['/attendance']// 权限名称 + }, + children: [ + { + path: '/listReport', + name: 'ListReport', + component: () => import('@/views/attendance/listReport'), + meta: { title: '查询报表数据', icon: 'function', permission: ['/listReport'] } + }, + { + path: '/makeReport', + name: 'MakeReport', + component: () => import('@/views/attendance/makeReport'), + meta: { title: '生成考勤报表', icon: 'function', permission: ['/makeReport'] } + } + ] + }, + { + path: '/atdSetting', + component: Layout, + redirect: '/atdSetting', + name: 'AtdSetting', + meta: { + title: '考勤设置', + icon: 'task', // 图标 + permission: ['/atdSetting']// 权限名称 + }, + children: [ + { + path: '/regular', + name: 'Regular', + component: () => import('@/views/attendance/regular'), + meta: { title: '考勤规则', icon: 'function', permission: ['/regular'] } + }, + { + path: '/specialDay', + name: 'SpecialDay', + component: () => import('@/views/attendance/specialDay'), + meta: { title: '特殊考勤日管理', icon: 'function', permission: ['/specialDay'] } + } + ] + } +] diff --git a/src/views/attendance/editRemarks.vue b/src/views/attendance/editRemarks.vue new file mode 100644 index 0000000..58aa8f3 --- /dev/null +++ b/src/views/attendance/editRemarks.vue @@ -0,0 +1,328 @@ + + + + + + + 数据列表 + + 添加备注 + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 删除 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 因公 + 因私 + + + + + + + + + + + diff --git a/src/views/attendance/editSpecialDay.vue b/src/views/attendance/editSpecialDay.vue new file mode 100644 index 0000000..b416ddc --- /dev/null +++ b/src/views/attendance/editSpecialDay.vue @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 是 + 否 + + + + + + + + + + + diff --git a/src/views/attendance/listReport.vue b/src/views/attendance/listReport.vue new file mode 100644 index 0000000..92a5c6a --- /dev/null +++ b/src/views/attendance/listReport.vue @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + 仅显示无备注 + + + 仅显示异常 + + + 搜索 + 重新同步识别记录 + + + + + + + 数据列表 + + 导出记录 + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 编辑 + + + + + + + + + + + + + + + diff --git a/src/views/attendance/makeReport.vue b/src/views/attendance/makeReport.vue new file mode 100644 index 0000000..7e4da1b --- /dev/null +++ b/src/views/attendance/makeReport.vue @@ -0,0 +1,84 @@ + + + + + 请选择考勤月 + + + + + + + + + 生成报表 + + + + + + + + + + diff --git a/src/views/attendance/regular.vue b/src/views/attendance/regular.vue new file mode 100644 index 0000000..0fac7f8 --- /dev/null +++ b/src/views/attendance/regular.vue @@ -0,0 +1,155 @@ + + + + 工作日设置 + + + + + {{ week.label }} + + + + + 考勤时间设置 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 迟到规则设置 + + + + + + + 说明:晚到时长在此时间范围之内不视为迟到 + + + + + + + + 说明:晚到时长超过此时间范围则将视为旷工 + + + + 放弃修改 + 保存 + + + + + + + + + diff --git a/src/views/attendance/specialDay.vue b/src/views/attendance/specialDay.vue new file mode 100644 index 0000000..5ab4934 --- /dev/null +++ b/src/views/attendance/specialDay.vue @@ -0,0 +1,260 @@ + + + + + + + + + + + + 搜索 + + + + + + + 数据列表 + + 新增 + + + 批量导入 + + 模板下载 + + + + + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + + 编辑 + 删除 + + + + + + + + + + + + + + diff --git a/src/views/memberManage/addPerson.vue b/src/views/memberManage/addPerson.vue index da6fca2..deb53a9 100644 --- a/src/views/memberManage/addPerson.vue +++ b/src/views/memberManage/addPerson.vue @@ -1,6 +1,6 @@ - + @@ -65,6 +65,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -137,6 +187,7 @@ import { getProject } from '@/utils/baseConfig' import { getBirthdayByIdNO, getSexByIdNO } from '@/utils/dataAnalysis' import { isIE } from '@/utils/browser' +import { attendanceEnable } from '@/main.js' export default { name: 'AddPerson', @@ -153,7 +204,73 @@ callback(new Error('身份证号不能为空')) } } + // 校验年假 + const validateInitAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入0-20之间的数字')) + } else { + if (value < (this.personForm.ext.annualLeave ? this.personForm.ext.annualLeave : 0) || value > 20) { + callback(new Error('请输入0-20之间且不小于剩余年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('年假不能为空')) + } + } + // 校验剩余年假 + const validateAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入数字')) + } else { + if (value < 0 || value > (this.personForm.ext.initAnnualLeave ? this.personForm.ext.initAnnualLeave : 20)) { + callback(new Error('请输入0-20之间且不大于年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('剩余年假不能为空')) + } + } return { + formSize: 'large', // 如果启动了考勤功能,条目太多,size设置为small,否则为large + attendanceEnable: attendanceEnable, dialogFormVisible: false, // 对话框是否显示 dialogStatus: '', // 对话框类型:create,update isEditMode: false, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -174,7 +291,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -191,7 +314,13 @@ deptid: [{ required: true, message: '单位/部门必选', trigger: 'change' }], duty: [{ required: true, message: '职务必选', trigger: 'change' }], sex: [{ required: true, message: '性别必选', trigger: 'blur' }], - birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }] + birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }], + 'ext.isKaoqin': [{ required: true, message: '是否考勤必选', trigger: ['change'] }], + 'ext.isOt': [{ required: true, message: '是否统计加班必选', trigger: ['change'] }], + 'ext.isZhuanwu': [{ required: true, message: '是否专务必选', trigger: ['change'] }], + 'ext.isLeader': [{ required: true, message: '是否正职领导必选', trigger: ['change'] }], + 'ext.initAnnualLeave': [{ validator: validateInitAnnualLeave, required: true, trigger: ['blur'] }], + 'ext.annualLeave': [{ validator: validateAnnualLeave, required: true, trigger: ['blur'] }] }, dialogVisible: false, labelPosition: 'right', @@ -209,6 +338,9 @@ } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchNationType() // 获取民族列表 @@ -275,7 +407,13 @@ photo: personForm.photo, ext: { certificationUnit: personForm.ext.certificationUnit, // 颁发证件单位, - address: personForm.ext.address// 住址 + address: personForm.ext.address, // 住址 + isKaoqin: personForm.ext.isKaoqin, + isOt: personForm.ext.isOt, + isZhuanwu: personForm.ext.isZhuanwu, + isLeader: personForm.ext.isLeader, + initAnnualLeave: personForm.ext.initAnnualLeave, + annualLeave: personForm.ext.annualLeave } } if (personForm.photo !== '') { @@ -325,7 +463,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } this.photo = '' diff --git a/src/views/memberManage/addPersonIris.vue b/src/views/memberManage/addPersonIris.vue index cef176f..2d2eae5 100644 --- a/src/views/memberManage/addPersonIris.vue +++ b/src/views/memberManage/addPersonIris.vue @@ -2,7 +2,7 @@ - + @@ -67,6 +67,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -154,6 +204,7 @@ // import { getProject } from '@/utils/baseConfig' import { getBirthdayByIdNO, getSexByIdNO } from '@/utils/dataAnalysis' // import { isIE } from '@/utils/browser' +import { attendanceEnable } from '@/main.js' export default { name: 'AddPersonIris', @@ -170,7 +221,73 @@ callback(new Error('身份证号不能为空')) } } + // 校验年假 + const validateInitAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入0-20之间的数字')) + } else { + if (value < (this.personForm.ext.annualLeave ? this.personForm.ext.annualLeave : 0) || value > 20) { + callback(new Error('请输入0-20之间且不小于剩余年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('年假不能为空')) + } + } + // 校验剩余年假 + const validateAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入数字')) + } else { + if (value < 0 || value > (this.personForm.ext.initAnnualLeave ? this.personForm.ext.initAnnualLeave : 20)) { + callback(new Error('请输入0-20之间且不大于年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('剩余年假不能为空')) + } + } return { + formSize: 'large', // 如果启动了考勤功能,条目太多,size设置为small,否则为large + attendanceEnable: attendanceEnable, // 读取全局变量,是否启用考勤功能配置 dialogFormVisible: false, // 对话框是否显示 dialogStatus: '', // 对话框类型:create,update isEditMode: false, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -191,7 +308,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -208,7 +331,13 @@ deptid: [{ required: true, message: '单位/部门必选', trigger: 'change' }], duty: [{ required: true, message: '职务必选', trigger: 'change' }], sex: [{ required: true, message: '性别必选', trigger: 'blur' }], - birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }] + birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }], + 'ext.isKaoqin': [{ required: true, message: '是否考勤必选', trigger: ['change'] }], + 'ext.isOt': [{ required: true, message: '是否统计加班必选', trigger: ['change'] }], + 'ext.isZhuanwu': [{ required: true, message: '是否专务必选', trigger: ['change'] }], + 'ext.isLeader': [{ required: true, message: '是否正职领导必选', trigger: ['change'] }], + 'ext.initAnnualLeave': [{ validator: validateInitAnnualLeave, required: true, trigger: ['blur'] }], + 'ext.annualLeave': [{ validator: validateAnnualLeave, required: true, trigger: ['blur'] }] }, dialogVisible: false, labelPosition: 'right', @@ -240,6 +369,9 @@ } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } // 接收iframe的传值 window['vueDefined'] = (receiveParams) => { this.receiveParamsFromHtml(receiveParams) @@ -318,7 +450,13 @@ photo: personForm.photo, ext: { certificationUnit: personForm.ext.certificationUnit, // 颁发证件单位, - address: personForm.ext.address// 住址 + address: personForm.ext.address, // 住址 + isKaoqin: personForm.ext.isKaoqin, + isOt: personForm.ext.isOt, + isZhuanwu: personForm.ext.isZhuanwu, + isLeader: personForm.ext.isLeader, + initAnnualLeave: personForm.ext.initAnnualLeave, + annualLeave: personForm.ext.annualLeave } } if (personForm.photo !== '') { @@ -368,7 +506,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } this.photo = '' diff --git a/src/views/memberManage/listStaff.vue b/src/views/memberManage/listStaff.vue index 9216c82..9450c45 100644 --- a/src/views/memberManage/listStaff.vue +++ b/src/views/memberManage/listStaff.vue @@ -72,10 +72,11 @@ + + diff --git a/src/views/attendance/editSpecialDay.vue b/src/views/attendance/editSpecialDay.vue new file mode 100644 index 0000000..b416ddc --- /dev/null +++ b/src/views/attendance/editSpecialDay.vue @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 是 + 否 + + + + + + + + + + + diff --git a/src/views/attendance/listReport.vue b/src/views/attendance/listReport.vue new file mode 100644 index 0000000..92a5c6a --- /dev/null +++ b/src/views/attendance/listReport.vue @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + 仅显示无备注 + + + 仅显示异常 + + + 搜索 + 重新同步识别记录 + + + + + + + 数据列表 + + 导出记录 + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + 编辑 + + + + + + + + + + + + + + + diff --git a/src/views/attendance/makeReport.vue b/src/views/attendance/makeReport.vue new file mode 100644 index 0000000..7e4da1b --- /dev/null +++ b/src/views/attendance/makeReport.vue @@ -0,0 +1,84 @@ + + + + + 请选择考勤月 + + + + + + + + + 生成报表 + + + + + + + + + + diff --git a/src/views/attendance/regular.vue b/src/views/attendance/regular.vue new file mode 100644 index 0000000..0fac7f8 --- /dev/null +++ b/src/views/attendance/regular.vue @@ -0,0 +1,155 @@ + + + + 工作日设置 + + + + + {{ week.label }} + + + + + 考勤时间设置 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 迟到规则设置 + + + + + + + 说明:晚到时长在此时间范围之内不视为迟到 + + + + + + + + 说明:晚到时长超过此时间范围则将视为旷工 + + + + 放弃修改 + 保存 + + + + + + + + + diff --git a/src/views/attendance/specialDay.vue b/src/views/attendance/specialDay.vue new file mode 100644 index 0000000..5ab4934 --- /dev/null +++ b/src/views/attendance/specialDay.vue @@ -0,0 +1,260 @@ + + + + + + + + + + + + 搜索 + + + + + + + 数据列表 + + 新增 + + + 批量导入 + + 模板下载 + + + + + + + + + + + {{ scope.row[column.value] }} + {{ scope.row.ext[column.value] }} + + + + + + 编辑 + 删除 + + + + + + + + + + + + + + diff --git a/src/views/memberManage/addPerson.vue b/src/views/memberManage/addPerson.vue index da6fca2..deb53a9 100644 --- a/src/views/memberManage/addPerson.vue +++ b/src/views/memberManage/addPerson.vue @@ -1,6 +1,6 @@ - + @@ -65,6 +65,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -137,6 +187,7 @@ import { getProject } from '@/utils/baseConfig' import { getBirthdayByIdNO, getSexByIdNO } from '@/utils/dataAnalysis' import { isIE } from '@/utils/browser' +import { attendanceEnable } from '@/main.js' export default { name: 'AddPerson', @@ -153,7 +204,73 @@ callback(new Error('身份证号不能为空')) } } + // 校验年假 + const validateInitAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入0-20之间的数字')) + } else { + if (value < (this.personForm.ext.annualLeave ? this.personForm.ext.annualLeave : 0) || value > 20) { + callback(new Error('请输入0-20之间且不小于剩余年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('年假不能为空')) + } + } + // 校验剩余年假 + const validateAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入数字')) + } else { + if (value < 0 || value > (this.personForm.ext.initAnnualLeave ? this.personForm.ext.initAnnualLeave : 20)) { + callback(new Error('请输入0-20之间且不大于年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('剩余年假不能为空')) + } + } return { + formSize: 'large', // 如果启动了考勤功能,条目太多,size设置为small,否则为large + attendanceEnable: attendanceEnable, dialogFormVisible: false, // 对话框是否显示 dialogStatus: '', // 对话框类型:create,update isEditMode: false, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -174,7 +291,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -191,7 +314,13 @@ deptid: [{ required: true, message: '单位/部门必选', trigger: 'change' }], duty: [{ required: true, message: '职务必选', trigger: 'change' }], sex: [{ required: true, message: '性别必选', trigger: 'blur' }], - birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }] + birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }], + 'ext.isKaoqin': [{ required: true, message: '是否考勤必选', trigger: ['change'] }], + 'ext.isOt': [{ required: true, message: '是否统计加班必选', trigger: ['change'] }], + 'ext.isZhuanwu': [{ required: true, message: '是否专务必选', trigger: ['change'] }], + 'ext.isLeader': [{ required: true, message: '是否正职领导必选', trigger: ['change'] }], + 'ext.initAnnualLeave': [{ validator: validateInitAnnualLeave, required: true, trigger: ['blur'] }], + 'ext.annualLeave': [{ validator: validateAnnualLeave, required: true, trigger: ['blur'] }] }, dialogVisible: false, labelPosition: 'right', @@ -209,6 +338,9 @@ } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchNationType() // 获取民族列表 @@ -275,7 +407,13 @@ photo: personForm.photo, ext: { certificationUnit: personForm.ext.certificationUnit, // 颁发证件单位, - address: personForm.ext.address// 住址 + address: personForm.ext.address, // 住址 + isKaoqin: personForm.ext.isKaoqin, + isOt: personForm.ext.isOt, + isZhuanwu: personForm.ext.isZhuanwu, + isLeader: personForm.ext.isLeader, + initAnnualLeave: personForm.ext.initAnnualLeave, + annualLeave: personForm.ext.annualLeave } } if (personForm.photo !== '') { @@ -325,7 +463,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } this.photo = '' diff --git a/src/views/memberManage/addPersonIris.vue b/src/views/memberManage/addPersonIris.vue index cef176f..2d2eae5 100644 --- a/src/views/memberManage/addPersonIris.vue +++ b/src/views/memberManage/addPersonIris.vue @@ -2,7 +2,7 @@ - + @@ -67,6 +67,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -154,6 +204,7 @@ // import { getProject } from '@/utils/baseConfig' import { getBirthdayByIdNO, getSexByIdNO } from '@/utils/dataAnalysis' // import { isIE } from '@/utils/browser' +import { attendanceEnable } from '@/main.js' export default { name: 'AddPersonIris', @@ -170,7 +221,73 @@ callback(new Error('身份证号不能为空')) } } + // 校验年假 + const validateInitAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入0-20之间的数字')) + } else { + if (value < (this.personForm.ext.annualLeave ? this.personForm.ext.annualLeave : 0) || value > 20) { + callback(new Error('请输入0-20之间且不小于剩余年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('年假不能为空')) + } + } + // 校验剩余年假 + const validateAnnualLeave = (rule, value, callback) => { + if (value !== '') { + if (value !== '0') { + if (!Number(value)) { + callback(new Error('请输入数字')) + } else { + if (value < 0 || value > (this.personForm.ext.initAnnualLeave ? this.personForm.ext.initAnnualLeave : 20)) { + callback(new Error('请输入0-20之间且不大于年假天数的值')) + } else { + if (value.indexOf('.') !== -1) { + if (value.split('.')[1].length > 1) { + callback(new Error('只能是一位小数,如5.0或5.5')) + } else { + if (value.split('.')[1] !== '0' && value.split('.')[1] !== '5') { + callback(new Error('只能是整数或整数加减0.5的值')) + } else { + callback() + } + } + } else { + callback() + } + } + } + } else { + callback() + } + } else { + callback(new Error('剩余年假不能为空')) + } + } return { + formSize: 'large', // 如果启动了考勤功能,条目太多,size设置为small,否则为large + attendanceEnable: attendanceEnable, // 读取全局变量,是否启用考勤功能配置 dialogFormVisible: false, // 对话框是否显示 dialogStatus: '', // 对话框类型:create,update isEditMode: false, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -191,7 +308,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -208,7 +331,13 @@ deptid: [{ required: true, message: '单位/部门必选', trigger: 'change' }], duty: [{ required: true, message: '职务必选', trigger: 'change' }], sex: [{ required: true, message: '性别必选', trigger: 'blur' }], - birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }] + birthday: [{ required: true, message: '出生日期必填', trigger: ['blur'] }], + 'ext.isKaoqin': [{ required: true, message: '是否考勤必选', trigger: ['change'] }], + 'ext.isOt': [{ required: true, message: '是否统计加班必选', trigger: ['change'] }], + 'ext.isZhuanwu': [{ required: true, message: '是否专务必选', trigger: ['change'] }], + 'ext.isLeader': [{ required: true, message: '是否正职领导必选', trigger: ['change'] }], + 'ext.initAnnualLeave': [{ validator: validateInitAnnualLeave, required: true, trigger: ['blur'] }], + 'ext.annualLeave': [{ validator: validateAnnualLeave, required: true, trigger: ['blur'] }] }, dialogVisible: false, labelPosition: 'right', @@ -240,6 +369,9 @@ } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } // 接收iframe的传值 window['vueDefined'] = (receiveParams) => { this.receiveParamsFromHtml(receiveParams) @@ -318,7 +450,13 @@ photo: personForm.photo, ext: { certificationUnit: personForm.ext.certificationUnit, // 颁发证件单位, - address: personForm.ext.address// 住址 + address: personForm.ext.address, // 住址 + isKaoqin: personForm.ext.isKaoqin, + isOt: personForm.ext.isOt, + isZhuanwu: personForm.ext.isZhuanwu, + isLeader: personForm.ext.isLeader, + initAnnualLeave: personForm.ext.initAnnualLeave, + annualLeave: personForm.ext.annualLeave } } if (personForm.photo !== '') { @@ -368,7 +506,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } this.photo = '' diff --git a/src/views/memberManage/listStaff.vue b/src/views/memberManage/listStaff.vue index 9216c82..9450c45 100644 --- a/src/views/memberManage/listStaff.vue +++ b/src/views/memberManage/listStaff.vue @@ -72,10 +72,11 @@