diff --git a/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 diff --git a/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } diff --git a/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', diff --git a/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/doorManage/controlDoor.vue b/src/views/doorManage/controlDoor.vue index dc19d8e..a931668 100644 --- a/src/views/doorManage/controlDoor.vue +++ b/src/views/doorManage/controlDoor.vue @@ -107,6 +107,10 @@ }, // 保存数据 saveData: function() { + if(this.doorForm.beginDateTime >= this.doorForm.endDateTime){ + this.$message.warning("生效时间必须小于失效时间") + return + } this.updateData() }, // 修改数据 diff --git a/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/doorManage/controlDoor.vue b/src/views/doorManage/controlDoor.vue index dc19d8e..a931668 100644 --- a/src/views/doorManage/controlDoor.vue +++ b/src/views/doorManage/controlDoor.vue @@ -107,6 +107,10 @@ }, // 保存数据 saveData: function() { + if(this.doorForm.beginDateTime >= this.doorForm.endDateTime){ + this.$message.warning("生效时间必须小于失效时间") + return + } this.updateData() }, // 修改数据 diff --git a/src/views/memberManage/addIris.vue b/src/views/memberManage/addIris.vue index e65e74c..d450107 100644 --- a/src/views/memberManage/addIris.vue +++ b/src/views/memberManage/addIris.vue @@ -21,7 +21,8 @@ image_zy1: '', image_yy1: '' }, - iframeMsg: '' + iframeMsg: '', + type: '' // 跳转类型 } }, mounted() { @@ -33,9 +34,6 @@ if (this.$route.query.personId) { this.irisForm.personId = this.$route.query.personId } - if (this.$route.query.idCardNo) { - this.irisForm.idCardNo = this.$route.query.idCardNo - } // console.log(this.irisForm) }, activated() { @@ -89,7 +87,13 @@ if (response.code === 200) { this.$message.success('保存虹膜成功') this.resetForm() - this.$router.push({ path: '/staff' }) + if(this.type === 'staff') { + this.$router.push({ path: '/staff' }) + } + if(this.type === 'visitor') { + this.$router.push({ path: '/visitor' }) + } + } }) } diff --git a/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/doorManage/controlDoor.vue b/src/views/doorManage/controlDoor.vue index dc19d8e..a931668 100644 --- a/src/views/doorManage/controlDoor.vue +++ b/src/views/doorManage/controlDoor.vue @@ -107,6 +107,10 @@ }, // 保存数据 saveData: function() { + if(this.doorForm.beginDateTime >= this.doorForm.endDateTime){ + this.$message.warning("生效时间必须小于失效时间") + return + } this.updateData() }, // 修改数据 diff --git a/src/views/memberManage/addIris.vue b/src/views/memberManage/addIris.vue index e65e74c..d450107 100644 --- a/src/views/memberManage/addIris.vue +++ b/src/views/memberManage/addIris.vue @@ -21,7 +21,8 @@ image_zy1: '', image_yy1: '' }, - iframeMsg: '' + iframeMsg: '', + type: '' // 跳转类型 } }, mounted() { @@ -33,9 +34,6 @@ if (this.$route.query.personId) { this.irisForm.personId = this.$route.query.personId } - if (this.$route.query.idCardNo) { - this.irisForm.idCardNo = this.$route.query.idCardNo - } // console.log(this.irisForm) }, activated() { @@ -89,7 +87,13 @@ if (response.code === 200) { this.$message.success('保存虹膜成功') this.resetForm() - this.$router.push({ path: '/staff' }) + if(this.type === 'staff') { + this.$router.push({ path: '/staff' }) + } + if(this.type === 'visitor') { + this.$router.push({ path: '/visitor' }) + } + } }) } diff --git a/src/views/memberManage/addPerson.vue b/src/views/memberManage/addPerson.vue index 7b3b1a3..159e1cf 100644 --- a/src/views/memberManage/addPerson.vue +++ b/src/views/memberManage/addPerson.vue @@ -1,6 +1,6 @@ - + @@ -31,8 +31,7 @@ :editable="false" type="date" style="width: 100%" - value-format="yyyy-MM-dd" - /> + value-format="yyyy-MM-dd"/> @@ -66,6 +65,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -138,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', @@ -154,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, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -175,7 +291,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -192,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', 'change'] }] + 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', @@ -210,6 +338,9 @@ // } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchNationType() // 获取民族列表 @@ -276,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 !== '') { @@ -334,7 +471,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } this.photo = '' diff --git a/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/doorManage/controlDoor.vue b/src/views/doorManage/controlDoor.vue index dc19d8e..a931668 100644 --- a/src/views/doorManage/controlDoor.vue +++ b/src/views/doorManage/controlDoor.vue @@ -107,6 +107,10 @@ }, // 保存数据 saveData: function() { + if(this.doorForm.beginDateTime >= this.doorForm.endDateTime){ + this.$message.warning("生效时间必须小于失效时间") + return + } this.updateData() }, // 修改数据 diff --git a/src/views/memberManage/addIris.vue b/src/views/memberManage/addIris.vue index e65e74c..d450107 100644 --- a/src/views/memberManage/addIris.vue +++ b/src/views/memberManage/addIris.vue @@ -21,7 +21,8 @@ image_zy1: '', image_yy1: '' }, - iframeMsg: '' + iframeMsg: '', + type: '' // 跳转类型 } }, mounted() { @@ -33,9 +34,6 @@ if (this.$route.query.personId) { this.irisForm.personId = this.$route.query.personId } - if (this.$route.query.idCardNo) { - this.irisForm.idCardNo = this.$route.query.idCardNo - } // console.log(this.irisForm) }, activated() { @@ -89,7 +87,13 @@ if (response.code === 200) { this.$message.success('保存虹膜成功') this.resetForm() - this.$router.push({ path: '/staff' }) + if(this.type === 'staff') { + this.$router.push({ path: '/staff' }) + } + if(this.type === 'visitor') { + this.$router.push({ path: '/visitor' }) + } + } }) } diff --git a/src/views/memberManage/addPerson.vue b/src/views/memberManage/addPerson.vue index 7b3b1a3..159e1cf 100644 --- a/src/views/memberManage/addPerson.vue +++ b/src/views/memberManage/addPerson.vue @@ -1,6 +1,6 @@ - + @@ -31,8 +31,7 @@ :editable="false" type="date" style="width: 100%" - value-format="yyyy-MM-dd" - /> + value-format="yyyy-MM-dd"/> @@ -66,6 +65,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -138,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', @@ -154,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, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -175,7 +291,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -192,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', 'change'] }] + 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', @@ -210,6 +338,9 @@ // } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchNationType() // 获取民族列表 @@ -276,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 !== '') { @@ -334,7 +471,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 ebc8c90..1228fed 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 !== '') { @@ -369,7 +507,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } if (id) { diff --git a/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/doorManage/controlDoor.vue b/src/views/doorManage/controlDoor.vue index dc19d8e..a931668 100644 --- a/src/views/doorManage/controlDoor.vue +++ b/src/views/doorManage/controlDoor.vue @@ -107,6 +107,10 @@ }, // 保存数据 saveData: function() { + if(this.doorForm.beginDateTime >= this.doorForm.endDateTime){ + this.$message.warning("生效时间必须小于失效时间") + return + } this.updateData() }, // 修改数据 diff --git a/src/views/memberManage/addIris.vue b/src/views/memberManage/addIris.vue index e65e74c..d450107 100644 --- a/src/views/memberManage/addIris.vue +++ b/src/views/memberManage/addIris.vue @@ -21,7 +21,8 @@ image_zy1: '', image_yy1: '' }, - iframeMsg: '' + iframeMsg: '', + type: '' // 跳转类型 } }, mounted() { @@ -33,9 +34,6 @@ if (this.$route.query.personId) { this.irisForm.personId = this.$route.query.personId } - if (this.$route.query.idCardNo) { - this.irisForm.idCardNo = this.$route.query.idCardNo - } // console.log(this.irisForm) }, activated() { @@ -89,7 +87,13 @@ if (response.code === 200) { this.$message.success('保存虹膜成功') this.resetForm() - this.$router.push({ path: '/staff' }) + if(this.type === 'staff') { + this.$router.push({ path: '/staff' }) + } + if(this.type === 'visitor') { + this.$router.push({ path: '/visitor' }) + } + } }) } diff --git a/src/views/memberManage/addPerson.vue b/src/views/memberManage/addPerson.vue index 7b3b1a3..159e1cf 100644 --- a/src/views/memberManage/addPerson.vue +++ b/src/views/memberManage/addPerson.vue @@ -1,6 +1,6 @@ - + @@ -31,8 +31,7 @@ :editable="false" type="date" style="width: 100%" - value-format="yyyy-MM-dd" - /> + value-format="yyyy-MM-dd"/> @@ -66,6 +65,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -138,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', @@ -154,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, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -175,7 +291,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -192,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', 'change'] }] + 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', @@ -210,6 +338,9 @@ // } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchNationType() // 获取民族列表 @@ -276,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 !== '') { @@ -334,7 +471,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 ebc8c90..1228fed 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 !== '') { @@ -369,7 +507,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } if (id) { diff --git a/src/views/memberManage/listStaff.vue b/src/views/memberManage/listStaff.vue index f531ba7..62809ed 100644 --- a/src/views/memberManage/listStaff.vue +++ b/src/views/memberManage/listStaff.vue @@ -76,6 +76,7 @@ // import { getProject } from '@/utils/baseConfig' // import { isIE } from '@/utils/browser' import { downloadFile } from '@/utils/downloadUtils' +import { attendanceEnable } from '@/main.js' export default { name: 'ListStaff', @@ -93,55 +94,95 @@ sort: '', order: '' }, // 筛选条件 - columns: [ - { - text: '员工编号', - value: 'personCode', - align: 'center' - }, - { - text: '姓名', - value: 'name', - align: 'center' - }, - { - text: '性别', - value: 'sexName', - align: 'center' - }, - { - text: '身份证号', - value: 'idCardNo', - align: 'center', - width: 180 - }, - { - text: '单位/部门', - value: 'deptName', - align: 'center' - }, - { - text: '职务', - value: 'dutyName', - align: 'center' - }, - { - text: '备注', - value: 'remarks', - width: 140, - align: 'center' - } - ], // 显示列 + columns: [], // 显示列 multipleSelection: [], // 多选选中项 list: [], // 列表数据 total: 0, // 数据总数 sexList: [], // 性别列表 dutyList: [], // 职务列表 - listLoading: true, // 加载动画 + listLoading: false, // 加载动画 fullscreenLoading: false // 全屏加载动画 } }, mounted() { + debugger + this.columns = [ + { + text: '员工编号', + value: 'personCode', + align: 'center' + }, + { + text: '姓名', + value: 'name', + align: 'center' + }, + { + text: '性别', + value: 'sexName', + align: 'center' + }, + { + text: '身份证号', + value: 'idCardNo', + align: 'center', + width: 180 + }, + { + text: '单位/部门', + value: 'deptName', + align: 'center' + }, + { + text: '职务', + value: 'dutyName', + align: 'center' + }, + { + text: '备注', + value: 'remarks', + width: 140, + align: 'center' + } + ] + if (attendanceEnable === true) { + this.columns.push( + { + text: '考勤', + value: 'isKaoqinName', + align: 'center' + }) + this.columns.push( + { + text: '统计加班', + value: 'isOt', + align: 'center' + }) + this.columns.push( + { + text: '专务', + value: 'isZhuanwu', + align: 'center' + }) + this.columns.push( + { + text: '部门正职领导', + value: 'idLeader', + align: 'center' + }) + this.columns.push( + { + text: '年假(天)', + value: 'initAnnualLeave', + align: 'center' + }) + this.columns.push( + { + text: '剩余年假(天)', + value: 'annualLeave', + align: 'center' + }) + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchData()// 获取数据 @@ -209,7 +250,8 @@ path: '/addIris', query: { personId: row.id, - idCardNo: row.idCardNo + idCardNo: row.idCardNo, + type: 'staff' } }) }, diff --git a/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/doorManage/controlDoor.vue b/src/views/doorManage/controlDoor.vue index dc19d8e..a931668 100644 --- a/src/views/doorManage/controlDoor.vue +++ b/src/views/doorManage/controlDoor.vue @@ -107,6 +107,10 @@ }, // 保存数据 saveData: function() { + if(this.doorForm.beginDateTime >= this.doorForm.endDateTime){ + this.$message.warning("生效时间必须小于失效时间") + return + } this.updateData() }, // 修改数据 diff --git a/src/views/memberManage/addIris.vue b/src/views/memberManage/addIris.vue index e65e74c..d450107 100644 --- a/src/views/memberManage/addIris.vue +++ b/src/views/memberManage/addIris.vue @@ -21,7 +21,8 @@ image_zy1: '', image_yy1: '' }, - iframeMsg: '' + iframeMsg: '', + type: '' // 跳转类型 } }, mounted() { @@ -33,9 +34,6 @@ if (this.$route.query.personId) { this.irisForm.personId = this.$route.query.personId } - if (this.$route.query.idCardNo) { - this.irisForm.idCardNo = this.$route.query.idCardNo - } // console.log(this.irisForm) }, activated() { @@ -89,7 +87,13 @@ if (response.code === 200) { this.$message.success('保存虹膜成功') this.resetForm() - this.$router.push({ path: '/staff' }) + if(this.type === 'staff') { + this.$router.push({ path: '/staff' }) + } + if(this.type === 'visitor') { + this.$router.push({ path: '/visitor' }) + } + } }) } diff --git a/src/views/memberManage/addPerson.vue b/src/views/memberManage/addPerson.vue index 7b3b1a3..159e1cf 100644 --- a/src/views/memberManage/addPerson.vue +++ b/src/views/memberManage/addPerson.vue @@ -1,6 +1,6 @@ - + @@ -31,8 +31,7 @@ :editable="false" type="date" style="width: 100%" - value-format="yyyy-MM-dd" - /> + value-format="yyyy-MM-dd"/> @@ -66,6 +65,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -138,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', @@ -154,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, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -175,7 +291,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -192,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', 'change'] }] + 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', @@ -210,6 +338,9 @@ // } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchNationType() // 获取民族列表 @@ -276,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 !== '') { @@ -334,7 +471,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 ebc8c90..1228fed 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 !== '') { @@ -369,7 +507,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } if (id) { diff --git a/src/views/memberManage/listStaff.vue b/src/views/memberManage/listStaff.vue index f531ba7..62809ed 100644 --- a/src/views/memberManage/listStaff.vue +++ b/src/views/memberManage/listStaff.vue @@ -76,6 +76,7 @@ // import { getProject } from '@/utils/baseConfig' // import { isIE } from '@/utils/browser' import { downloadFile } from '@/utils/downloadUtils' +import { attendanceEnable } from '@/main.js' export default { name: 'ListStaff', @@ -93,55 +94,95 @@ sort: '', order: '' }, // 筛选条件 - columns: [ - { - text: '员工编号', - value: 'personCode', - align: 'center' - }, - { - text: '姓名', - value: 'name', - align: 'center' - }, - { - text: '性别', - value: 'sexName', - align: 'center' - }, - { - text: '身份证号', - value: 'idCardNo', - align: 'center', - width: 180 - }, - { - text: '单位/部门', - value: 'deptName', - align: 'center' - }, - { - text: '职务', - value: 'dutyName', - align: 'center' - }, - { - text: '备注', - value: 'remarks', - width: 140, - align: 'center' - } - ], // 显示列 + columns: [], // 显示列 multipleSelection: [], // 多选选中项 list: [], // 列表数据 total: 0, // 数据总数 sexList: [], // 性别列表 dutyList: [], // 职务列表 - listLoading: true, // 加载动画 + listLoading: false, // 加载动画 fullscreenLoading: false // 全屏加载动画 } }, mounted() { + debugger + this.columns = [ + { + text: '员工编号', + value: 'personCode', + align: 'center' + }, + { + text: '姓名', + value: 'name', + align: 'center' + }, + { + text: '性别', + value: 'sexName', + align: 'center' + }, + { + text: '身份证号', + value: 'idCardNo', + align: 'center', + width: 180 + }, + { + text: '单位/部门', + value: 'deptName', + align: 'center' + }, + { + text: '职务', + value: 'dutyName', + align: 'center' + }, + { + text: '备注', + value: 'remarks', + width: 140, + align: 'center' + } + ] + if (attendanceEnable === true) { + this.columns.push( + { + text: '考勤', + value: 'isKaoqinName', + align: 'center' + }) + this.columns.push( + { + text: '统计加班', + value: 'isOt', + align: 'center' + }) + this.columns.push( + { + text: '专务', + value: 'isZhuanwu', + align: 'center' + }) + this.columns.push( + { + text: '部门正职领导', + value: 'idLeader', + align: 'center' + }) + this.columns.push( + { + text: '年假(天)', + value: 'initAnnualLeave', + align: 'center' + }) + this.columns.push( + { + text: '剩余年假(天)', + value: 'annualLeave', + align: 'center' + }) + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchData()// 获取数据 @@ -209,7 +250,8 @@ path: '/addIris', query: { personId: row.id, - idCardNo: row.idCardNo + idCardNo: row.idCardNo, + type: 'staff' } }) }, diff --git a/src/views/memberManage/listVisitor.vue b/src/views/memberManage/listVisitor.vue index b6e0a3d..e3ffc97 100644 --- a/src/views/memberManage/listVisitor.vue +++ b/src/views/memberManage/listVisitor.vue @@ -234,17 +234,25 @@ }) }, registerIris(row) { - const token = getToken() - const id = row.id - const idCardNo = row.idCardNo - const baseUrl = getProject().register_url - if (isIE()) { - const url = baseUrl + '?token=' + token + '_id=' + id + '_idCardNo=' + idCardNo - window.open(url, '_blank') - } else { - const url = 'openIE:' + baseUrl + '?token=' + token + '_id=' + id + '_idCardNo=' + idCardNo - window.location.href = url - } + // const token = getToken() + // const id = row.id + // const idCardNo = row.idCardNo + // const baseUrl = getProject().register_url + // if (isIE()) { + // const url = baseUrl + '?token=' + token + '_id=' + id + '_idCardNo=' + idCardNo + // window.open(url, '_blank') + // } else { + // const url = 'openIE:' + baseUrl + '?token=' + token + '_id=' + id + '_idCardNo=' + idCardNo + // window.location.href = url + // } + this.$router.push({ + path: '/addIris', + query: { + personId: row.id, + idCardNo: row.idCardNo, + type: 'visitor' + } + }) }, // 查询数据 search() { diff --git a/README.md b/README.md index 21499d1..241cbf2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 虹膜综合管理平台(红外测温版)系统前端 +# 虹膜综合管理平台(红外测温版)加考勤系统前端 > 虹膜综合管理平台WEB前端 ,目前包含门禁和注册两大模块 -> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计 +> 系统分为登录模块、人员管理、设备管理、到访策略管理、门禁管理、门禁授权、数据查询、数据统计、考勤信息管理 > 系统管理模块包括资源管理、角色管理、组织结构管理、字典管理、区域管理、用户管理、日志管理。 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/access.js b/src/api/access.js index 54dda50..156c1c4 100644 --- a/src/api/access.js +++ b/src/api/access.js @@ -30,14 +30,15 @@ }) } // 新增授权 -export function addPermission(params) { +export function addPermission(form) { return request({ url: 'acsPermission/add', method: 'post', - params, - paramsSerializer: params => { - return qs.stringify(params, { indices: false }) - } + params: { + doorCode: form.doorCode, + strategyId: form.strategyId + }, + data: form.personList }) } 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/main.js b/src/main.js index 1a0ba3d..c9354d4 100644 --- a/src/main.js +++ b/src/main.js @@ -65,7 +65,7 @@ Vue.use(VCharts) // 配置是否启用考勤功能 -export const attendanceEnable = false +export const attendanceEnable = true new Vue({ el: '#app', 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/doorManage/controlDoor.vue b/src/views/doorManage/controlDoor.vue index dc19d8e..a931668 100644 --- a/src/views/doorManage/controlDoor.vue +++ b/src/views/doorManage/controlDoor.vue @@ -107,6 +107,10 @@ }, // 保存数据 saveData: function() { + if(this.doorForm.beginDateTime >= this.doorForm.endDateTime){ + this.$message.warning("生效时间必须小于失效时间") + return + } this.updateData() }, // 修改数据 diff --git a/src/views/memberManage/addIris.vue b/src/views/memberManage/addIris.vue index e65e74c..d450107 100644 --- a/src/views/memberManage/addIris.vue +++ b/src/views/memberManage/addIris.vue @@ -21,7 +21,8 @@ image_zy1: '', image_yy1: '' }, - iframeMsg: '' + iframeMsg: '', + type: '' // 跳转类型 } }, mounted() { @@ -33,9 +34,6 @@ if (this.$route.query.personId) { this.irisForm.personId = this.$route.query.personId } - if (this.$route.query.idCardNo) { - this.irisForm.idCardNo = this.$route.query.idCardNo - } // console.log(this.irisForm) }, activated() { @@ -89,7 +87,13 @@ if (response.code === 200) { this.$message.success('保存虹膜成功') this.resetForm() - this.$router.push({ path: '/staff' }) + if(this.type === 'staff') { + this.$router.push({ path: '/staff' }) + } + if(this.type === 'visitor') { + this.$router.push({ path: '/visitor' }) + } + } }) } diff --git a/src/views/memberManage/addPerson.vue b/src/views/memberManage/addPerson.vue index 7b3b1a3..159e1cf 100644 --- a/src/views/memberManage/addPerson.vue +++ b/src/views/memberManage/addPerson.vue @@ -1,6 +1,6 @@ - + @@ -31,8 +31,7 @@ :editable="false" type="date" style="width: 100%" - value-format="yyyy-MM-dd" - /> + value-format="yyyy-MM-dd"/> @@ -66,6 +65,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -138,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', @@ -154,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, // 是否为编辑模式,编辑模式部分字段不允许修改,且没有重置和虹膜注册功能 @@ -175,7 +291,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } }, // 表单 photo: '', // 图片路径 @@ -192,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', 'change'] }] + 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', @@ -210,6 +338,9 @@ // } }, mounted() { + if (attendanceEnable === true) { + this.formSize = 'small' + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchNationType() // 获取民族列表 @@ -276,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 !== '') { @@ -334,7 +471,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 ebc8c90..1228fed 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 !== '') { @@ -369,7 +507,13 @@ photo: '', ext: { certificationUnit: '', // 颁发证件单位, - address: ''// 住址 + address: '', // 住址 + isKaoqin: '', + isOt: '', + isZhuanwu: '', + isLeader: '', + initAnnualLeave: '', + annualLeave: '' } } if (id) { diff --git a/src/views/memberManage/listStaff.vue b/src/views/memberManage/listStaff.vue index f531ba7..62809ed 100644 --- a/src/views/memberManage/listStaff.vue +++ b/src/views/memberManage/listStaff.vue @@ -76,6 +76,7 @@ // import { getProject } from '@/utils/baseConfig' // import { isIE } from '@/utils/browser' import { downloadFile } from '@/utils/downloadUtils' +import { attendanceEnable } from '@/main.js' export default { name: 'ListStaff', @@ -93,55 +94,95 @@ sort: '', order: '' }, // 筛选条件 - columns: [ - { - text: '员工编号', - value: 'personCode', - align: 'center' - }, - { - text: '姓名', - value: 'name', - align: 'center' - }, - { - text: '性别', - value: 'sexName', - align: 'center' - }, - { - text: '身份证号', - value: 'idCardNo', - align: 'center', - width: 180 - }, - { - text: '单位/部门', - value: 'deptName', - align: 'center' - }, - { - text: '职务', - value: 'dutyName', - align: 'center' - }, - { - text: '备注', - value: 'remarks', - width: 140, - align: 'center' - } - ], // 显示列 + columns: [], // 显示列 multipleSelection: [], // 多选选中项 list: [], // 列表数据 total: 0, // 数据总数 sexList: [], // 性别列表 dutyList: [], // 职务列表 - listLoading: true, // 加载动画 + listLoading: false, // 加载动画 fullscreenLoading: false // 全屏加载动画 } }, mounted() { + debugger + this.columns = [ + { + text: '员工编号', + value: 'personCode', + align: 'center' + }, + { + text: '姓名', + value: 'name', + align: 'center' + }, + { + text: '性别', + value: 'sexName', + align: 'center' + }, + { + text: '身份证号', + value: 'idCardNo', + align: 'center', + width: 180 + }, + { + text: '单位/部门', + value: 'deptName', + align: 'center' + }, + { + text: '职务', + value: 'dutyName', + align: 'center' + }, + { + text: '备注', + value: 'remarks', + width: 140, + align: 'center' + } + ] + if (attendanceEnable === true) { + this.columns.push( + { + text: '考勤', + value: 'isKaoqinName', + align: 'center' + }) + this.columns.push( + { + text: '统计加班', + value: 'isOt', + align: 'center' + }) + this.columns.push( + { + text: '专务', + value: 'isZhuanwu', + align: 'center' + }) + this.columns.push( + { + text: '部门正职领导', + value: 'idLeader', + align: 'center' + }) + this.columns.push( + { + text: '年假(天)', + value: 'initAnnualLeave', + align: 'center' + }) + this.columns.push( + { + text: '剩余年假(天)', + value: 'annualLeave', + align: 'center' + }) + } this.fetchSexType()// 获取性别列表 this.fetchDutyType() // 获取职务列表 this.fetchData()// 获取数据 @@ -209,7 +250,8 @@ path: '/addIris', query: { personId: row.id, - idCardNo: row.idCardNo + idCardNo: row.idCardNo, + type: 'staff' } }) }, diff --git a/src/views/memberManage/listVisitor.vue b/src/views/memberManage/listVisitor.vue index b6e0a3d..e3ffc97 100644 --- a/src/views/memberManage/listVisitor.vue +++ b/src/views/memberManage/listVisitor.vue @@ -234,17 +234,25 @@ }) }, registerIris(row) { - const token = getToken() - const id = row.id - const idCardNo = row.idCardNo - const baseUrl = getProject().register_url - if (isIE()) { - const url = baseUrl + '?token=' + token + '_id=' + id + '_idCardNo=' + idCardNo - window.open(url, '_blank') - } else { - const url = 'openIE:' + baseUrl + '?token=' + token + '_id=' + id + '_idCardNo=' + idCardNo - window.location.href = url - } + // const token = getToken() + // const id = row.id + // const idCardNo = row.idCardNo + // const baseUrl = getProject().register_url + // if (isIE()) { + // const url = baseUrl + '?token=' + token + '_id=' + id + '_idCardNo=' + idCardNo + // window.open(url, '_blank') + // } else { + // const url = 'openIE:' + baseUrl + '?token=' + token + '_id=' + id + '_idCardNo=' + idCardNo + // window.location.href = url + // } + this.$router.push({ + path: '/addIris', + query: { + personId: row.id, + idCardNo: row.idCardNo, + type: 'visitor' + } + }) }, // 查询数据 search() { diff --git a/src/views/query/queryStaff.vue b/src/views/query/queryStaff.vue index c5534f7..279818b 100644 --- a/src/views/query/queryStaff.vue +++ b/src/views/query/queryStaff.vue @@ -9,25 +9,25 @@ - - - - - - - - - - + + v-for="item in doorList" + :key="item.id" + :label="item.doorName" + :value="item.doorCode"/> + + + + + + + + + +