Commit 0d5ce51e by lixinming

no message

parent 1d943919
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -22,7 +22,7 @@
"nodemailer": "^6.1.1",
"qs": "^6.11.0",
"request": "^2.88.0",
"sequelize": "^6.29.0",
"sequelize": "^6.32.1",
"svg-captcha": "^1.3.12",
"ws": "^5.2.2",
"xml2js": "^0.4.23"
......
......@@ -2,16 +2,16 @@
<port>7088</port>
<dbConfig>
<!-- 本地mysql配置 -->
<mysqlHost>192.168.0.105</mysqlHost>
<mysqlHost>192.168.0.109</mysqlHost>
<mysqlPort>3306</mysqlPort>
<mysqlUser>root</mysqlUser>
<mysqlPwd>123456</mysqlPwd>
<dataBase>oadb</dataBase>.
<mysqlPwd>qaz123456</mysqlPwd>
<dataBase>oadb</dataBase>
<!-- 服务器mysql配置 -->
<!-- <mysqlHost>127.0.0.1</mysqlHost>
<mysqlPort>3306</mysqlPort>
<mysqlUser>root</mysqlUser>
<mysqlPwd>Yfs123456_</mysqlPwd>
<dataBase>yfs</dataBase> -->
<mysqlPwd>123456</mysqlPwd>
<dataBase>oadb</dataBase> -->
</dbConfig>
</config>
......@@ -193,7 +193,7 @@ export async function approveAskForLeave(id:string, type:number, notPassingStr:s
let annualLeave = annual - askLong;
if (annualLeave < 0) throw new BizError(ERRORENUM.年假剩余时间不足);
await updateManyData(TABLENAMEENUM.用户表, {annualLeave:annualLeave}, {userId:askForLeaveInfo.userId});
await updateManyData(TABLENAMEENUM.用户表, {userId:askForLeaveInfo.userId}, {annualLeave:annualLeave});
} else {
/**调休 */
let residuedCTO = cto - askLong;
......@@ -306,15 +306,15 @@ export async function outPutPersonnelAFLList(userId:number, startTime:string, en
includeConf[TABLENAMEENUM.用户表] = ["name", "roleId", "departmentId"];
let column = ["startTime", "endTime", "day", "time", "type", "des", "id", "state"];
let dbList = await selectDataListByParam(TABLENAMEENUM.请假, selectParam, column);
let dbList = await selectDataToTableAssociation(TABLENAMEENUM.请假, includeConf, selectParam, column);
let dataList = [];
dbList.forEach(info => {
let {users, startTime, endTime, day, time, type, des, state } = info;
let {user, startTime, endTime, day, time, type, des, state } = info;
let approver = "";
if (users.roleId == ROLEENUM.员工) {
approver = queue[SYSTEMCONSTCONFIGENUM.部门经理][users.departmentId].name;
} else if (users.roleId == ROLEENUM.部门经理) {
if (user.roleId == ROLEENUM.员工) {
approver = queue[SYSTEMCONSTCONFIGENUM.部门经理][user.departmentId].name;
} else if (user.roleId == ROLEENUM.部门经理) {
approver = queue[SYSTEMCONSTCONFIGENUM.请假默认].name;
}
......@@ -323,7 +323,7 @@ export async function outPutPersonnelAFLList(userId:number, startTime:string, en
else if (state == 1) stateStr = "已通过";
else stateStr = "未通过";
dataList.push({
name:users.name,
name:user.name,
startTime:myTools.getClientTime( startTime),
endTime:myTools.getClientTime( endTime),
long:(day*8)+ time,
......@@ -333,4 +333,70 @@ export async function outPutPersonnelAFLList(userId:number, startTime:string, en
});
});
return {dataList};
}
/**
* 人事补充请假信息
* @param userId
* @param des
* @param startTime
* @param endTime
* @param type
* @param day
* @param time
*/
export async function addSupplementAskForLeave(userId:number, des:string, startTime:string, endTime:string, type:number, day:number, time:number) {
/**审批人 */
let userInfo = await selectOneDataByParam(TABLENAMEENUM.用户表, {userId}, ["roleId", "departmentId", "annualLeave"]);
let approver = 0;
if (userInfo.roleId == ROLEENUM.员工) {
approver = queue[SYSTEMCONSTCONFIGENUM.部门经理][userInfo.departmentId].userId;
} else if (userInfo.roleId == ROLEENUM.部门经理) {
approver = queue[SYSTEMCONSTCONFIGENUM.请假默认].userId;
}
/**年假必须是8的整数倍 */
if (type == ASKFORLEAVETYPE.年假) {
let timeCount = (day*8) + time;
if (timeCount%4 != 0) throw new BizError(ERRORENUM.年假限制为4小时的倍数)
if (timeCount > userInfo.annualLeave) throw new BizError(ERRORENUM.年假剩余不足请重新分配请假时间);
await updateManyData(TABLENAMEENUM.用户表, {userId}, {annualLeave:userInfo.annualLeave-timeCount});
} else if (type == ASKFORLEAVETYPE.调休) {
let askList = await selectDataListByParam(TABLENAMEENUM.请假, {userId, type:ASKFORLEAVETYPE.调休}, ["day", "time"] );
let askCount = 0;
askList.forEach(item => {
let {day, time} = item;
if (day!=0) askCount += day*8;
if (time != 0) askCount += time;
});
let ovList = await selectDataListByParam(TABLENAMEENUM.加班, {userId, state:APPROVETYPE.通过}, ["time"] );
let ovCount = 0;
ovList.forEach(item => {
let {time} = item;
ovCount += time;
});
let residue = ovCount - askCount;
let timeCount = (day*8) + time;
if (timeCount > residue) throw new BizError(ERRORENUM.调休剩余不足请重新分配请假时间)
}
let addInfo = {
id : myTools.generateAskForLeaveId(userId),
startTime:myTools.getDBTime(startTime),
endTime:myTools.getDBTime(endTime),
des,
userId,
approval:approver,
time,
day,
type,
dateKey:myTools.generateDateKey(),
state:APPROVETYPE.通过,
isSupplement:1,
};
await addData(TABLENAMEENUM.请假, addInfo);
return {isSuccess:true, message:"添加成功"};
}
\ No newline at end of file
import { APPROVETYPE, ASKFORLEAVETYPE, DEPARTMENTENUM, TABLENAMEENUM } from "../config/enum";
import { APPROVETYPE, ASKFORLEAVETYPE, DEPARTMENTENUM, SYSTEMSETKEY, TABLENAMEENUM } from "../config/enum";
import { selectDataListByParam, selectDataToTableAssociation, selectOneDataByParam } from "../model/findData";
import moment = require("moment");
import { updateManyData } from "../model/updateData";
import { getDBTime } from "../util/myTools";
import { BizError } from "../util/bizError";
import { ERRORENUM } from "../config/errorEnum";
/**
* 成员列表
......@@ -60,64 +62,73 @@ export async function getMemberList() {
return {dataList};
}
// /**
// * 校验年假 test
// */
// export async function eccMemberTime() {
// let includeConf = {};
// includeConf[TABLENAMEENUM.部门表] = {colum:["name"], where:{departmentId:{"%in%":[DEPARTMENTENUM.开发, DEPARTMENTENUM.设计, DEPARTMENTENUM.项目经理, DEPARTMENTENUM.人事]}} };
// includeConf[TABLENAMEENUM.角色表] = {colum:["roleName"], where:{} };
// let column = ["userId", "name", "ed", "roleId", "departmentId", "annualLeave"];
// let userList = await selectDataToTableAssociation(TABLENAMEENUM.用户表, includeConf, {state:1}, column);
// let annMap = {};
// for (let i = 0; i < userList.length; i++) {
// let info = userList[i];
// let {userId, name, ed, department} = info;
// let monthDifference = 0;
// let annualLeaveCount = 0;
// let monthNum = new Date(ed).getMonth()
// let longStr = ``;
// if (ed) monthDifference = -1 * moment(ed).diff(moment(), 'months');
// else {
// ed = "-";
// longStr = "-";
// }
// if (monthDifference >= 12) {
// /**满一年 */
// let year = Math.floor(monthDifference/12);
// longStr = `${year}年`;
// if (monthDifference%12) longStr += `${monthDifference%12}个月`;
// annualLeaveCount = year + 5 > 10 ? 10 : year + 5;
// } else {
// /**未满一年 */
// longStr = `${monthDifference}个月`;
// annualLeaveCount = Math.round((12 - monthNum)/12*5);
// }
// annMap[userId] = annualLeaveCount * 8;
// }
/**
* 校验年假
*/
export async function eccMemberTime() {
/**获取年假更新时间 */
let askResetInfo = await selectOneDataByParam(TABLENAMEENUM.系统设置表, {id:SYSTEMSETKEY.年假重置时间}, ["value"]);
if (!askResetInfo || !askResetInfo.value) throw new BizError(ERRORENUM.系统错误);
// let askList = await selectDataListByParam(TABLENAMEENUM.请假, {state:APPROVETYPE.通过, type:2}, [ "day", "userId", "time", "type"]);
// let nianjia = {};
// askList.forEach(info => {
// let {userId, time, day} = info;
// let itemCount = time + (day*8);
// if (!nianjia[userId]) nianjia[userId] = 0;
// nianjia[userId] += itemCount;
// });
// for (let key in annMap) {
// let dNum = annMap[key] - (nianjia[key] || 0);
// updateManyData(TABLENAMEENUM.用户表, {userId:key}, {annualLeave:dNum});
// }
// console.log("数据校验成功");
// }
let includeConf = {};
includeConf[TABLENAMEENUM.部门表] = {colum:["name"], where:{departmentId:{"%in%":[DEPARTMENTENUM.开发, DEPARTMENTENUM.设计, DEPARTMENTENUM.项目经理, DEPARTMENTENUM.人事]}} };
includeConf[TABLENAMEENUM.角色表] = {colum:["roleName"], where:{} };
let column = ["userId", "name", "ed", "roleId", "departmentId", "annualLeave"];
let userList = await selectDataToTableAssociation(TABLENAMEENUM.用户表, includeConf, {state:1}, column);
let annMap = {};
for (let i = 0; i < userList.length; i++) {
let info = userList[i];
let {userId, name, ed, department} = info;
let monthDifference = 0;
let annualLeaveCount = 0;
let monthNum = new Date(ed).getMonth()
let longStr = ``;
if (ed) monthDifference = -1 * moment(ed).diff(moment(), 'months');
else {
ed = "-";
longStr = "-";
}
if (monthDifference >= 12) {
/**满一年 */
let year = Math.floor(monthDifference/12);
longStr = `${year}年`;
if (monthDifference%12) longStr += `${monthDifference%12}个月`;
annualLeaveCount = year + 5 > 10 ? 10 : year + 5;
} else {
/**未满一年 */
longStr = `${monthDifference}个月`;
annualLeaveCount = Math.round((12 - monthNum)/12*5);
}
annMap[userId] = annualLeaveCount * 8;
}
let askList = await selectDataListByParam(TABLENAMEENUM.请假, {state:APPROVETYPE.通过, type:2, startTime:{"%gt%":askResetInfo.value}}, [ "day", "userId", "time", "type"]);
let nianjia = {};
askList.forEach(info => {
let {userId, time, day} = info;
let itemCount = time + (day*8);
if (!nianjia[userId]) nianjia[userId] = 0;
nianjia[userId] += itemCount;
});
for (let key in annMap) {
let dNum = annMap[key] - (nianjia[key] || 0);
await updateManyData(TABLENAMEENUM.用户表, {userId:key}, {annualLeave:dNum});
}
console.log("数据校验成功");
}
/**
* 更新入职时间
* @param userId
* @param edTime
* @returns
*/
export async function updateMemberData(userId:number, edTime:string) {
let ed = getDBTime(edTime);
await updateManyData(TABLENAMEENUM.用户表, {userId}, {ed});
......@@ -190,4 +201,30 @@ export async function findUserAskCount(userId:number) {
let thisUserInfo = await selectOneDataByParam(TABLENAMEENUM.用户表, {userId}, ["annualLeave"]);
let annual = thisUserInfo.annualLeave || 0;
return {cto, annual};
}
/**
* 获取当前年假更新时间
* @returns
*/
export async function getASKMs() {
let askSetInfo = await selectOneDataByParam(TABLENAMEENUM.系统设置表, {id:SYSTEMSETKEY.年假重置时间}, ["value"]);
if (!askSetInfo) throw new BizError(ERRORENUM.系统错误, '未初始化年假计算时间');
let result = {
ms:askSetInfo.value
};
return result;
}
/**
* 更新年假时间
* @param ms
* @returns
*/
export async function resettingASKMs(ms:string) {
await updateManyData(TABLENAMEENUM.系统设置表, {id:SYSTEMSETKEY.年假重置时间}, {value:ms});
await eccMemberTime();
return {isSuccess:true}
}
\ No newline at end of file
......@@ -33,7 +33,7 @@ export async function allProjectData() {
});
/**工时 */
includeConf[TABLENAMEENUM.项目表] = ["name"];
let column = ["dateKey", "time", "isOutside"];
let column = ["dateKey", "time", "isOutside", "projectId"];
let wlDBList = await selectDataToTableAssociation(TABLENAMEENUM.工时表, includeConf, {}, column );
......@@ -225,8 +225,8 @@ export async function departmentAskForLeaveAndOverTimeData(departmentId:number)
let includeConf = {};
includeConf[TABLENAMEENUM.用户表] = {column: ["name", "userId", "departmentId" ], where:{departmentId}};
let column = ["userId", "time", "isOutside"];
let workLogDBList = await selectDataToTableAssociation(TABLENAMEENUM.工时表, includeConf, {dateKey:{"%gt%":selectTime} }, column );
let column = ["userId", "time"];
let workLogDBList = await selectDataToTableAssociation(TABLENAMEENUM.加班, includeConf, {dateKey:{"%gt%":selectTime} }, column );
let overtimeDataMap = {};
workLogDBList.forEach(info => {
let {user, time} = info;
......@@ -371,4 +371,27 @@ export async function getThisMonthProjectAndName(projectName:string, departmentI
dataList.push({name:user.name, date:moment(dateKey).format("YYYY-MM-DD"), workLog, time});
});
return {dataList}
}
\ No newline at end of file
}
export async function test1() {
let includeConf = {};
includeConf[TABLENAMEENUM.用户表] = {column: ["name", "userId", "departmentId" ]};
let column = ["userId", "time", "day", "dateKey", "startTime", "endTime","des", "type"];
let workLogDBList = await selectDataToTableAssociation(TABLENAMEENUM.请假, includeConf, {state:1 }, column );
// let overtimeDataMap = {};
// let memberDistinctMap = {};
workLogDBList.forEach(info => {
let {user, time, dateKey, workLog, project} = info;
let {name} = user;
// if (!overtimeDataMap[name]) overtimeDataMap[name] = [];
// overtimeDataMap[name].push({});
// memberDistinctMap[name] = 1;
});
console.log();
}
......@@ -2,8 +2,10 @@
* 放系系统基础数据
*/
import { DEPARTMENTENUM, ROLEENUM, SYSTEMCONSTCONFIGENUM, TABLENAMEENUM } from "../config/enum";
import { DEPARTMENTENUM, ROLEENUM, SYSTEMCONSTCONFIGENUM, SYSTEMSETKEY, TABLENAMEENUM } from "../config/enum";
import { addData } from "../model/addData";
import { selectOneDataByParam } from "../model/findData";
import moment = require("moment");
export let queue = {
......@@ -24,4 +26,10 @@ export async function initSystemConst() {
queue[SYSTEMCONSTCONFIGENUM.加班默认] = {userId:17, name:"张谕"};
queue[SYSTEMCONSTCONFIGENUM.请假默认] = {userId:16, name:"万仪停"};
/**初始化系统配置 */
let askMsInfo = await selectOneDataByParam(TABLENAMEENUM.系统设置表, {id:SYSTEMSETKEY.年假重置时间}, ["id", "value"]);
if (!askMsInfo || !askMsInfo.id ) {
await addData(TABLENAMEENUM.系统设置表, {id:SYSTEMSETKEY.年假重置时间, value:moment().format("YYYY-MM-DD")+" 00:00:00", desc:"年假重置时间"});
}
}
\ No newline at end of file
......@@ -156,17 +156,17 @@ export async function adminWorkLogForTime(page:number, startMs:string, endMs:str
}
let includeConf = {};
includeConf[TABLENAMEENUM.项目表] = ["name"];
includeConf[TABLENAMEENUM.项目表] = ["name", "projectId"];
includeConf[TABLENAMEENUM.用户表] = ["name", "departmentId" ];
let column = ["dateKey", "time", "isOutside"];
let column = ["dateKey", "time", "isOutside", "workLog"];
let dbList = await selectDataToTableAssociationToPage(TABLENAMEENUM.工时表, includeConf, selectParam, column, page, 10 );
let dataList = [];
let distinctMap = {};
dbList.forEach(info => {
let {dateKey, users, project } = info;
let {dateKey, user, project } = info;
let year = moment(dateKey).year();
let month = moment(dateKey).month()+1;
let day = moment(dateKey).date();
......@@ -174,8 +174,8 @@ export async function adminWorkLogForTime(page:number, startMs:string, endMs:str
year,
month,
day,
name:users.name,
departmentName : changeEnumValue(DEPARTMENTENUM, users.departmentId),
name:user.name,
departmentName : changeEnumValue(DEPARTMENTENUM, user.departmentId),
projectName:project.name,
projectId:project.projectId,
workLog:info.workLog,
......@@ -255,9 +255,9 @@ export async function outPutAdminWorkingLogListForTime(startMs:string, endMs:str
/**工时 */
let includeConf = {};
includeConf[TABLENAMEENUM.项目表] = ["name"];
includeConf[TABLENAMEENUM.用户表] = ["name", "userId", "departmentId" ];
let column = ["dateKey", "time", "isOutside"];
includeConf[TABLENAMEENUM.项目表] = ["name", "projectId"];
includeConf[TABLENAMEENUM.用户表] = ["name", "userId", "departmentId"];
let column = ["dateKey", "time", "isOutside", "workLog"];
let dbList = await selectDataToTableAssociation(TABLENAMEENUM.工时表, includeConf, selectParam, column );
let result = [
......@@ -265,7 +265,7 @@ export async function outPutAdminWorkingLogListForTime(startMs:string, endMs:str
];
dbList.forEach(info => {
let {dateKey, users, project } = info;
let {dateKey, user, project } = info;
let year = moment(dateKey).year();
let month = moment(dateKey).month()+1;
let day = moment(dateKey).date();
......@@ -273,14 +273,15 @@ export async function outPutAdminWorkingLogListForTime(startMs:string, endMs:str
year,
month,
day,
changeEnumValue(DEPARTMENTENUM, users.departmentId),
users.name,
changeEnumValue(DEPARTMENTENUM, user.departmentId),
user.name,
project.name,
project.projectId,
info.time,
info.workLog
];
if (overtimeMap[dateKey][users.userId]) itemList.push(overtimeMap[dateKey][users.userId]);
let dateKeyStr = moment(dateKey).format("YYYY-MM-DD");
if (overtimeMap[dateKeyStr] && overtimeMap[dateKeyStr][user.userId]) itemList.push(overtimeMap[dateKeyStr][user.userId]);
result.push(itemList);
});
......
......@@ -27,7 +27,8 @@ export enum TABLENAMEENUM {
部门表 = 'department',
加班 = 'overtime',
请假 = 'askforleave',
工时表 = 'workinglog'
工时表 = 'workinglog',
系统设置表 = 'systemset',
}
export enum ROLEENUM {
......@@ -84,4 +85,8 @@ export enum SECONDLVLIMIT {
export enum WORKLOGADMINTYPE {
按项目分 = 1,
按时间分
}
export enum SYSTEMSETKEY {
年假重置时间 = 1,
}
\ No newline at end of file
......@@ -23,7 +23,8 @@ export enum ERRORENUM {
登录失败,
密码错误,
一天只有8小时多余的时间请填加班,
表单校验失败
表单校验失败,
系统错误
}
/**
......
......@@ -126,7 +126,8 @@ export const TablesConfig = [
day:{type:Sequelize.INTEGER(20), allowNull:false}, //
state:{type:Sequelize.INTEGER(20), allowNull:false}, //
notPassing:{type:Sequelize.STRING(255), allowNull:true},//不通过理由
dateKey:{type:Sequelize.DATE} //
dateKey:{type:Sequelize.DATE}, //
isSupplement:{type:Sequelize.INTEGER(10), default:0},//是否补充
},
association: [
......@@ -157,5 +158,21 @@ export const TablesConfig = [
},
association: [
]
},
{
tableNameCn:'系统设置表',
tableName:'systemset',
schema:{
id:{
type:Sequelize.INTEGER(11), //表示属性的数据类型
allowNull:false, //表示当前列是否允许为空, false表示该列不能为空
primaryKey:true, //表示主键
unique:true //表示该列的值必须唯一
},
value:{type:Sequelize.STRING(255)}, //
desc:{type:Sequelize.STRING(255)}, //
},
association: [
]
}
];
\ No newline at end of file
import { test1 } from "./biz/stats";
import { initSystemConst } from "./biz/system";
import { initConfig, systemConfig} from "./config/serverConfig";
import * as mysqlDB from "./db/mysqlInit";
......@@ -19,6 +20,8 @@ async function lanuch() {
await initSystemConst();
// await smsTask();
console.log('This indicates that the server is started successfully.');
await test1();
}
......
import { bizlive } from "tencentcloud-sdk-nodejs";
import { ERRORCODEENUM } from "../config/errorEnum";
/**
......
......@@ -35,7 +35,7 @@ export async function initMysqlModel() {
let {modelName, foreignKey} = item;
mysqlModelMap[tableName].belongsTo(mysqlModelMap[modelName], {foreignKey});
});
console.log(tableName);
}
}
......
......@@ -21,6 +21,7 @@ export function setRouter(httpServer) {
httpServer.post('/askforleave/personnel/list', checkFuHuaQiToken, asyncHandler(personnelList));
httpServer.post('/askforleave/personnel/membernamelist', checkFuHuaQiToken, asyncHandler(memberNameList));
httpServer.post('/askforleave/personnel/output', checkFuHuaQiToken, asyncHandler(outPutData));
httpServer.post('/askforleave/personnel/supplement/add', checkFuHuaQiToken, asyncHandler(addSupplement));
}
......@@ -106,10 +107,17 @@ async function memberNameList(req, res) {
async function outPutData(req, res) {
let reqConf = { startTime:"String", endTime:"String", userId:"Number"};
let reqConf = { startTime:"String", endTime:"String", userId:"Number"};
let {userId, startTime, endTime} = eccReqParamater(reqConf, req.body, ["startTime", "endTime", "userId"]);
let result = await askForLeaveBiz.outPutPersonnelAFLList(userId, startTime, endTime);
res.success(result);
}
async function addSupplement(req, res) {
let reqConf = {userId:'Number', des: 'String', startTime: 'String', endTime: 'String', type:'Number', day:"Number", time:"Number"};
let { userId, des, startTime, endTime, type, day, time } = eccReqParamater(reqConf, req.body, ["day", "time"]);
let result = await askForLeaveBiz.addSupplementAskForLeave(userId, des, startTime, endTime, type, day, time);
res.success(result);
}
\ No newline at end of file
......@@ -10,6 +10,8 @@ import { eccReqParamater } from '../tools/eccParam';
export function setRouter(httpServer) {
httpServer.post('/member/personnel/list', checkFuHuaQiToken, asyncHandler(memberList));
httpServer.post('/member/personnel/update', checkFuHuaQiToken, asyncHandler(updateInfo));
httpServer.post('/member/personnel/resetting/info', checkFuHuaQiToken, asyncHandler(resetInfo));
httpServer.post('/member/personnel/resetting/update', checkFuHuaQiToken, asyncHandler(resettingASK));
}
......@@ -35,4 +37,22 @@ async function updateInfo(req, res) {
let result = await memberBiz.updateMemberData(userId, ed);
res.success(result);
}
/**
* 年假开始时间
*/
async function resetInfo(req, res) {
let result = await memberBiz.getASKMs();
res.success(result);
}
async function resettingASK(req, res) {
let reqConf = {ms: 'String'};
let { ms } = eccReqParamater(reqConf, req.body, [ ]);
let result = await memberBiz.resettingASKMs(ms);
res.success(result);
}
\ No newline at end of file
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