Commit d52a5312 by lixinming

no message

parent 7c2b2bbc
<config>
<port>7088</port>
<dbConfig>
<mysqlHost>192.168.0.109</mysqlHost>
<mysqlHost>192.168.0.105</mysqlHost>
<mysqlPort>3306</mysqlPort>
<mysqlUser>root</mysqlUser>
<mysqlPwd>123456</mysqlPwd>
......
/**
* 出勤表 逻辑
*/
import moment = require("moment");
import { getWorkLogListByTime } from "../data/admin/workinglog";
export async function getAttendanceData(year:number, month:number) {
let startTime = moment(`${year}-${month}-1 00:00:00`).format("YYYY-MM-DD HH:mm:SS");
let endTime = moment(`${year}-${month}-1 00:00:00`).add(1, 'months').format("YYYY-MM-DD HH:mm:SS");
let workLog = await getWorkLogListByTime(startTime, endTime);
//获取日历标题
let tileList = [{label:"姓名", prop:"name", index:0}];
let dataCount = moment(startTime).daysInMonth();
for (let i = 1; i <= dataCount; i++) {
let dateKey = moment(`${year}-${month}-${i} 00:00:00`).format("MM-DD");
tileList.push({label:dateKey, prop:dateKey, index:i});
// let weekDays = moment(dateKey).day();
// if (weekDays == 0 || weekDays == 6) {
// jumpMap[dateKey] = "-";
// } else {
// }
}
let dataMap = {};
workLog.forEach(info => {
let {dateKey, name, time} = info;
let key = moment(dateKey).format("MM-DD");
if (!dataMap[name]) dataMap[name] = {name};
if (!dataMap[name][key] ) dataMap[name][key] = 0;
dataMap[name][key] += time;
})
let dataList = Object.values(dataMap);
return {dataList, tileList};
}
\ No newline at end of file
import moment = require("moment");
import { addOvertime, delOvertime, findOvertime, findOvertimeApprove, findOvertimeByApprover, findOvertimeById, updateOvertime, updateOvertimeState } from "../data/admin/overtime";
import * as tools from "../util/tools";
import * as projectData from "../data/admin/project";
import { BizError } from "../util/bizError";
import { ERRORENUM } from "../config/errorEnum";
import { findDepartmentRole, findUserByUserIdNum } from "../data/admin/user";
import { findAskforleaveByUserIdAndType } from "../data/admin/askForLeave";
import { APPROVETYPE, ASKFORLEAVETYPE, STATED } from "../config/enum";
/**
* 填报加班
* @param userId 填报人
* @param time 工时
* @param projectId 项目号
* @param date 填报时间
* @param workLog 工作内容
* @returns {isSuccess:true, message:"添加成功"}
*/
export async function addOvertimeLog(userId:number, time:number, projectId:string, date:string, workLog:string ) {
let selectKey = moment(date).format("YYYY-MM-DD")+ ' 18:00:00'
//查找项目编号
let projectInfo = await projectData.findOnceProjectById(projectId);
if ( !projectInfo ) throw new BizError(ERRORENUM.不存在该项目, `${userId} 填报 ${projectId}`);
//获取个人信息
let userInfo = await findUserByUserIdNum(userId);
let approver = 0;
if (userInfo.roleId == 6) {
let approverInfo = await findDepartmentRole(5, userInfo.departmentId);
approver = approverInfo.userId;
} else {
approver = 17;//默认给张老师审批
}
let id = tools.getOvertimeId(userId);
await addOvertime(id, projectId, userId, time, selectKey, workLog, approver);
return {isSuccess:true, message:"添加成功"};
}
/**
* 查看
* @param userId 填报人
* @returns { 本周填报的工时信息, 本月工时统计 }
*/
export async function overtimeList(userId:number) {
let overtimeLog = await findOvertime(userId);
let projectMap = await projectData.findAllProjectMap();
overtimeLog.sort((a, b) => {return new Date(b.dateKey).valueOf() - new Date(a.dateKey).valueOf() });
let notApprove = 0;
let dataList = [];
let overtimeCount = 0;
overtimeLog.forEach(info => {
let {id, projectId, userId, time, dateKey, isOutside, workLog, state } = info;
notApprove += state == 0 ? time : 0;
overtimeCount += time;
let stateStr = "未审批"
if (state) stateStr = state == APPROVETYPE.通过 ? "通过" : "未通过";
dataList.push({
dateKey:moment(dateKey).format("YYYY-MM-DD"),
id, projectId, userId, time, isOutside, workLog,
projectName:projectMap[projectId],
state: stateStr
});
});
let askforleaveCount = await findAskforleaveByUserIdAndType(userId, ASKFORLEAVETYPE.调休);
let approveCount = await findOvertimeApprove(userId);
return { dataList, notApprove, available:approveCount-askforleaveCount, overtimeCount };
}
/**
* 修改加班
* @param id
* @param userId 填报人
* @param time 工时
* @param projectId 项目号
* @param date 填报时间
* @param workLog 工作内容
* @returns {isSuccess:true, message:"添加成功"}
*/
export async function updateOvertimeLog(id:string, userId:number, time:number, projectId:string, workLog:string ) {
let overTimeInfo = await findOvertimeById(id);
if (!overTimeInfo[0]) throw new BizError(ERRORENUM.目标数据已不存在)
if (overTimeInfo[0].state == STATED.) throw new BizError(ERRORENUM.已经通过审批的加班不能修改或删除);
await updateOvertime(id, projectId, time, workLog);
return {isSuccess:true, message:"添加成功"};
}
export async function deleteOvertimeLog(id:string ) {
let overTimeInfo = await findOvertimeById(id);
if (!overTimeInfo[0]) throw new BizError(ERRORENUM.目标数据已不存在)
if (overTimeInfo[0].state == STATED.) throw new BizError(ERRORENUM.已经通过审批的加班不能修改或删除);
await delOvertime(id);
return {isSuccess:true, message:"删除成功"};
}
export async function approveOverTime(id:string, type:number, notPassingStr:string) {
if (type == APPROVETYPE.不通过 && !notPassingStr) {
throw new BizError(ERRORENUM.参数错误);
}
if (type == APPROVETYPE.通过) notPassingStr = "";
let overTimeInfo = await findOvertimeById(id);
if (!overTimeInfo) throw new BizError(ERRORENUM.目标数据已不存在);
await updateOvertimeState(id, type, notPassingStr);
return {isSuccess:true, message:"操作成功"};
}
export async function approveOverTimeList(userId:number) {
let overTimeList = await findOvertimeByApprover(userId);
let dataList = [];
let peopleMap = {};
overTimeList.forEach(info => {
let {userName, projectName, id, time, dateKey, workLog} = info;
dataList.push({
dateKey:moment(dateKey).format("YYYY-MM-DD"),
userName, projectName, id, time, workLog
});
peopleMap[userName] = 1;
});
return {dataList, peopleCount:Object.keys(peopleMap).length };
}
\ No newline at end of file
import { findAllProjectIdAndName } from "../data/admin/project"
import moment = require("moment");
import { ERRORENUM } from "../config/errorEnum";
import { addProject, findAllProject, findOnceProjectById, updateProject } from "../data/admin/project"
import { BizError } from "../util/bizError";
export async function projectListForSelect() {
let projectList = await findAllProjectIdAndName();
let projectList = await findAllProject();
return {dataList:projectList}
}
export async function allProjectList() {
let projectList = await findAllProject();
let dataList = [];
projectList.forEach(info => {
dataList.push({
id:info.id,
name:info.name,
controller:info.controller||"",
controllerStr:info.controller || "无",
createTime:info.createTime ? new Date(info.createTime).valueOf() : 0
});
});
dataList.sort( (a, b) => { return new Date(b.createTime || 0).valueOf() - new Date(a.createTime || 0).valueOf() });
return {dataList};
}
export async function addProjectData(id:string, name:string, controller:string) {
let projectInfo = await findOnceProjectById(id);
if (projectInfo.id) throw new BizError(ERRORENUM.项目ID已存在);
await addProject(id, name, controller, moment().format("YYYY-MM-DD HH:mm:ss") );
return {isSuccess:true, message:"添加成功"};
}
export async function updateProjectData(id:string, name:string, controller:string) {
let projectInfo = await findOnceProjectById(id);
if (!projectInfo.id) throw new BizError(ERRORENUM.目标数据已不存在);
await updateProject(id, name, controller );
return {isSuccess:true, message:"修改成功"};
}
\ No newline at end of file
/**
* 统计主要逻辑
*/
import moment = require("moment");
import { DEPARTMENT } from "../config/enum";
import { findAllProject, findAllProjectMap, findProjectByName } from "../data/admin/project";
import { getThisMonthWorkingLogByProject, getThisMonthWorkingLogByProjectAndUserName, statsAllProjectTime, statsProjectTimeByTime, statsThisMonthProjectWorkingLog, statsThisMonthWorkingLog, statsTimeByDepartment } from "../data/admin/workinglog";
import { selectUserByDepartmentId } from "../data/admin/user";
import { findOvertimeByDepartmentId } from "../data/admin/overtime";
import { findAskForLeaveByDepartmentId } from "../data/admin/askForLeave";
export async function allProjectData() {
let projectMap = await findAllProjectMap();
let dataList = await statsAllProjectTime();
let map = {};
dataList.forEach(info => {
let {time, projectId, departmentId} = info;
if (!map[projectId]) map[projectId] = {};
if (!map[projectId][departmentId]) map[projectId][departmentId] = time;
});
let projectList = [];
for (let projectId in map) {
let info = map[projectId];
let ui = parseInt(info[DEPARTMENT.设计] || 0);
let dev = parseInt(info[DEPARTMENT.开发] || 0);
let pm = parseInt(info[DEPARTMENT.项目经理] || 0);
projectList.push({
ui, dev, pm,
count:ui+dev+pm,
projectName:projectMap[projectId],
});
}
projectList.sort((a,b) => {return b.count - a.count});
let ui = [];
let dev = [];
let pm = [];
let projectNameList = [];
let pieChartList = [];
const PieChartDataCount = 8;
projectList.forEach((info, index) => {
ui.push(info.ui);
dev.push(info.dev);
pm.push(info.pm);
projectNameList.push(info.projectName);
if (index < PieChartDataCount) {
pieChartList.push({name:info.projectName, value:info.count});
} else {
if (!pieChartList[PieChartDataCount]) pieChartList.push({name:"其他", value:info.count});
else pieChartList[PieChartDataCount].value += info.count;
}
});
return { ui, dev, pm, projectNameList, pieChartList };
}
export async function timeProjectData(st:string, et:string) {
let projectMap = await findAllProjectMap();
let dataList = await statsProjectTimeByTime(st, et);
let map = {};
dataList.forEach(info => {
let {time, projectId, departmentId} = info;
if (!map[projectId]) map[projectId] = {};
if (!map[projectId][departmentId]) map[projectId][departmentId] = time;
});
let projectList = [];
for (let projectId in map) {
let info = map[projectId];
let ui = parseInt(info[DEPARTMENT.设计] || 0);
let dev = parseInt(info[DEPARTMENT.开发] || 0);
let pm = parseInt(info[DEPARTMENT.项目经理] || 0);
projectList.push({
ui, dev, pm,
count:ui+dev+pm,
projectName:projectMap[projectId],
});
}
projectList.sort((a,b) => {return b.count - a.count});
let ui = [];
let dev = [];
let pm = [];
let projectNameList = [];
let pieChartList = [];
const PieChartDataCount = 8;
projectList.forEach((info, index) => {
ui.push(info.ui);
dev.push(info.dev);
pm.push(info.pm);
projectNameList.push(info.projectName);
if (index < PieChartDataCount) {
pieChartList.push({name:info.projectName, value:info.count});
} else {
if (!pieChartList[PieChartDataCount]) pieChartList.push({name:"其他", value:info.count});
else pieChartList[PieChartDataCount].value += info.count;
}
});
return { ui, dev, pm, projectNameList, pieChartList };
}
export async function departmentWorkinglogData(departmentId:number) {
let thisDepartmentUserList = await selectUserByDepartmentId(departmentId);
let startTime = moment().format("YYYY-MM")+'-01 00:00:00';
let worklogMap = await statsTimeByDepartment(departmentId, startTime);
let nowMs = new Date(moment().format("YYYY-MM-DD")+' 00:00:00').valueOf();
/**算应填的时间 */
let workDayCount = 0;
for (let i = 0; i < moment().daysInMonth(); i++) {
let ms = moment(startTime).add(i, 'days').valueOf();
let weekDay = moment(ms).day();
if (weekDay <=5 && weekDay !=0) {
workDayCount += 8;
}
if (ms == nowMs) break;
}
let completedList = []
let notCompletedList = [];
let nameList = [];
thisDepartmentUserList.forEach(info => {
let {name} = info;
let time = worklogMap[name] || 0;
completedList.push(time);
notCompletedList.push(workDayCount - time);
nameList.push(name);
});
return {completedList, notCompletedList, nameList};
}
export async function departmentAskForLeaveAndOverTimeData(departmentId:number) {
let thisDepartmentUserList = await selectUserByDepartmentId(departmentId);
let selectTime = moment().format("YYYY-MM")+'-01 00:00:00';
let overtimeDataMap = await findOvertimeByDepartmentId(departmentId, selectTime);
let askForLeaveMap = await findAskForLeaveByDepartmentId(departmentId, selectTime);
let overTimeList = []
let askForLeaveList = [];
let nameList = [];
thisDepartmentUserList.forEach(info => {
let {name} = info;
let overTime = overtimeDataMap[name] || 0;
let askForLeaveTime = askForLeaveMap[name] || 0;
overTimeList.push(overTime);
askForLeaveList.push(askForLeaveTime);
nameList.push(name);
});
return { overTimeList, askForLeaveList, nameList };
}
export async function departmentProjectData(departmentId:number) {
let selectTime = moment().format("YYYY-MM")+'-01 00:00:00';
let dbList = await statsThisMonthWorkingLog(departmentId, selectTime);
let dataMap = {};
dbList.forEach(info => {
let {projectName, time, userName} = info;
if (!dataMap[projectName]) dataMap[projectName] = {};
dataMap[projectName][userName] = parseInt(time);
});
let dataList = [];
for (let name in dataMap) {
let addInfo = {name, children:[]};
for (let userName in dataMap[name]) {
let value = dataMap[name][userName];
let key = `${userName}(${value})`;
addInfo.children.push({
name:key,
value
});
}
dataList.push(addInfo);
}
return { dataList };
}
export async function departmentProjectCalendarData(departmentId:number) {
let selectTime = moment().format("YYYY-MM")+'-01 00:00:00';
let workLogList = await statsThisMonthProjectWorkingLog(departmentId, selectTime);
let nowMs = new Date(moment().format("YYYY-MM-DD")+' 00:00:00').valueOf();
let dataMap = {};
let distinctMap = {};
workLogList.forEach(info => {
let {projectName, time, dateKey} = info;
distinctMap[projectName] = 1;
let key = moment(dateKey).format("YYYY-MM-DD");
if (!dataMap[key]) dataMap[key] = {};
if (!dataMap[key][projectName]) dataMap[key][projectName] = 0;
dataMap[key][projectName] += parseInt(time);
});
let dataList = [];
let scatterData = [];
for (let i = 0; i < moment().daysInMonth(); i++) {
let ms = moment(selectTime).add(i, 'days').valueOf();
let dateKey = moment(ms).format("YYYY-MM-DD");
if (ms < nowMs) {
let onceData = dataMap[dateKey];
let data = [];
for (let projectName in onceData) {
data.push({name:projectName, value:onceData[projectName]});
}
dataList.push({center:dateKey, data });
} else {
dataList.push({center:dateKey, data:[] });
}
scatterData.push([dateKey]);
}
let month = moment().format("YYYY-MM");
return {dataList, projectList:Object.keys(distinctMap), month, scatterData}
}
export async function getThisMonthProject(projectName:string, departmentId:number) {
let projectList = await findProjectByName(projectName);
if (!projectList.length) return {dataList:[]}
let projectId = projectList[0].id;
let selectTime = moment().format("YYYY-MM")+'-01 00:00:00';
let dataBaseList = await getThisMonthWorkingLogByProject(departmentId, selectTime, projectId);
let dataList = [];
dataBaseList.forEach(info => {
let {name, dateKey, workLog, time} = info;
dataList.push({name, date:moment(dateKey).format("YYYY-MM-DD"), workLog, time});
});
return {dataList}
}
export async function getThisMonthProjectAndName(projectName:string, departmentId:number, userName:string) {
let projectList = await findProjectByName(projectName);
if (!projectList.length) return {dataList:[]}
let projectId = projectList[0].id;
let selectTime = moment().format("YYYY-MM")+'-01 00:00:00';
let dataBaseList = await getThisMonthWorkingLogByProjectAndUserName(departmentId, selectTime, projectId, userName);
let dataList = [];
dataBaseList.forEach(info => {
let {name, dateKey, workLog, time} = info;
dataList.push({name, date:moment(dateKey).format("YYYY-MM-DD"), workLog, time});
});
return {dataList}
}
\ No newline at end of file
......@@ -4,8 +4,9 @@
* 包括 登录 改密码 获取权限密码
*/
import { DEPARTMENT, ROLE } from "../config/enum";
import { ERRORENUM } from "../config/errorEnum";
import { LIMITSLIST } from "../config/systemConfig";
import { FIRSTLVLIMIT, SECONDLVLIMIT } from "../config/systemConfig";
import * as userData from "../data/admin/user";
import { BizError } from "../util/bizError";
import { getToken } from "../util/tools";
......@@ -21,15 +22,24 @@ export async function login(loginId:string, pwd:number) {
await userData.updateData({token}, {loginId});
let limitsList = [LIMITSLIST.工时填报];
if (userInfo.departmentId == 7 || userInfo.departmentId == 8 || userInfo.departmentId == 6 ) {
limitsList.push(LIMITSLIST.工时管理);
}
if (userInfo.userId == 4) {
for (let i = 2; i <=7; i++) {
limitsList.push(i);
let stagingList = [];
let approveList = [];
let statsList = [];//统计
if (userInfo.departmentId == DEPARTMENT.开发 || userInfo.departmentId == DEPARTMENT.设计 ||userInfo.departmentId == DEPARTMENT.项目经理) {
stagingList = [FIRSTLVLIMIT.工时填报, FIRSTLVLIMIT.加班填报, FIRSTLVLIMIT.请假填报];
if (userInfo.roleId == ROLE.部门经理) {
stagingList.push(FIRSTLVLIMIT.数据导出);
stagingList.push(FIRSTLVLIMIT.部门工时列表)
statsList = [SECONDLVLIMIT.工时统计, SECONDLVLIMIT.部门统计];
if (userInfo.departmentId != DEPARTMENT.项目经理) approveList = [FIRSTLVLIMIT.加班审批, FIRSTLVLIMIT.请假审批];
}
} else if (userInfo.departmentId == DEPARTMENT.领导) {
stagingList = [FIRSTLVLIMIT.请假审批, FIRSTLVLIMIT.数据导出];
statsList = [SECONDLVLIMIT.工时统计, SECONDLVLIMIT.部门统计];
} else if (userInfo.departmentId == DEPARTMENT.行政 ) {
stagingList = [FIRSTLVLIMIT.加班审批, FIRSTLVLIMIT.数据导出, FIRSTLVLIMIT.立项];
} else if (userInfo.departmentId == DEPARTMENT.人事) {
stagingList = [FIRSTLVLIMIT.人事用请假情况, FIRSTLVLIMIT.请假审批, FIRSTLVLIMIT.出勤];
}
let result = { token,
......@@ -38,14 +48,20 @@ export async function login(loginId:string, pwd:number) {
departmentId:userInfo.departmentId,
name:userInfo.name,
headSculpture:`http://192.168.0.105:7088/1.png`,
limitsList
stagingList,
approveList,
statsList
};
return result;
}
export async function logout(userId:number) {
let userInfo = await userData.findUserByUserIdNum(userId);
if ( !userInfo ) throw new BizError(ERRORENUM.身份验证失败);
await userData.updateData({token:""}, {userId});
return {isSuccess:true}
}
export async function changePwd() {
......
......@@ -8,10 +8,11 @@ import moment = require("moment");
import { ERRORENUM } from "../config/errorEnum";
import * as projectData from "../data/admin/project";
import * as workinglogData from "../data/admin/workinglog";
import * as overtimeData from "../data/admin/overtime";
import { BizError } from "../util/bizError";
import * as tools from "../util/tools";
import { findDepartmentMap } from "../data/admin/department";
import { count } from "console";
import { selectUserByDepartmentId } from "../data/admin/user";
/**
......@@ -25,10 +26,9 @@ import { count } from "console";
* @returns {isSuccess:true, message:"添加成功"}
*/
export async function addWorking(userId:number, time:number, projectId:string, isOutside:boolean, date:string, workLog:string ) {
const DateKey = tools.getWorkingDateKey(date);
let selectKey = moment(date).format("YYYY-MM-DD")+ ' 18:00:00'
let timeCount = await workinglogData.findWorkingLogLengthByDateKey(userId, selectKey);
if (timeCount + time >= 24) throw new BizError(ERRORENUM.工时填报时长出错, `${timeCount + time } >= 24`);
if ((timeCount + time) > 8) throw new BizError(ERRORENUM.一天只有8小时多余的时间请填加班, `${timeCount + time } >= 24`);
// if (logCount>0) throw new BizError(ERRORENUM.重复提交, `${DateKey}工时填报重复提交`);
//查找项目编号
......@@ -45,30 +45,31 @@ export async function addWorking(userId:number, time:number, projectId:string, i
/**
* 查看本周填报的工时
* 查看本月填报的工时 工时列表
* 本周的规则是:周一到周日
* @param userId 填报人
* @returns { dataList:本周填报的工时信息, 本周工时统计 }
*/
export async function workinglogList(userId:number) {
//获取这周开始时间
// let s = moment(new Date()).weekday(0).format("YYYY-MM-DD") + ' 00:00:00';
// let e = moment(new Date()).weekday(6).format("YYYY-MM-DD") + ' 23:59:59';
let weekofday = parseInt(moment().format('d')) // 计算今天是这周第几天 周日为一周中的第一天
if (weekofday == 0) weekofday = 7;
let s = moment().subtract(weekofday,'days').format('YYYY-MM-DD') + ' 00:00:00';// 周-日期
let e = moment().add(7 - weekofday, 'days').format('YYYY-MM-DD') + ' 23:59:59';// 周日期
let s = moment().startOf('month').format('YYYY-MM-DD') + ' 00:00:00';// 周-日期
let e = moment().format('YYYY-MM-DD') + ' 23:59:59';// 周日期
let thisWeekLog = await workinglogData.findThisWeekWorkingLog(userId, s, e);
thisWeekLog.sort((a, b) => {return new Date(b.dateKey).valueOf() - new Date(a.dateKey).valueOf() });
let timeCount = 0;
let distinctMap = {};
thisWeekLog.forEach(info => {
info.dateKey = moment(info.dateKey).format("YYYY-MM-DD");
timeCount += info.time;
info.isOutside = info.isOutside == 1;
})
//获取这周结束时间
return { dataList:thisWeekLog, timeCount };
distinctMap[info.dateKey] = 1;
});
return { dataList:thisWeekLog, timeCount, dateCount:Object.keys(distinctMap).length };
}
......@@ -83,8 +84,8 @@ export async function workinglogList(userId:number) {
* @returns { isSuccess:true, message:"修改成功" }
*/
export async function updateWorkinglog(userId:number, id:string, time:number, projectId:string, isOutside:boolean, workLog:string) {
let s = moment().weekday(1).format("YYYY-MM-DD") + ' 00:00:00';
let e = moment().weekday(7).format("YYYY-MM-DD") + ' 23:59:59';
let s = moment().startOf('month').format('YYYY-MM-DD') + ' 00:00:00';// 周-日期
let e = moment().format('YYYY-MM-DD') + ' 23:59:59';// 周日期
let thisWeekLog = await workinglogData.findThisWeekWorkingLog(userId, s, e);
let checkDateKey = 0;
......@@ -101,7 +102,7 @@ export async function updateWorkinglog(userId:number, id:string, time:number, pr
count += info.time;
}
});
if (count >= 24) throw new BizError(ERRORENUM.工时填报时长出错, `${ count } >= 24`);
if (count > 8) throw new BizError(ERRORENUM.一天只有8小时多余的时间请填加班, `${ count } > 8`);
let outside = isOutside ? 1 : 0;
await workinglogData.updateWorkinglog(id, projectId, time, outside, workLog);
......@@ -141,7 +142,6 @@ export async function adminWorkLogForTime(page:number, startMs:string, endMs:str
s = moment(startMs).format("YYYY-MM-DD") + ' 00:00:00';
e = moment(endMs).format("YYYY-MM-DD") + ' 23:59:59';
}
let {dataList, count} = await workinglogData.findAllWorkingLogToPage((page-1 )*10, s, e);
......@@ -149,6 +149,7 @@ export async function adminWorkLogForTime(page:number, startMs:string, endMs:str
let result = [];
let distinctMap = {};
dataList.forEach(info => {
let year = moment(info.dateKey).year();
let month = moment(info.dateKey).month()+1;
......@@ -164,9 +165,10 @@ export async function adminWorkLogForTime(page:number, startMs:string, endMs:str
workLog:info.workLog,
time: info.time
});
distinctMap[day] = 1;
});
return {dataList:result, total:count };
return {dataList:result, total:count, dateCount:Object.keys(distinctMap).length };
}
......@@ -226,10 +228,20 @@ export async function outPutAdminWorkingLogListForTime(startMs:string, endMs:str
let workingLog = await workinglogData.findAllWorkingLog(s, e);
/**加班 */
let overtimeList = await overtimeData.findOvertimeByTime(s, e);
let overtimeMap = {};
overtimeList.forEach(info => {
let {dateKey, name, time} = info;
let dateKeyStr = moment(dateKey).format("YYYY-MM-DD");
if (!overtimeMap[dateKeyStr]) overtimeMap[dateKeyStr] = {};
if (!overtimeMap[dateKeyStr][name]) overtimeMap[dateKeyStr][name] = time;
});
const DepartmentMap = await findDepartmentMap();
let result = [
["日期年","日期月","日期日","部门","姓名","项目名称","项目编号","时长/小时","工作内容"]
["日期年","日期月","日期日","部门","姓名","项目名称","项目编号","时长/小时","工作内容", "加班时长"]
];
workingLog.forEach(info => {
......@@ -237,6 +249,9 @@ export async function outPutAdminWorkingLogListForTime(startMs:string, endMs:str
let month = moment(info.dateKey).month()+1;
let day = moment(info.dateKey).date();
let departmentName = DepartmentMap[info.departmentId];
let dateKeyStr = moment(info.dateKey).format("YYYY-MM-DD");
let overtimeCount = "";
if (overtimeMap[dateKeyStr] && overtimeMap[dateKeyStr][info.name]) overtimeCount = ""+overtimeMap[dateKeyStr][info.name];
let subList = [
year,
month,
......@@ -246,7 +261,8 @@ export async function outPutAdminWorkingLogListForTime(startMs:string, endMs:str
info.projectName,
info.projectId,
info.time,
info.workLog
info.workLog,
overtimeCount
]
result.push(subList);
});
......@@ -271,6 +287,14 @@ export async function outPutAdminWorkingLogListForProject(startMs:string, endMs:
}
let workingLog = await workinglogData.findAllWorkingLogToProject(s, e);
let overtimeList = await overtimeData.findOvertimeByTime(s, e);
let overtimeMap = {};
overtimeList.forEach(info => {
let {dateKey, name, time, projectName} = info;
if (!overtimeMap[projectName]) overtimeMap[projectName] = 0;
overtimeMap[projectName] += time;
});
let distinctMap = {};// => {name:{id:"", count:0}}
workingLog.forEach(info => {
......@@ -279,14 +303,54 @@ export async function outPutAdminWorkingLogListForProject(startMs:string, endMs:
});
let result = [
["项目名称","项目编号","时长/小时","时长/人天"]
["项目名称","项目编号","时长/小时","时长/人天", "加班时长/小时"]
];
for (let name in distinctMap) {
let {id, count} = distinctMap[name];
let dayCount = Math.ceil(count/8 * 100)/100;
result.push([name, id, count, dayCount]);
let overtimeCount = overtimeMap[name] || 0;
result.push([name, id, count, dayCount, overtimeCount]);
}
return {dataList:result, name:`【按项目分工时】.xlsx`};
}
/**
* 部门主管看的工时列表
*/
export async function departmentWorklog(departmentId:number, startTime:string, endTime:string, userId:number, page:number, projectId:string) {
let selectParam:any = {departmentId};
if (userId) selectParam.userId = userId;
if (startTime) selectParam.startTime = moment( startTime).format("YYYY-MM-DD")+" 00:00:00";
if (endTime) selectParam.endTime = moment( endTime).format("YYYY-MM-DD")+" 00:00:00";
if (projectId) selectParam.projectId = projectId;
let dbList = await workinglogData.findWorkingLogByTimeOrUserId(departmentId, selectParam, (page-1)*10);
let count = await workinglogData.findWorkingLogCountByTimeOrUserId(departmentId, selectParam);
let dataList = [];
dbList.forEach(info => {
dataList.push({
dateKey:moment(info.dateKey).format("YYYY-MM-DD"),
name:info.name,
time:info.time,
projectName : info.projectName,
isOutside:info.isOutside,
workLog:info.workLog
});
});
return {dataList, count}
}
export async function getDepartmentUserList(departmentId:number) {
let userList = await selectUserByDepartmentId(departmentId);
let dataList = [];
userList.forEach(info => {
dataList.push({
value:info.userId,
label:info.name
});
});
return {dataList};
}
\ No newline at end of file
......@@ -10,4 +10,32 @@ export enum ASKFORLEAVETYPE {
export enum WORKLOGADMINTYPE {
按项目分 = 1,
按时间分
}
\ No newline at end of file
}
export enum STATED{
= 0,
= 1,
}
export enum APPROVETYPE {
通过 = 1,
不通过 = 2
}
export enum DEPARTMENT {
财务 = 1,
设计,
开发,
项目经理,
领导,
系统管理员,
行政,
人事,
}
export enum ROLE {
系统管理员 = 1,
老板 = 4,
部门经理 = 5,
员工 = 6,
}
......@@ -9,9 +9,14 @@ export enum ERRORENUM {
参数错误,
未找到该数据,
表单校验失败,
工时填报时长出错,
一天只有8小时多余的时间请填加班,
不存在该项目,
已经通过审批的加班不能修改或删除,
已经通过审批的请假不能修改或删除,
目标数据已不存在,
项目ID已存在,
年假剩余不足请重新分配请假时间,
调休剩余不足请重新分配请假时间
}
export enum ERRORCODEENUM {
......
export enum LIMITSLIST {
export enum FIRSTLVLIMIT {
工时填报 = 1,
加班申请,
请假申请,
报销申请,
会议纪要,
工时管理,
我的任务
}
\ No newline at end of file
加班填报,
请假填报,
加班审批,
请假审批,
数据导出,
立项,
人事用请假情况,
出勤,
部门工时列表 = 10
}
export enum SECONDLVLIMIT {
工时统计 = 188,
部门统计,
}
\ No newline at end of file
/**
* 请假表
*/
/**请假 */
import { mySqlTableClass } from "../../db/mysqlClass";
import { APPROVETYPE } from "../../config/enum";
import { mysqlDB } from "../../db/mysqlInit";
const Sequelize =require('sequelize')
const MySequesize = require('../../db/mysqlInit'); //导入创建的sequelize对象
//创建StudentModel模型,该模型对应的表名是student
let askforleaveModel;
export async function initModel() {
var model = MySequesize.mysqlDB.define('askforleave',{
var model = mysqlDB.define('askforleave',{
id:{
type:Sequelize.INTEGER,
type:Sequelize.STRING(100), //表示属性的数据类型
primaryKey:true, //表示主键
allowNull:false, //表示当前列是否允许为空,false表示该列不能为空
unique:true //表示该列的值必须唯一
},
desc:{ type:Sequelize.STRING(100) }, //描述
startTime:{ type:Sequelize.DATE, allowNull:false }, //开始请假时间
endTime:{ type:Sequelize.DATE, allowNull:false }, //结束请假时间
userId:{ type:Sequelize.INTEGER, allowNull: false }, //填报人
approval:{ type:Sequelize.INTEGER, allowNull: false }, //批准
time:{ type:Sequelize.INTEGER, allowNull: false }, //剩余调休时间
day:{ type:Sequelize.INTEGER, allowNull: false }, //年假剩余天数
type:{ type:Sequelize.INTEGER, allowNull: false }, //请假类型 调休/年假/病假/事假
contractId:{ type:Sequelize.STRING(200), },//合同号
dateKey:{ type:Sequelize.DATE, allowNull:false },//填报时间
des:{ type:Sequelize.STRING(100), allowNull:false }, //事由
startTime:{ type:Sequelize.DATE, allowNull:false },//开始时间
endTime:{ type:Sequelize.DATE, allowNull:false },//结束时间
userId:{ type:Sequelize.INTEGER, allowNull: false },//填报人
approval:{ type:Sequelize.INTEGER, allowNull: false },//审批人
time:{ type:Sequelize.INTEGER, allowNull: false},//请假时长 小时
day:{ type:Sequelize.INTEGER, allowNull: false},//请假时长 天
type:{ type:Sequelize.INTEGER, allowNull: false},//类型
dateKey:{ type:Sequelize.DATE, allowNull:false },//填报日期
state:{ type:Sequelize.INTEGER, allowNull: false},//状态
notPassing:{ type:Sequelize.STRING(100), allowNull:false }, //不通过原因
},{
freezeTableName:true, //true表示使用给定的表名,false表示模型名后加s作为表名
timestamps:false //true表示给模型加上时间戳属性(createAt、updateAt),false表示不带时间戳属性
});
// //同步数据库,force的值为false,表若存在则先删除后创建,force的值为true表示表若存在则不创建
askforleaveModel = await model.sync({});
}
export async function initAskforleave(id:string, des:string, startTime:string, endTime:string, userId:number, approval:number, time:number, day:number, type:number, dateKey:string, state:number) {
await askforleaveModel.create({id, des, startTime, endTime, userId, approval, time, day, type, dateKey, notPassing:"", state});
}
/**
* 添加请假记录
* @param desc
* @param startTime
* @param endTime
* @param userId
* @param time
* @param type
* @param day
* 添加请假
*/
export async function addData(des:string, startTime:Date, endTime:Date, userId:string, type:number, dateKey:Date) {
await askforleaveModel.create({des, startTime, endTime, userId, type, dateKey});
export async function addAskforleave(id:string, des:string, startTime:string, endTime:string, userId:number, approval:number, time:number, day:number, type:number, dateKey:string) {
await askforleaveModel.create({id, des, startTime, endTime, userId, approval, time, day, type, dateKey, notPassing:"", state:0});
}
/**
* 获取所有请假记录
* @param userId
* @returns
*/
export async function findAllAskforLeave(userId:string) {
let sql = `select askforleave.startTime, askforleave.endTime, askforleave.userId, askforleave.approval, askforleave.time, askforleave.type, askforleave.desc from askforleave `
if (userId) {
sql += ` where userId = "${userId}"`;
}
let res = await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT });
return res;
export async function findAskforleaveByUserIdAndType(userId:number, type:number) {
let list = await askforleaveModel.findAll({
where:{ userId, type, state:APPROVETYPE.通过 }
});
let count = 0;
list.forEach(info => {
let {day, time} = info;
if (day!=0) count += day*8;
if (time != 0) count += time;
});
return count;
}
export async function findAskForLeaveListByUserId(userId:number) {
return await askforleaveModel.findAll({where:{userId}});
}
export async function findAskForLeaveListById(id:string) {
return await askforleaveModel.findAll({where:{id}});
}
export async function delAskForLeaveListById(id:string) {
await askforleaveModel.destroy({where:{id}});
}
export async function findAskForLeaveListByTimeToPage(param, startNum:number, endNum:number) {
let sql = `select users.name, askforleave.state, askforleave.startTime, askforleave.endTime, askforleave.day, askforleave.time, askforleave.type,askforleave.des, askforleave.approval from askforleave INNER JOIN users on users.userId = askforleave.userId `;
let paramList = Object.keys(param)
if (paramList.length) {
sql += ' where ';
for (let i= 0; i < paramList.length; i++) {
let key = paramList[i];
if (key == "startTime") {
sql += `askforleave.startTime > '${param.startTime}' `;
}
if (key == "endTime") {
sql += `askforleave.endTime < '${param.endTime}' `;
}
if (key == "userId") {
sql += `users.userId = ${param.userId}`;
}
if (i != paramList.length -1) {
sql += ' and '
}
}
}
sql += ` ORDER BY askforleave.dateKey DESC limit ${startNum}, ${endNum}`;
return await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
}
export async function findAskForLeaveListByTime(param) {
let sql = `select users.name, askforleave.state, askforleave.startTime, askforleave.endTime, askforleave.day, askforleave.time, askforleave.type,askforleave.des, askforleave.approval from askforleave INNER JOIN users on users.userId = askforleave.userId `;
let paramList = Object.keys(param)
if (paramList.length) {
sql += ' where ';
for (let i= 0; i < paramList.length; i++) {
let key = paramList[i];
if (key == "startTime") {
sql += `askforleave.startTime > '${param.startTime}' `;
}
if (key == "endTime") {
sql += `askforleave.endTime < '${param.endTime}' `;
}
if (key == "userId") {
sql += `users.userId = ${param.userId}`;
}
if (i != paramList.length -1) {
sql += ' and '
}
}
}
sql += ` ORDER BY askforleave.dateKey DESC`;
return await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
}
export async function findAskForLeaveCountByTime(param) {
let sql = `select count(*) as count from askforleave`;
let paramList = Object.keys(param)
if (paramList.length) {
sql += ' where ';
for (let i= 0; i < paramList.length; i++) {
let key = paramList[i];
if (key == "startTime") {
sql += `startTime > '${param.startTime}' `;
}
if (key == "endTime") {
sql += `endTime < '${param.endTime}' `;
}
if (key == "userId") {
sql += `userId = ${param.userId}`;
}
if (i != paramList.length -1) {
sql += ' and '
}
}
}
let countData = await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
return countData[0].count;
}
export async function updateAskforleave(id:string, des:string, startTime:string, endTime:string, time:number, day:number, type:number) {
let updateInfo = {des, startTime, endTime, time, day, type};
await askforleaveModel.update(updateInfo, {where:{id}});
}
export async function findAskForLeaveListByApprover(userId:number) {
let sql = `select users.name as userName, askforleave.id, askforleave.startTime, askforleave.endTime, askforleave.day, askforleave.time, askforleave.type, askforleave.des from askforleave INNER JOIN users on `;
sql += `askforleave.userId = users.userId where askforleave.approval = ${userId} and askforleave.state = 0`
return await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
}
export async function updateAskForLeaveState(id:string, state:number, notPassing?) {
let updateInfo:any = {state};
if (notPassing) updateInfo.notPassing = notPassing;
await askforleaveModel.update(updateInfo, {where:{id}});
}
export async function findAskForLeaveByDepartmentId(departmentId:number, selectTime:string) {
let sql = `select users.name, sum(askforleave.time) as time, sum(askforleave.day) as day from users LEFT JOIN askforleave on askforleave.userId = users.userId WHERE users.departmentId = ${departmentId} and (askforleave.startTime > "${selectTime}" or askforleave.endTime > "${selectTime}") GROUP BY users.name `
let dataList = await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
let map = {};
dataList.forEach(info => {
map[info.name] = parseInt(info.time) + (parseInt(info.day) * 8 );
});
return map;
}
\ No newline at end of file
/**
* 部门表
*/
import { mySqlTableClass } from "../../db/mysqlClass";
const Sequelize =require('sequelize')
const MySequesize = require('../../db/mysqlInit'); //导入创建的sequelize对象
//创建StudentModel模型,该模型对应的表名是student
......@@ -29,7 +25,10 @@ export async function initModel() {
}
/**
* 查询所有部门
* @returns
*/
export async function findDepartmentMap() {
let dataList = await departmentModel.findAll({ });
......
/**
* 加班
* 加班
*/
import { mySqlTableClass } from "../../db/mysqlClass";
import { mysqlDB } from "../../db/mysqlInit";
const Sequelize =require('sequelize')
//创建StudentModel模型,该模型对应的表名是student
let overtimeModel;
export async function initModel() {
var model = mysqlDB.define('overtime',{
id:{
type:Sequelize.STRING(100), //表示属性的数据类型
primaryKey:true, //表示主键
allowNull:false, //表示当前列是否允许为空,false表示该列不能为空
unique:true //表示该列的值必须唯一
},
projectId:{ type:Sequelize.STRING(100), allowNull:false }, //项目号
userId:{ type:Sequelize.INTEGER, allowNull: false },//填报人
time:{ type:Sequelize.INTEGER, allowNull:false },//时长
dateKey:{ type:Sequelize.DATE, allowNull:false },//填报时间
state:{ type:Sequelize.INTEGER },//状态 0=否 1=通过 2=不通过
workLog:{ type:Sequelize.STRING(200)}, //工作内容
approver:{ type:Sequelize.INTEGER, allowNull: false },//审批人
notPassing:{type:Sequelize.STRING(200)},//不通过理由
},{
freezeTableName:true, //true表示使用给定的表名,false表示模型名后加s作为表名
timestamps:false //true表示给模型加上时间戳属性(createAt、updateAt),false表示不带时间戳属性
});
// //同步数据库,force的值为false,表若存在则先删除后创建,force的值为true表示表若存在则不创建
overtimeModel = await model.sync({});
}
/**
* 添加工时记录
* @param id 属性的数据类型
* @param projectId 项目号
* @param userId 填报人
* @param time 工时
* @param dateKey 填报时间
* @param isOutside 是否外出 0=否 1=是
* @param workLog 工作内容
*/
export async function addOvertime(id:string, projectId:string, userId:number, time:number, dateKey:string, workLog:string, approver:number) {
await overtimeModel.create({id, projectId, userId, time, dateKey, state:0, workLog, approver});
}
/**表结构 */
const TableConfig = {
id:"string",//
projectId:"string",//项目id
userId:"number",//用户id
dateKey:"date",//日期缩写
time:"number",//时长
isPassed:"number",//是否通过
approver:"number"//审核id
export async function findOvertimeById(id:string) {
return await overtimeModel.findAll({
where:{id}
});
}
/**sql */
enum SQLENUM {
export async function findOvertime(userId:number) {
return await overtimeModel.findAll({
where:{userId}
});
}
/**多表sql */
enum MORETABLESQLENUM {
export async function findOvertimeApprove(userId:number) {
let list = await overtimeModel.findAll({
where:{userId, state:1}
});
let count = 0;
list.forEach(info => {
let {time} = info;
count += time;
});
return count;
}
export async function updateOvertime(id:string, projectId:string, time:number, workLog:string) {
await overtimeModel.update({projectId, time, workLog}, {where:{id}});
}
let departmentModel;
export async function delOvertime(id:string) {
await overtimeModel.destroy({where:{id}});
}
export function initModel() {
departmentModel = new mySqlTableClass("overtime", TableConfig, SQLENUM, MORETABLESQLENUM);
export async function updateOvertimeState(id:string, state:number, notPassing?) {
let updateInfo:any = {state};
if (notPassing) updateInfo.notPassing = notPassing;
await overtimeModel.update(updateInfo, {where:{id}});
}
export async function findOvertimeByApprover(userId:number) {
let sql = `select users.name as userName, project.name as projectName, overtime.id, overtime.time, overtime.dateKey, overtime.workLog from overtime INNER JOIN users on `;
sql += `overtime.userId = users.userId INNER JOIN project on project.id = overtime.projectId where overtime.approver = ${userId} and overtime.state = 0`
return await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
}
export async function initOvertime(id:string, projectId:string, userId:number, time:number, dateKey:string, workLog:string, approver:number, state:number) {
await overtimeModel.create({id, projectId, userId, time, dateKey, state, workLog, approver, notPassing:""});
}
export async function findOvertimeByDepartmentId(departmentId:number, startTime:string) {
let sql = `select users.name, sum(overtime.time) as time from users LEFT JOIN overtime on overtime.userId = users.userId WHERE users.departmentId = ${departmentId} and overtime.dateKey >"${startTime}" GROUP BY users.name`
let dataList = await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
let map = {};
dataList.forEach(info => {
map[info.name] = info.time;
});
return map;
}
export async function findOvertimeByTime(startTime:string, endTime:string) {
let sql = `select users.name, project.name as projectName, overtime.time, overtime.dateKey from users LEFT JOIN overtime on overtime.userId = users.userId inner join project on project.id = overtime.projectId `
if (startTime && endTime) {
sql += ` where overtime.dateKey > "${startTime}" and overtime.dateKey < "${endTime}"`;
}
let dataList = await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
return dataList;
}
\ No newline at end of file
......@@ -2,8 +2,6 @@
* 项目表
*/
import { mySqlTableClass } from "../../db/mysqlClass";
const Sequelize =require('sequelize')
const MySequesize = require('../../db/mysqlInit'); //导入创建的sequelize对象
//创建StudentModel模型,该模型对应的表名是student
......@@ -19,17 +17,22 @@ export async function initModel() {
},
name:{ type:Sequelize.STRING(100), allowNull:false },
contractId:{ type:Sequelize.STRING(200), },//合同号
controller:{ type:Sequelize.STRING(200) }, //项目经理
createTime:{ type:Sequelize.DATE},// 创建时间
},{
freezeTableName:true, //true表示使用给定的表名,false表示模型名后加s作为表名
timestamps:false //true表示给模型加上时间戳属性(createAt、updateAt),false表示不带时间戳属性
});
// //同步数据库,force的值为false,表若存在则先删除后创建,force的值为true表示表若存在则不创建
projectModel = await model.sync({});
}
/**
* 查询所有项目
* @returns
*/
export async function findAllProjectMap() {
let projectList = await projectModel.find({});
let projectList = await projectModel.findAll({});
let result = {};
projectList.forEach(info => {
......@@ -40,6 +43,11 @@ export async function findAllProjectMap() {
}
/**
* 根据项目id查询项目
* @param projectId
* @returns
*/
export async function findOnceProjectById(projectId:string) {
let dataList = await projectModel.findAll({
where:{id:projectId}
......@@ -47,9 +55,35 @@ export async function findOnceProjectById(projectId:string) {
return dataList[0] || {};
}
export async function findAllProjectIdAndName() {
/**
* 查询所有项目的id和名称
* @returns
*/
export async function findAllProject() {
let dataList = await projectModel.findAll({
where:{}
});
return dataList;
}
/**
* 查询项目名称
* @returns
*/
export async function findProjectByName(projectName:string) {
let dataList = await projectModel.findAll({
where:{name:projectName}
});
return dataList;
}
export async function addProject(id:string, name:string, controller:string, createTime:string) {
await projectModel.create({id, name, controller, createTime });
}
export async function updateProject(id:string, name:string, controller:string) {
await projectModel.update({name, controller }, {where:{id}});
}
\ No newline at end of file
/**
* 角色表
*/
import { mySqlTableClass } from "../../db/mysqlClass";
/**表结构 */
const TableConfig = {
id:"number",//
nameName:"string",//角色名称
}
/**sql */
enum SQLENUM {
}
/**多表sql */
enum MORETABLESQLENUM {
}
let roleModel;
export function initModel() {
roleModel = new mySqlTableClass("role", TableConfig, SQLENUM, MORETABLESQLENUM);
}
......@@ -2,7 +2,7 @@
* 用户表
*/
import { mySqlTableClass } from "../../db/mysqlClass";
import { mysqlDB } from "../../db/mysqlInit";
const Sequelize =require('sequelize')
const MySequesize = require('../../db/mysqlInit'); //导入创建的sequelize对象
......@@ -30,9 +30,23 @@ export async function initModel() {
// //同步数据库,force的值为false,表若存在则先删除后创建,force的值为true表示表若存在则不创建
userModel = await model.sync({});
// userModel = await instantiateModel('users', {
// userId:{type:String, mainKey:true},
// name:{type:String, allowNull:true},
// loginId:{ type:String},//登录id
// pwd:{ type:String},//密码
// roleId:{ type:Number},//角色id 外键角色表id
// exchangeTime:{ type:Number},//调休余额
// annualLeave:{ type:Number},//年假余额
// departmentId:{ type:Number },//部门id 外键部门表id
// token:{ type:String },
// });
}
/**
* 登录账号查询用户
* @param loginId
......@@ -53,12 +67,43 @@ export async function findUserByUserId(userId:string) {
}
/**
* 登录账号查询用户
* @param loginId
*/
export async function findUserByUserIdNum(userId:number) {
let dataList = await userModel.findAll({ where:{userId}});
return dataList[0] || {};
}
/**
* 根据登录信息
* @param roleId
* @param departmentId
*/
export async function findDepartmentRole(roleId:number, departmentId:number) {
let dataList = await userModel.findAll({ where:{roleId, departmentId}});
return dataList[0] || {};
}
/**
* 修改数据
* @param param 修改内容
* @param select 修改条件
* @returns
*/
export async function updateData(param:object, select:object) {
let res = await userModel.update(param, {where:select});
console.log();
await userModel.update(param, {where:select});
}
export async function selectUserByDepartmentId(departmentId:number) {
return await userModel.findAll({ where:{departmentId}});
}
export async function selectMemberUser() {
let sql = `select * from users where departmentId >= 2 and departmentId <=4`;
return await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
}
......@@ -144,9 +144,8 @@ export async function findAllWorkingLogToProject(startTime:string, endTime:strin
* @param workLog 工作内容
*/
export async function addWorkingLog(id:string, projectId:string, userId:number, time:number, dateKey:string, isOutside:number, workLog:string) {
let sql = `INSERT INTO workinglog ( id, projectId, userId, time, dateKey, isOutside, workLog) values `;
sql += `( "${id}", "${projectId}", "${userId}", "${time}", "${dateKey}", "${isOutside}", "${workLog}" )`;
let res = await mysqlDB.insert({})
// let sql = `INSERT INTO workinglog ( id, projectId, userId, time, dateKey, isOutside, workLog) values `;
// sql += `( "${id}", "${projectId}", "${userId}", "${time}", "${dateKey}", "${isOutside}", "${workLog}" )`;
await workinglogModel.create({id, projectId, userId, time, dateKey, isOutside, workLog});
}
......@@ -185,4 +184,126 @@ export async function findWorkingLogById(id:string) {
*/
export async function deleteWorkingLogById(id:string) {
return await workinglogModel.destroy({where:{id}});
}
export async function statsAllProjectTime() {
let sql = `select workinglog.projectId, users.departmentId, sum(workinglog.time) as time from users INNER JOIN workinglog on workinglog.userId = users.userId GROUP BY users.departmentId, workinglog.projectId`;
let res = await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } )
return res;
}
export async function statsProjectTimeByTime(st:string, et:string) {
let sql = `select workinglog.projectId, users.departmentId, sum(workinglog.time) as time from users INNER JOIN workinglog on workinglog.userId = users.userId where workinglog.dateKey > '${st}' and workinglog.dateKey < '${et}' GROUP BY users.departmentId, workinglog.projectId `;
let res = await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } )
return res;
}
export async function statsTimeByDepartment(departmentId:number, st:string) {
let sql = `select users.name, sum(workinglog.time) as time from users INNER JOIN workinglog on workinglog.userId = users.userId WHERE users.departmentId = ${departmentId} and dateKey>"${st}" GROUP BY users.name`;
let data = await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
let map = {};
data.forEach(info => {
map[info.name] = info.time;
});
return map;
}
export async function statsThisMonthWorkingLog(departmentId:number, st:string) {
let sql = `select project.name as projectName, users.name as userName, sum(workinglog.time) as time from users INNER JOIN workinglog on workinglog.userId = users.userId INNER JOIN project on project.id = workinglog.projectId where users.departmentId = ${departmentId} and workinglog.dateKey >"${st}" GROUP BY project.name, users.name`;
return await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
}
export async function statsThisMonthProjectWorkingLog(departmentId:number, st:string) {
let sql = `select project.name as projectName, workinglog.time, workinglog.dateKey from project LEFT JOIN workinglog on workinglog.projectId= project.id INNER JOIN users on users.userId = workinglog.userId where workinglog.dateKey > "${st}" and users.departmentId = ${departmentId}`;
return await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
}
export async function getThisMonthWorkingLogByProject(departmentId:number, st:string, projectId:string) {
let sql = `select workinglog.dateKey, workinglog.time, workinglog.workLog, users.name from users INNER JOIN workinglog on workinglog.userId = users.userId where users.departmentId = ${departmentId} and workinglog.dateKey > "${st}" and workinglog.projectId = "${projectId}"`;
return await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
}
export async function getThisMonthWorkingLogByProjectAndUserName(departmentId:number, st:string, projectId:string, userName:string) {
let sql = `select workinglog.dateKey, workinglog.time, workinglog.workLog, users.name from users INNER JOIN workinglog on workinglog.userId = users.userId where users.departmentId = ${departmentId} and workinglog.dateKey > "${st}" and workinglog.projectId = "${projectId}" and users.name = "${userName}"`;
return await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
}
export async function getWorkLogListByTime(st:string, et:string) {
let sql = `select workinglog.time, users.name, workinglog.dateKey from users INNER JOIN workinglog on workinglog.userId = users.userId where workinglog.dateKey >"${st}" and workinglog.dateKey <"${et}"`;
return await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
}
/**
* 获取本周工时记录
* @param userId
* @param startTime
* @param endTime
* @returns
*/
export async function findWorkingLogByTimeOrUserId(departmentId:number, param, startNumber) {
let sql = `select workinglog.workLog, users.name as name, workinglog.id as id, project.name as projectName, workinglog.time, workinglog.dateKey, `;
sql += `workinglog.isOutside from workinglog INNER JOIN project on project.id = workinglog.projectId inner join users on users.userId = workinglog.userId where users.departmentId=${departmentId} `;
let paramList = Object.keys(param)
if (paramList.length) {
for (let i= 0; i < paramList.length; i++) {
let key = paramList[i];
if (key == "startTime") {
sql += `workinglog.dateKey > '${param.startTime}' `;
}
if (key == "endTime") {
sql += `workinglog.dateKey < '${param.endTime}' `;
}
if (key == "userId") {
sql += `users.userId = ${param.userId}`;
}
if (key == "projectId") {
sql += `workinglog.projectId = '${param.projectId}'`;
}
if (i != paramList.length -1) {
sql += ' and '
}
}
}
sql += ` ORDER BY workinglog.dateKey DESC limit ${startNumber}, ${10}`;
let res = await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
return res;
}
/**
* 获取本周工时记录数据数
* @param userId
* @param startTime
* @param endTime
* @returns
*/
export async function findWorkingLogCountByTimeOrUserId(departmentId:number, param) {
let sql = `select count(*) as count from workinglog inner join users on users.userId = workinglog.userId where users.departmentId=${departmentId} `;
let paramList = Object.keys(param);
if (paramList.length) {
for (let i= 0; i < paramList.length; i++) {
let key = paramList[i];
if (key == "startTime") {
sql += `workinglog.dateKey > '${param.startTime}' `;
}
if (key == "endTime") {
sql += `workinglog.dateKey < '${param.endTime}' `;
}
if (key == "userId") {
sql += `users.userId = ${param.userId}`;
}
if (key == "projectId") {
sql += `workinglog.projectId = '${param.projectId}'`;
}
if (i != paramList.length -1) {
sql += ' and '
}
}
}
let countData = await mysqlDB.query(sql, { type: mysqlDB.QueryTypes.SELECT } );
return countData[0].count;
}
\ No newline at end of file
......@@ -2,6 +2,8 @@ import * as workinglogData from "../data/admin/workinglog";
import * as projectData from "../data/admin/project";
import * as userData from "../data/admin/user";
import * as departmentData from "../data/admin/department";
import * as overtimeData from "../data/admin/overtime";
import * as askForLeaveData from "../data/admin/askForLeave";
export async function initTable() {
......@@ -9,4 +11,6 @@ export async function initTable() {
await projectData.initModel();
await userData.initModel();
await departmentData.initModel();
await overtimeData.initModel();
await askForLeaveData.initModel();
}
\ No newline at end of file
import { mysqlDB } from "./mysqlInit";
/**
* mysql数据表实体类
*/
export class mySqlTableClass {
file;//字段对象
tableName;//表名
sql;//sql
moreTableSql;//多表sql
constructor(tableName:string, file?, sqlEnum?, moreSqlEnum?) {
this.tableName = tableName;
this.file = file || {};
this.sql = sqlEnum || {};
this.moreTableSql = moreSqlEnum || {};
}
/**
* 查询单表
* @param param 条件参数
* @param res 指定返回
*/
async find(param, res?) {
let sqlStr = 'select ';
if (!res) sqlStr += '* ';
else {
res.forEach((itemStr, index) => {
sqlStr += itemStr;
if (index == res.length - 1) sqlStr += ' ';
else sqlStr += ', ';
});
}
sqlStr += `from ${this.tableName} `;
const KeyLength = Object.keys(param).length;
let valueList = [];
if ( KeyLength > 0) {
sqlStr += 'where ';
let index = 0;
for (let key in param) {
sqlStr += `${key} = ?`;
valueList.push(param[key]);
if (index < KeyLength - 1) sqlStr += 'and ';
else sqlStr += ' ';
index += 1;
}
const Sequelize = require('sequelize');
export async function instantiateModel(tableName:string, config) {
let tablesBase = {};
for ( let key in config) {
let info = config[key];
let keysValue:any = {type:null};
if (typeof config.type.isFinite == "function") {
keysValue.type = Sequelize.INTEGER;
} else if (typeof config.type.concat == "function") {
keysValue.type = Sequelize.STRING(200);
} else if (typeof config.type.getFullYear == "function") {
keysValue.type = Sequelize.DATE;
}
return await mysqlDB.selectData(sqlStr, valueList);
}
/**
* 查询单个
* @param param
* @param res
* @returns
*/
async findOne(param, res?) {
let sqlStr = 'select ';
if (!res) sqlStr += '* ';
else {
res.forEach((itemStr, index) => {
sqlStr += itemStr;
if (index == res.length - 1) sqlStr += ' ';
else sqlStr += ', ';
});
if (info.mainKey) {
keysValue.primaryKey = true; //表示主键
keysValue.allowNull = false; //表示当前列是否允许为空,false表示该列不能为空
keysValue.unique = true; //表示该列的值必须唯一
}
sqlStr += `from ${this.tableName} `;
const KeyLength = Object.keys(param).length;
let valueList = [];
if ( KeyLength > 0) {
sqlStr += 'where ';
let index = 0;
for (let key in param) {
sqlStr += `${key} = ?`;
valueList.push(param[key]);
if (index < KeyLength - 1) sqlStr += 'and ';
else sqlStr += ' ';
index += 1;
}
if (info.allowNull) {
keysValue.allowNull = info.allowNull;
}
return await mysqlDB.findOne(sqlStr, valueList);
}
/**
* 修改
* @param table
* @param param 修改信息
* @param contition 条件
* @returns
*/
async update(param:object, contition:object) {
return await mysqlDB.updateData(this.tableName, param, contition);
tablesBase[key] = keysValue;
}
/**
* 删除
* @param paramater
* @returns
*/
async delete(paramater:object) {
return await mysqlDB.deleteData(this.tableName, paramater);
let defaultConfig = {
freezeTableName:true,
timestamps:false,
}
/**
* 创建
* @param param
* @returns
*/
async install(param:object) {
return await mysqlDB.createData(this.tableName, param);
}
let model = Sequelize.mysqlDB.define(tableName, tablesBase, defaultConfig);
/**
* 执行sql
* @param sql
*/
async query(sql:string, param) {
return await mysqlDB.queryData(sql, param);
}
}
\ No newline at end of file
return await model.sysc({});
}
import { systemConfig } from "../config/serverConfig";
import { initTable } from "./initTable";
const mysql = require('mysql2');
//导入sequelize模块
const Sequelize = require('sequelize');
......
......@@ -7,6 +7,7 @@ async function lanuch() {
await initMysqlDB();
httpServer.createServer(systemConfig.port);
console.log('This indicates that the server is started successfully.');
// await initData();
}
lanuch();
\ No newline at end of file
......@@ -5,23 +5,109 @@
import * as asyncHandler from 'express-async-handler';
import * as askForLeaveBiz from '../biz/askForLeave';
import { checkFuHuaQiToken } from '../middleware/user';
import { eccReqParamater } from '../tools/eccParam';
export function setRouter(httpServer) {
httpServer.post('/askforleave/add', checkFuHuaQiToken, asyncHandler(add));
httpServer.post('/askforleave/list', checkFuHuaQiToken, asyncHandler(list));
httpServer.post('/askforleave/del', checkFuHuaQiToken, asyncHandler(del));
httpServer.post('/askforleave/update', checkFuHuaQiToken, asyncHandler(update));
/**审批 */
httpServer.post('/askforleave/approve', checkFuHuaQiToken, asyncHandler(approve));
httpServer.post('/askforleave/approvelist', checkFuHuaQiToken, asyncHandler(approveList));
/**人事用请假列表 */
httpServer.post('/askforleave/personnel/list', checkFuHuaQiToken, asyncHandler(personnelList));
httpServer.post('/askforleave/personnel/membernamelist', checkFuHuaQiToken, asyncHandler(memberNameList));
httpServer.post('/askforleave/personnel/output', checkFuHuaQiToken, asyncHandler(outPutData));
}
async function add(req, res) {
let userId = req.headers.userid;
let { day, time, des, startTime, endTime, type} = req.body;
let result = await askForLeaveBiz.askForLeave(userId, des, startTime, endTime, type, time, day);
let reqConf = {des: 'String', startTime: 'String', endTime: 'String', type:'Number', day:"Number", time:"Number"};
let { des, startTime, endTime, type, day, time } = eccReqParamater(reqConf, req.body, ["day", "time"]);
let result = await askForLeaveBiz.addAskForLeaveLog(userId, des, startTime, endTime, type, day, time);
res.success(result);
}
async function list(req, res) {
let userId = req.headers.userid;
let result = await askForLeaveBiz.myAskForLeaveList(userId);
res.success(result);
}
\ No newline at end of file
}
/**
* 删除
* @param req
* @param res
*/
async function del(req, res) {
let userId = req.headers.userid;
let { id } = req.body;
let result = await askForLeaveBiz.deleteAskForLeave(id);
res.success(result);
}
/**
* 修改
* @param req
* @param res
*/
async function update(req, res) {
let userId = req.headers.userid;
let reqConf = {id:'String', des: 'String', startTime: 'String', endTime: 'String', type:'Number', day:"Number", time:"Number"};
let { id, des, startTime, endTime, type, day, time } = eccReqParamater(reqConf, req.body, ["day", "time"]);
let result = await askForLeaveBiz.updateAskForLeaveLog(id, userId, des, startTime, endTime, type, day, time);
res.success(result);
}
async function approve(req, res) {
let userId = req.headers.userid;
let reqConf = {id:"String", type:"Number", notPassingStr:"String"};
let {id, type, notPassingStr} = eccReqParamater(reqConf, req.body);
let result = await askForLeaveBiz.approveAskForLeave(id, type, notPassingStr);
res.success(result);
}
async function approveList(req, res) {
let userId = req.headers.userid;
let result = await askForLeaveBiz.approveAskForLeaveList(userId);
res.success(result);
}
async function personnelList(req, res) {
// let userId = req.headers.userid;
let reqConf = {page:"Number", startTime:"String", endTime:"String", userId:"Number"};
let {page, userId, startTime, endTime} = eccReqParamater(reqConf, req.body, ["startTime", "endTime", "userId"]);
let result = await askForLeaveBiz.getPersonnelAFLList(page, userId, startTime, endTime);
res.success(result);
}
async function memberNameList(req, res) {
let userId = req.headers.userid;
let result = await askForLeaveBiz.getMemberNameList();
res.success(result);
}
async function outPutData(req, res) {
let reqConf = { startTime:"String", endTime:"String", userId:"Number"};
let {userId, startTime, endTime} = eccReqParamater(reqConf, req.body, ["startTime", "endTime", "userId"]);
let result = await askForLeaveBiz.getOutPutPersonnelAFLList(userId, startTime, endTime);
res.success(result);
}
/**
* 出勤路由
*/
import * as asyncHandler from 'express-async-handler';
import { checkFuHuaQiToken } from '../middleware/user';
import * as attendanceBiz from '../biz/attendance';
import { eccReqParamater } from '../tools/eccParam';
export function setRouter(httpServer) {
httpServer.post('/attendance/find', checkFuHuaQiToken, asyncHandler(find));
httpServer.post('/attendance/output', checkFuHuaQiToken, asyncHandler(outPut));
}
async function find(req, res) {
let reqConf = { year:"Number", month:"Number"};
let {year, month} = eccReqParamater(reqConf, req.body, []);
let result = await attendanceBiz.getAttendanceData(year, month);
res.success(result);
}
async function outPut(req, res) {
let reqConf = { year:"Number", month:"Number"};
let {year, month} = eccReqParamater(reqConf, req.body, []);
let result = await attendanceBiz.getAttendanceData(year, month);
res.success(result);
}
/**
* 加班路由
*/
import * as asyncHandler from 'express-async-handler';
import { checkFuHuaQiToken } from '../middleware/user';
import { addOvertimeLog, approveOverTime, approveOverTimeList, deleteOvertimeLog, overtimeList, updateOvertimeLog } from '../biz/overtime';
import { eccReqParamater } from '../tools/eccParam';
export function setRouter(httpServer) {
httpServer.post('/overtime/find', checkFuHuaQiToken, asyncHandler(find));
httpServer.post('/overtime/add', checkFuHuaQiToken, asyncHandler(add));
httpServer.post('/overtime/del', checkFuHuaQiToken, asyncHandler(del));
httpServer.post('/overtime/update', checkFuHuaQiToken, asyncHandler(update));
httpServer.post('/overtime/approve', checkFuHuaQiToken, asyncHandler(approve));
httpServer.post('/overtime/approvelist', checkFuHuaQiToken, asyncHandler(approveList));
}
/**
* 工时管理 查询填报的工时
* @param req
* @param res
*/
async function find(req, res) {
let userId = req.headers.userid;
let result = await overtimeList(userId);
res.success(result);
}
/**
*
* @param req 工时管理 添加
* @param res
*/
async function add(req, res) {
let userId = req.headers.userid;
let reqConf = {time: 'Number', projectId: 'String', date:'String', workLog:"String"};
let { time, projectId, date, workLog} = eccReqParamater(reqConf, req.body, ['workLog']);
let result = await addOvertimeLog(userId, time, projectId, date, workLog);
res.success(result);
}
/**
* 工时管理 删除
* @param req
* @param res
*/
async function del(req, res) {
let userId = req.headers.userid;
let { id } = req.body;
let result = await deleteOvertimeLog(id);
res.success(result);
}
/**
* 工时管理 修改
* @param req
* @param res
*/
async function update(req, res) {
let userId = req.headers.userid;
let reqConf = {id:"String", time: 'Number', projectId: 'String', workLog:"String"};
let {id, time, projectId, workLog} = eccReqParamater(reqConf, req.body);
let result = await updateOvertimeLog(id, userId, time, projectId, workLog);
res.success(result);
}
async function approve(req, res) {
let userId = req.headers.userid;
let reqConf = {id:"String", type:"Number", notPassingStr:"String"};
let {id, type, notPassingStr} = eccReqParamater(reqConf, req.body);
let result = await approveOverTime(id, type, notPassingStr);
res.success(result);
}
async function approveList(req, res) {
let userId = req.headers.userid;
let result = await approveOverTimeList(userId);
res.success(result);
}
\ No newline at end of file
/**
* 项目路由
*/
import * as asyncHandler from 'express-async-handler';
import { checkFuHuaQiToken } from '../middleware/user';
import * as projectBiz from '../biz/project';
import { eccReqParamater } from '../tools/eccParam';
export function setRouter(httpServer) {
httpServer.post('/project/find', checkFuHuaQiToken, asyncHandler(find));
httpServer.post('/project/add', checkFuHuaQiToken, asyncHandler(add));
httpServer.post('/project/update', checkFuHuaQiToken, asyncHandler(update));
}
/**
* 工时管理 查询填报的工时
* @param req
* @param res
*/
async function find(req, res) {
let userId = req.headers.userid;
let result = await projectBiz.allProjectList();
res.success(result);
}
async function add(req, res) {
let userId = req.headers.userid;
let reqConf = {id: 'String', name: 'String', controller:'String'};
let { id, name, controller } = eccReqParamater(reqConf, req.body, ['workLog']);
let result = await projectBiz.addProjectData(id, name, controller);
res.success(result);
}
async function update(req, res) {
let userId = req.headers.userid;
let reqConf = {id: 'String', name: 'String', controller:'String'};
let { id, name, controller } = eccReqParamater(reqConf, req.body, ['workLog']);
let result = await projectBiz.updateProjectData(id, name, controller);
res.success(result);
}
\ No newline at end of file
......@@ -6,6 +6,10 @@ import * as userRouters from './user'
import * as publicRouters from './public'
import * as askForLeaveRouters from './askForLeave'
import * as workingLogRouters from './workingLog'
import * as overtimeRouters from './overtime'
import * as projectRouters from './project'
import * as statsRouters from './stats'
import * as attendanceRouters from './attendance'
export function setRouter(httpServer){
......@@ -13,4 +17,8 @@ export function setRouter(httpServer){
publicRouters.setRouter(httpServer);
askForLeaveRouters.setRouter(httpServer);
workingLogRouters.setRouter(httpServer);
overtimeRouters.setRouter(httpServer);
projectRouters.setRouter(httpServer);
statsRouters.setRouter(httpServer);
attendanceRouters.setRouter(httpServer);
}
\ No newline at end of file
/**
* 统计路由
*/
import * as asyncHandler from 'express-async-handler';
import * as statsBiz from '../biz/stats';
import moment = require('moment');
import { eccReqParamater } from '../tools/eccParam';
export function setRouter(httpServer) {
/**项目工时统计 */
httpServer.post('/stats/working/allproject', asyncHandler(allProject));
httpServer.post('/stats/working/monthproject', asyncHandler(monthProject));
httpServer.post('/stats/working/weekproject', asyncHandler(weekProject));
/**本月工时日志 */
httpServer.post('/stats/working/month/project', asyncHandler(thisMonthProject));
httpServer.post('/stats/working/month/project/member', asyncHandler(thisMonthProjectAndUser));
/**部门统计 */
httpServer.post('/stats/department/working', asyncHandler(departmentWorkinglog));
httpServer.post('/stats/department/overtimeandask', asyncHandler(departmentAskForLeaveAndOverTime));
httpServer.post('/stats/department/departmentproject', asyncHandler(departmentProject));
httpServer.post('/stats/department/departmentprojectcalendar', asyncHandler(departmentProjectCalendar));
}
async function allProject(req, res) {
let result = await statsBiz.allProjectData();
res.success(result);
}
async function monthProject(req, res) {
let st = moment().subtract(30,'day').format("YYYY-MM-DD")+' 00:00:00';
let et = moment().format("YYYY-MM-DD")+' 00:00:00';
let result = await statsBiz.timeProjectData(st, et);
res.success(result);
}
async function weekProject(req, res) {
let thisWeekDay = moment().weekday();
let st = moment().subtract(1,'week').subtract(thisWeekDay, 'days').format("YYYY-MM-DD")+' 00:00:00';
let et = moment(st).add(7,'days').format("YYYY-MM-DD")+' 00:00:00';
let result = await statsBiz.timeProjectData(st, et);
res.success(result);
}
async function departmentWorkinglog(req, res) {
let reqConf = {departmentId: 'Number'};
let { departmentId } = eccReqParamater(reqConf, req.body, []);
let result = await statsBiz.departmentWorkinglogData(departmentId);
res.success(result);
}
async function departmentAskForLeaveAndOverTime(req, res) {
let reqConf = {departmentId: 'Number'};
let { departmentId } = eccReqParamater(reqConf, req.body, []);
let result = await statsBiz.departmentAskForLeaveAndOverTimeData(departmentId);
res.success(result);
}
async function departmentProject(req, res) {
let reqConf = {departmentId: 'Number'};
let { departmentId } = eccReqParamater(reqConf, req.body, []);
let result = await statsBiz.departmentProjectData(departmentId);
res.success(result);
}
async function departmentProjectCalendar(req, res) {
let reqConf = {departmentId: 'Number'};
let { departmentId } = eccReqParamater(reqConf, req.body, []);
let result = await statsBiz.departmentProjectCalendarData(departmentId);
res.success(result);
}
async function thisMonthProject(req, res) {
let reqConf = {projectName: 'String', departmentId:'Number'};
let { projectName, departmentId } = eccReqParamater(reqConf, req.body, []);
let result = await statsBiz.getThisMonthProject(projectName, departmentId);
res.success(result);
}
async function thisMonthProjectAndUser(req, res) {
let reqConf = {projectName: 'String', departmentId:'Number', userName:"String"};
let { projectName, departmentId, userName } = eccReqParamater(reqConf, req.body, []);
let result = await statsBiz.getThisMonthProjectAndName(projectName, departmentId, userName);
res.success(result);
}
\ No newline at end of file
......@@ -9,6 +9,7 @@ import { checkFuHuaQiToken } from '../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/user/login', asyncHandler(login));
httpServer.post('/user/logout', asyncHandler(logout));
}
......@@ -20,3 +21,12 @@ async function login(req, res) {
res.success(userInfo);
}
async function logout(req, res) {
let userId = req.headers.userid;
let userInfo = await userBiz.logout(userId);
res.success(userInfo);
}
......@@ -17,6 +17,9 @@ export function setRouter(httpServer) {
/**工时管理 */
httpServer.post('/workinglog/admin/list', checkFuHuaQiToken, asyncHandler(workginLogAdminList));
httpServer.post('/workinglog/admin/outputlist', checkFuHuaQiToken, asyncHandler(outPutList));
/**部门主管看的列表 */
httpServer.post('/workinglog/department/list', checkFuHuaQiToken, asyncHandler(departmentWorkLogList));
httpServer.post('/workinglog/department/userlist', checkFuHuaQiToken, asyncHandler(departmentUserList));
}
/**
......@@ -110,4 +113,22 @@ async function update(req, res) {
let result = await workingLogBiz.updateWorkinglog(userId, id, time, projectId, isOutside, workLog);
res.success(result);
}
\ No newline at end of file
}
async function departmentWorkLogList(req, res) {
let reqConf = {departmentId:"Number", startTime:"String", endTime:"String", userId:"Number", page:"Number", projectId:"String"};
let {departmentId, startTime, endTime, userId, page, projectId} = eccReqParamater(reqConf, req.body, ['startTime','endTime', 'userId', 'projectId']);
let result = await workingLogBiz.departmentWorklog(departmentId, startTime, endTime, userId, page, projectId);
res.success(result);
}
async function departmentUserList(req, res) {
let reqConf = {departmentId:"Number"};
let {departmentId} = eccReqParamater(reqConf, req.body, []);
let result = await workingLogBiz.getDepartmentUserList(departmentId);
res.success(result);
}
const xlsx = require('node-xlsx');
const path = require('path');
/**
* onceSheetBecomeOfblockData 将excel文件的指定sheet解析成数据块数据
* @param fileName 文件名称
* @param sheetName 表名称
* @returns [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
export function onceSheetBecomeOfblockData(fileName, sheetName) {
let {sheetMap} = getExcel( path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", fileName ));
// return sheetMap;
let thisBlockData = getBlockData(sheetMap[sheetName]);
return thisBlockData;
}
/**
* excelBecomeOfBlockData 将excel所有的sheet解析成数据块
* @param fileName 文件名称
* @returns {"sheetName1":[ {blockData:数据块(二维数组), blockTitle:"数据标题"}], ...}
*/
export function excelBecomeOfBlockData(fileName) {
let {sheetMap} = getExcel( path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", fileName ));
let result = {};
for (let sheetName in sheetMap) {
result[sheetName] = getBlockData(sheetMap[sheetName]);
}
return result;
}
/**
* planaryArrayBecomeOfBlockData 将符合excel规则的sheet二维数组转为 数据块
* @param dataList excel解出来的数据
* @returns thisBlockData 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
export function planaryArrayBecomeOfBlockData(planaryArray) {
return getBlockData(planaryArray);;
}
//===
/**
* getBlockData 数据分块
* @param dataList 解析出来的excel二维数组
* @returns 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
function getBlockData(dataList) {
let blockList = [];
for (let i = 0; i < 999; i++) {
let {blockData, blockTitle, notItem, delDataList} = checkBlock(dataList);
if (notItem) break;
dataList = delDataList;
if (blockTitle) blockList.push({blockData, blockTitle});
}
return blockList;
}
function getListFristNotNullItemIndex(list) { //获取起始坐标
if (!list.length) return null;
for (let i = 0; i < list.length; i++) {
if (list[i]) return i;
}
}
function getListFirstNullItemIndex(startX, list) { //获取第一个为空的坐标
if (!list.length) return null;
let checkItem = false;
let firstItemIndex = 0;
for (let i = startX; i <= list.length; i++) {
let item = list[i];
if (!checkItem && item) checkItem = true;
if (checkItem && !item) {
firstItemIndex = i;
break;
}
}
return firstItemIndex;
}
function listRegionIsNull(list, startX, endX) { //指定区间内数据是否未空
let isNull = true;
if ( !list.length ) return isNull;
for (let i = startX; i < endX; i++) {
let item = list[i];
if (item) {
isNull = false;
break;
}
}
return isNull;
}
function thisListNotItem(list) {
for (let i = 0; i < list.length; i++) {
if (list[i]) return false;
}
return true
}
function checkBlock(dataList) {
//纵向有效起始点
let startY = 0;
let startX = 0;
let isNotBlockTitle = false; //没有块标题
let isLook = false;
let endX = 0;//x轴最长结束下标 【包括下标】
let blockTitle = ''; //标题块名称
let notItem = true;
for (let i = 0; i < dataList.length; i++) {
let childList = dataList[i] || [];
if (!thisListNotItem(childList)) {
if ( !isLook ) {
let thisRoowStartX = getListFristNotNullItemIndex(childList);
let thisRoowLastItem = childList[thisRoowStartX + 1];
let LastList = dataList[i+1] || [];
// let lastRoowStartX = getListFristNotNullItemIndex(LastList);
let lastRoowHaveItem = LastList[thisRoowStartX];
if ( thisRoowLastItem || (LastList.length && lastRoowHaveItem) ) {
if (lastRoowHaveItem && thisRoowLastItem ) {
isNotBlockTitle = true; //不存在标题块
blockTitle = `${thisRoowStartX}_${i}`;
startY = i;
startX = thisRoowStartX;
}
else {
blockTitle = dataList[i][thisRoowStartX];
dataList[i][thisRoowStartX] = null;
if ( thisRoowLastItem ) { // 同行存在元素 标题在y轴上
startY = i;
startX = thisRoowStartX + 1;
} else { // 同行存在元素 标题在x轴上
startY = i + 1;
startX = thisRoowStartX;
}
}
isLook = true;
} else { //只有标题 无内容
console.log(dataList[i][thisRoowStartX]);
dataList[i][thisRoowStartX] = null;
}
} else {
//测量最大连续长度
let firstNullX = getListFirstNullItemIndex(startX, childList);
if (firstNullX) endX = Math.max(endX, firstNullX-1);
break;
}
notItem = false;
}
}
let endY = 0;//y轴连续下标 【包括下标】
let yInfoStart = false;
let yInfoEnd = false;
for (let y = startY; y < dataList.length; y++) {
//纵向找连续性
let thisRoow = dataList[y];
let regionIsNull = listRegionIsNull(thisRoow, startX, endX);
if (!regionIsNull) {
endY = y;
if (!yInfoStart) yInfoStart = true;
}
if (yInfoStart && regionIsNull) yInfoEnd = true;
if (yInfoEnd) break;
}
let blockData = [];
for (let y = startY; y <= endY; y++) {
let onceList = [];
for (let x = startX; x <= endX; x++) {
onceList.push(dataList[y][x]);
dataList[y][x] = null;
}
blockData.push(onceList);
}
return {blockData, blockTitle, delDataList:dataList,notItem};
}
//获取单个excel文件的数据
function getExcel(filePath) {
const workSheetsFromFile = xlsx.parse(filePath);
let sheetMap = {};
let sheetList = [];
for (let i = 0; i < workSheetsFromFile.length; i++) {
let sheetInfo = workSheetsFromFile[i];
sheetMap[sheetInfo.name] = sheetInfo.data;
sheetList.push(sheetInfo);
}
return {sheetMap, sheetList}
}
\ No newline at end of file
// /**
// * 初始化加班和调休数据
// */
// const xlsx = require('node-xlsx');
// const path = require('path');
// const md5 = require("md5");
// import moment = require("moment");
// import { onceSheetBecomeOfblockData } from "./analysisExcel";
// import { addWorkingLog } from "../data/admin/workinglog";
// import { addOvertime, initOvertime } from "../data/admin/overtime";
// import { ASKFORLEAVETYPE } from "../config/enum";
// import { initAskforleave } from "../data/admin/askForLeave";
// import { getAskForLeaveId, getOvertimeId } from "./tools";
// export async function initData() {
// // return
// let name = "李欣鸣";
// let userId = 12;
// let data = onceSheetBecomeOfblockData("初始化数据.xlsx", name);
// for(let i = 0; i < data.length; i++) {
// let {blockData, blockTitle} = data[i];
// if (blockTitle == "0_0") initAskForLeaveData(name, userId, blockData);
// if (blockTitle == "5_0") initOverTimeData(name, userId, blockData);
// }
// }
// async function initOverTimeData(name, userId, list) {
// if (!list) {
// console.log(name, "初始化加班", "=无数据");
// }
// let projectId = "SH-YY-GD";
// let utc = new Date();
// let count = 0;
// let addFloat = 0;
// for (let i = 0; i < list.length; i++) {
// if (!i) continue;
// let subList = list[i];
// let dataTime;
// if (typeof subList[0] == 'number') {
// dataTime =  new Date((subList[0] - 25569 ) * 86400 * 1000 + utc.getTimezoneOffset()*1000*60);
// } else dataTime = new Date(subList[0]);
// let id = `ot${userId}${new Date(dataTime).valueOf()}${Math.ceil(Math.random() *100)}`;
// let dateKey = moment(dataTime).format("YYYY-MM-DD")+ ' 18:00:00';
// let state = 1;
// let workLog = "归档";
// let time = subList[1];
// if (Math.floor(time) != time) addFloat += time - Math.floor(time);
// let approver = 3;//张老师
// if (Math.floor(time)) await initOvertime(id, projectId, userId, Math.floor(time), dateKey, workLog, approver, state);
// count+=1;
// }
// console.log(name+"初始化加班成功"+count+"条数据");
// let todayKey = '2023-01-22 18:00:00';
// if (addFloat) await initOvertime(getOvertimeId(userId), projectId, userId, Math.ceil(addFloat), todayKey, "补充小数位", 3, 1);
// console.log(name+"初始化加班 补录小数点一条数据"+addFloat+"小时");
// }
// async function initAskForLeaveData(name, userId, list) {
// if (!list) {
// console.log(name, "初始化请假", "=无数据");
// }
// let utc = new Date();
// let count = 0;
// let addFloat = 0;
// for (let i = 0; i < list.length; i++) {
// if (!i) continue;
// let subList = list[i];
// let dataTime;
// if (typeof subList[0] == 'number') {
// dataTime =  new Date((subList[0] - 25569 ) * 86400 * 1000 + utc.getTimezoneOffset()*1000*60);
// } else dataTime = new Date(subList[0]);
// let id = `al${userId}${new Date(dataTime).valueOf()}${Math.ceil(Math.random() *100)}`;
// let des = "调休";
// let startTime = moment(dataTime).format("YYYY-MM-DD")+ ' 09:00:00';
// let endTime = moment(dataTime).format("YYYY-MM-DD")+ ' 06:00:00';
// let dateKey = moment(dataTime).format("YYYY-MM-DD")+ ' 18:00:00';
// let state = 1;
// let day = 0;
// let time = subList[1];
// if (Math.floor(time) != time) addFloat += time - Math.floor(time);
// let type = ASKFORLEAVETYPE.调休;
// let approval = 3;//罗总
// if (Math.floor(time)) await initAskforleave(id, des, startTime, endTime, userId, approval, Math.floor(time), day, type, dateKey, state);
// count+=1;
// }
// console.log(name+"调休 初始化成功"+count+"条数据");
// let todayKey = '2023-01-22 18:00:00';
// let startTime = '2023-01-22 09:00:00';
// let endTime = '2023-01-22 18:00:00';
// if (Math.ceil(addFloat)) await initAskforleave(getAskForLeaveId(userId), "补充小数点", startTime, endTime, userId, 3, Math.ceil(addFloat), 0, ASKFORLEAVETYPE.调休, todayKey, 1);
// console.log(name+"初始化调休 补录小数点一条数据"+addFloat+"小时");
// }
\ No newline at end of file
......@@ -8,11 +8,11 @@ const md5 = require("md5");
* 生成工时填报的dateKey
* @returns
*/
export function getWorkingDateKey(time?) {
export function getDateKey(time?) {
if (time) {
new Date(moment(time).format("YYYY-MM-DD")+ ' 18:00:00');
return moment(time).format("YYYY-MM-DD")+ ' 18:00:00';
}
return new Date(moment().format("YYYY-MM-DD")+ ' 18:00:00');
return moment().format("YYYY-MM-DD")+ ' 18:00:00'
}
......@@ -22,9 +22,26 @@ export function getWorkingDateKey(time?) {
* @returns
*/
export function getWorkingLogId(userId:number) {
return `${userId}${new Date().valueOf()}${Math.ceil(Math.random() *100)}`
return `wl${userId}${new Date().valueOf()}${Math.ceil(Math.random() *100)}`
}
/**
* 生成加班填报的id
* @param userId
* @returns
*/
export function getOvertimeId(userId:number) {
return `ot${userId}${new Date().valueOf()}${Math.ceil(Math.random() *100)}`
}
/**
* 生成请假的id
* @param userId
* @returns
*/
export function getAskForLeaveId(userId:number) {
return `al${userId}${new Date().valueOf()}${Math.ceil(Math.random() *100)}`
}
/**
* 获取token
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment