计量中心项目

This commit is contained in:
2022-07-25 11:09:12 +08:00
parent 5911f42537
commit c8bb34e6cb
2143 changed files with 306192 additions and 0 deletions

View File

@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.yxt</groupId>
<artifactId>yxt-parent</artifactId>
<version>0.0.1</version>
<relativePath/>
</parent>
<groupId>com.yxt.attend</groupId>
<artifactId>yxt-single-attend-biz</artifactId>
<version>0.0.1</version>
<dependencies>
<dependency>
<groupId>com.yxt.attend</groupId>
<artifactId>yxt-single-attend-api</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.yxt.jlzx</groupId>
<artifactId>jlzx-single-system-api</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.yxt.workflow</groupId>
<artifactId>yxt-single-workflow-api</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.yxt.messagecenter</groupId>
<artifactId>yxt-single-messagecenter-api</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.yxt.jlzx</groupId>
<artifactId>jlzx-single-oa-api</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.yxt.jlzx</groupId>
<artifactId>jlzx-single-oa-api</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.yxt</groupId>
<artifactId>yxt-common-base</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*Mapper.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>

View File

@@ -0,0 +1,24 @@
package com.yxt.attend;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @author yxt_mtl
* @date 2020/10/09 17:54
* @description
*/
@EnableDiscoveryClient
@SpringBootApplication(scanBasePackages = {
"com.yxt.common.base.config",
"com.yxt.attend"
})
@EnableFeignClients(basePackages = {"com.yxt.jlzx.oa", "com.yxt.jlzx.system","com.yxt.messagecenter","com.yxt.workflow","com.yxt.jlzx.jlcyry"})
public class AttendApplication {
public static void main(String[] args) {
SpringApplication.run(AttendApplication.class, args);
}
}

View File

@@ -0,0 +1,759 @@
package com.yxt.attend.biz.appattend;
import com.yxt.attend.api.appattend.App2AttendApi;
import com.yxt.attend.api.appattend.App2AttendQuery;
import com.yxt.attend.api.appattend.AppAttendTwoQuery;
import com.yxt.attend.api.attendance.Attendance;
import com.yxt.attend.api.attenderrand.AttendErrandVo;
import com.yxt.attend.api.attendholiday.AttendHolidaySet;
import com.yxt.attend.api.attendholiday.AttendHolidaySetQuery;
import com.yxt.attend.api.attendsigntype.AttendSignType;
import com.yxt.attend.api.attendstatistics.AttendStatistics;
import com.yxt.attend.api.attendtimetable.AttendTimetable;
import com.yxt.attend.biz.attendance.AttendanceService;
import com.yxt.attend.biz.attenderrand.AttendErrandService;
import com.yxt.attend.biz.attendholiday.AttendHolidaySetService;
import com.yxt.attend.biz.attendsigntype.AttendSignTypeService;
import com.yxt.attend.biz.attendstatistics.AttendStatisticsService;
import com.yxt.attend.biz.attendtimetable.AttendTimetableService;
import com.yxt.common.base.utils.DateUtils;
import com.yxt.common.base.utils.StringUtils;
import com.yxt.common.core.result.ResultBean;
import com.yxt.jlzx.system.api.department.DepartmentApi;
import com.yxt.jlzx.system.api.department.QrCodeVo;
import com.yxt.jlzx.system.api.user.UserApi;
import com.yxt.jlzx.system.api.user.UserInfoVo;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @author dimengzhe
* @date 2021/7/31 21:37
* @description
*/
@Controller
@RequestMapping("v2/appattends")
@Api(tags = "app考勤接口2")
public class App2AttendApiImpl implements App2AttendApi {
@Autowired
private DepartmentApi departmentApi;
@Autowired
private AttendSignTypeService attendSignTypeService;
@Autowired
private AttendanceService attendanceService;
@Autowired
private AttendTimetableService attendTimetableService;
@Autowired
private AttendHolidaySetService attendHolidaySetService;
@Autowired
private UserApi userApi;
@Autowired
private AttendStatisticsService attendStatisticsService;
@Autowired
private AttendErrandService attendErrandService;
//正常上下班打卡
@Override
public ResultBean normalRecord(AppAttendTwoQuery appAttendTwoQuery) {
String sbSid = appAttendTwoQuery.getSbsid();
//单位sid
String dwSid = appAttendTwoQuery.getDwsid();
//地理位置
String dlwz = appAttendTwoQuery.getDlwz();
//用户sid
String userSid = appAttendTwoQuery.getUsersid();
//姓名
String name = appAttendTwoQuery.getName();
//经纬度
String dlxx = appAttendTwoQuery.getJwd();
// a设备码q:企业码
String type = appAttendTwoQuery.getType();
Date today = new Date();
String date = DateUtils.dateConvertStr(today, "yyyy-MM-dd");
//开始时间
String startDate = DateUtils.dateConvertStr(today, "yyyy-MM");
String time = DateUtils.dateConvertStr(today, "HH:mm");
String now = DateUtils.dateConvertStr(today, "yyyy-MM-dd HH:mm:ss");
String year = date.substring(0, 4);
String month = date.substring(5, 7);
String day = date.substring(8, 10);
//查询签卡方式
AttendSignType attendanceSignType = attendSignTypeService.check(dwSid, startDate);
int signType = attendanceSignType.getType();
//判断该单位是否设置了打卡前后时间限制,为限制不允许在首页扫码
Boolean b = attendTimetableService.selectAttendTimetable(signType, appAttendTwoQuery.getDwsid(), startDate);
if (!b) {
return ResultBean.fireFail().setMsg("请先设置打卡时间限制");
}
//判断打卡类型:上午签到、上午签退、下午签到、下午签退
ResultBean<Attendance> r = attendTimetableService.selectCheckTime(userSid, signType, dwSid, startDate,date, time);
if (!r.getSuccess()) {
return ResultBean.fireFail().setMsg(r.getMsg());
}
//打卡次数类型
int signNumType = r.getData().getSignNumType();
int qdlx = signNumType;
//企业二维码,截取链接q
boolean flag = false;
if (type.equals("q")) {
if (sbSid.equals(dwSid)) {
flag = true;
} else {
return ResultBean.fireFail().setMsg("该二维码不属于您所属的单位!");
}
}
if (flag) {
UserInfoVo user = userApi.selectBysid(userSid).getData();
QrCodeVo deptuser = departmentApi.queryByStaffSid(user.getStaffSid()).getData();
Attendance attendance = new Attendance();
//查询本次是否有自动签到,有的话则删除
Attendance curAttendance = selectAttendance(userSid, qdlx, today);
if (null != curAttendance) {
attendanceService.deleteBySid(curAttendance.getSid());
App2AttendQuery app2AttendQuery = new App2AttendQuery();
app2AttendQuery.setAttendance(curAttendance);
app2AttendQuery.setDate(date);
app2AttendQuery.setDwSid(dwSid);
app2AttendQuery.setMonth(month);
app2AttendQuery.setUserSid(userSid);
//更新签到统计表中的信息
boolean isUpdated = updateStatistics(app2AttendQuery);
}
AttendTimetable attendanceTimetable = attendTimetableService.check(dwSid, startDate);
attendance.setUserSid(userSid);
attendance.setXm(name);
attendance.setDwSid(dwSid);
attendance.setSignDlwz(dlwz);
attendance.setYear(year);
attendance.setMonth(month);
attendance.setDay(date);
attendance.setSignDestDlwz("");
attendance.setSignTime(time);
attendance.setSignType(attendanceSignType.getType());
// signNumType打卡次数类型1、上午签到2、上午签退3、下午签到4、下午签退5、加班签到6、加班签退
attendance.setSignNumType(signNumType);
attendance.setDlxx(dlxx);
attendance.setIsAuto("2");
attendance.setOvTimeIsEnd(1);
// 最近一次打卡记录
Attendance lastAttend = attendanceService.selectLastByDay(userSid, date);
attendance.setOvTimeThis(0.0);
attendance.setOvTimeSum(null == lastAttend ? 0.0 : lastAttend.getOvTimeSum());
if (deptuser == null) {
attendance.setDeptPath("");
} else {
if (StringUtils.isEmpty(deptuser.getDepartmentName())) {
attendance.setDeptPath("");
} else {
attendance.setDeptPath(deptuser.getDepartmentName());
}
}
// 判断是否为公休日
Map<String, Object> map = new HashMap<String, Object>();
AttendHolidaySetQuery attendHolidaySetQuery = new AttendHolidaySetQuery();
attendHolidaySetQuery.setDwSid(dwSid);
attendHolidaySetQuery.setYear(year);
attendHolidaySetQuery.setMonth(month);
attendHolidaySetQuery.setDay(day);
AttendHolidaySet holidaySet = attendHolidaySetService.checkByDay(attendHolidaySetQuery);
// 差旅、外出、休假申请单
AttendErrandVo attendanceErrand = attendErrandService.selectByCurTime(userSid, now);
if (holidaySet == null) {
attendance.setType(0);
attendance.setSignDest(1);
// type:类型0、正常1、外勤2、差旅3、休假
// signDest:打卡去向1、单位2、外勤3、差旅4、休假
// signState:打卡状态1、正常2、迟到3、早退4、外勤5、差旅6、加班7、休假
double overtimeDay = 0.00;
if (attendanceSignType.getType() == 1) { // 2次签到
if (signNumType == 1) { // 上午签到
//判断是否设置打卡前期限或者打卡后期限,如果设置则不能打卡
if (StringUtils.isBlank(attendanceTimetable.getAmSignInAfterTerm()) || StringUtils.isBlank(attendanceTimetable.getAmSignOutAfterTerm())) {
if ((attendanceTimetable.getAmSignIn().substring(0, attendanceTimetable.getAmSignIn().length() - 1) + "1").compareTo(time) < 0) {
attendance.setSignState(2);
} else {
attendance.setSignState(1);
}
} else {
//判断是打卡前期限还是打卡后期限
if ((attendanceTimetable.getAmSignIn().substring(0, attendanceTimetable.getAmSignIn().length() - 1) + "1").compareTo(time) < 0) {
if (StringUtils.isNotBlank(attendanceTimetable.getAmSignInAfterTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getAmSignIn(), attendanceTimetable.getAmSignInAfterTerm(), signNumType, time, 0);
if (!istrueterm) {
System.out.println("打开的结果:您签到时间超过打卡时间区间 请不要再打!" + 1);
return ResultBean.fireFail().setMsg("您签到时间超过打卡时间区间 请不要再打!");
} else {
attendance.setSignState(2); // 正常
}
} else {
attendance.setSignState(2);
}
} else {
if (StringUtils.isNotBlank(attendanceTimetable.getAmSignInFrontTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getAmSignIn(), attendanceTimetable.getAmSignInFrontTerm(), signNumType, time, 1);
if (!istrueterm) {
System.out.println("打开的结果:您没在打卡时间区间内 请稍后再打!" + 2);
return ResultBean.fireFail().setMsg("您没在打卡时间区间内 请稍后再打!");
} else {
attendance.setSignState(1); // 正常
}
} else {
attendance.setSignState(1);
}
}
}
} else if (signNumType == 4) { // 下午签退
if (StringUtils.isBlank(attendanceTimetable.getPmSignOutAfterTerm()) || StringUtils.isBlank(attendanceTimetable.getPmSignOutFrontTerm())) {
if (attendanceTimetable.getPmSignOut().compareTo(time) <= 0) {
attendance.setSignState(1); // 正常
} else {
attendance.setSignState(3); // 早退
}
} else {
if (attendanceTimetable.getPmSignOut().compareTo(time) <= 0) {
if (StringUtils.isNotBlank(attendanceTimetable.getPmSignOutAfterTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getPmSignOut(), attendanceTimetable.getPmSignOutAfterTerm(), signNumType, time, 0);
if (!istrueterm) {
System.out.println("您签到时间超过打卡时间区间 请不要再打!");
return ResultBean.fireFail().setMsg("您签到时间超过打卡时间区间 请不要再打!");
} else {
// 正常
attendance.setSignState(1);
}
} else {
// 正常
attendance.setSignState(1);
}
} else {
if (StringUtils.isNotBlank(attendanceTimetable.getPmSignOutFrontTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getPmSignOut(), attendanceTimetable.getPmSignOutFrontTerm(), signNumType, time, 1);
if (!istrueterm) {
System.out.println("您没在打卡时间区间内 请稍后再打!");
return ResultBean.fireFail().setMsg("您没在打卡时间区间内 请稍后再打!");
} else {
attendance.setSignState(3); //早退
}
} else {
attendance.setSignState(3); // 早退
}
}
}
attendance.setOvTimeThis(0.0);
attendance.setOvTimeSum(null == lastAttend ? 0.0 : lastAttend.getOvTimeSum());
}
} else if (attendanceSignType.getType() == 2) { // 4次签到
if (signNumType == 1) { // 上午签到
//判断是否设置打卡前期限或者打卡后期限,如果设置则不能打卡
if (StringUtils.isBlank(attendanceTimetable.getAmSignInAfterTerm()) || StringUtils.isBlank(attendanceTimetable.getAmSignOutAfterTerm())) {
if ((attendanceTimetable.getAmSignIn().substring(0, attendanceTimetable.getAmSignIn().length() - 1) + "1").compareTo(time) < 0) {
attendance.setSignState(2);
} else {
attendance.setSignState(1);
}
} else {
//判断是打卡前期限还是打卡后期限
if ((attendanceTimetable.getAmSignIn().substring(0, attendanceTimetable.getAmSignIn().length() - 1) + "1").compareTo(time) < 0) {
if (StringUtils.isNotBlank(attendanceTimetable.getAmSignInAfterTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getAmSignIn(), attendanceTimetable.getAmSignInAfterTerm(), signNumType, time, 0);
if (!istrueterm) {
System.out.println("打开的结果:您签到时间超过打卡时间区间 请不要再打!" + 1);
return ResultBean.fireFail().setMsg("您签到时间超过打卡时间区间 请不要再打!");
} else {
attendance.setSignState(2); // 正常
}
} else {
attendance.setSignState(2);
}
} else {
if (StringUtils.isNotBlank(attendanceTimetable.getAmSignInFrontTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getAmSignIn(), attendanceTimetable.getAmSignInFrontTerm(), signNumType, time, 1);
if (!istrueterm) {
System.out.println("打开的结果:您没在打卡时间区间内 请稍后再打!" + 2);
return ResultBean.fireFail().setMsg("您没在打卡时间区间内 请稍后再打!");
} else {
attendance.setSignState(1); // 正常
}
} else {
attendance.setSignState(1);
}
}
}
} else if (signNumType == 2) {
// 上午签退
//判断是否设置打卡前期限或者打卡后期限,如果设置则不能打卡
if (StringUtils.isBlank(attendanceTimetable.getAmSignOutAfterTerm()) || StringUtils.isBlank(attendanceTimetable.getAmSignOutFrontTerm())) {
if (attendanceTimetable.getAmSignOut().compareTo(time) <= 0) {
attendance.setSignState(1); // 正常
} else {
attendance.setSignState(3); // 早退
}
} else {
//判断是打卡前期限还是打卡后期限
if (attendanceTimetable.getAmSignOut().compareTo(time) <= 0) {
//正常
if (StringUtils.isNotBlank(attendanceTimetable.getAmSignOutAfterTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getAmSignOut(), attendanceTimetable.getAmSignOutAfterTerm(), signNumType, time, 0);
if (!istrueterm) {
System.out.println("打开的结果:您签到时间超过打卡时间区间 请不要再打!" + 1);
return ResultBean.fireFail().setMsg("您签到时间超过打卡时间区间 请不要再打!");
} else {
attendance.setSignState(1); // 正常
}
} else {
attendance.setSignState(1); // 正常
}
} else {
if (StringUtils.isNotBlank(attendanceTimetable.getAmSignOutFrontTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getAmSignOut(), attendanceTimetable.getAmSignOutFrontTerm(), signNumType, time, 1);
if (!istrueterm) {
System.out.println("打开的结果:您没在打卡时间区间内 请稍后再打!" + 2);
return ResultBean.fireFail().setMsg("您没在打卡时间区间内 请稍后再打!");
} else {
attendance.setSignState(3); // 早退
}
} else {
attendance.setSignState(3); // 早退
}
}
}
attendance.setOvTimeThis(0.0);
attendance.setOvTimeSum(null == lastAttend ? 0.0 : lastAttend.getOvTimeSum());
} else if (signNumType == 3) {
// 下午签到
//判断是否设置打卡前期限或者打卡后期限,如果设置则不能打卡
if (StringUtils.isBlank(attendanceTimetable.getPmSignInFrontTerm()) || StringUtils.isBlank(attendanceTimetable.getPmSignInFrontTerm())) {
if ((attendanceTimetable.getPmSignIn().substring(0, attendanceTimetable.getPmSignIn().length() - 1) + "1").compareTo(time) < 0) {
attendance.setSignState(2); // 迟到
} else {
attendance.setSignState(1); // 正常
}
} else {
//判断是打卡前期限还是打卡后期限
if ((attendanceTimetable.getPmSignIn().substring(0, attendanceTimetable.getPmSignIn().length() - 1) + "1").compareTo(time) < 0) {
if (StringUtils.isNotBlank(attendanceTimetable.getPmSignInAfterTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getPmSignIn(), attendanceTimetable.getPmSignInAfterTerm(), signNumType, time, 0);
if (!istrueterm) {
System.out.println("打开的结果:您签到时间超过打卡时间区间 请不要再打!" + 1);
return ResultBean.fireFail().setMsg("您签到时间超过打卡时间区间 请不要再打!");
} else {
attendance.setSignState(2); // 正常
}
} else {
attendance.setSignState(2);//迟到
}
} else {
if (StringUtils.isNotBlank(attendanceTimetable.getPmSignInFrontTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getPmSignIn(), attendanceTimetable.getPmSignInFrontTerm(), signNumType, time, 1);
if (!istrueterm) {
System.out.println("打开的结果:您没在打卡时间区间内 请稍后再打!" + 2);
return ResultBean.fireFail().setMsg("您没在打卡时间区间内 请稍后再打!");
} else {
attendance.setSignState(1); // 正常
}
} else {
attendance.setSignState(1); // 正常
}
}
}
attendance.setOvTimeThis(0.0);
attendance.setOvTimeSum(null == lastAttend ? 0.0 : lastAttend.getOvTimeSum());
} else if (signNumType == 4) { // 下午签退
if (StringUtils.isBlank(attendanceTimetable.getPmSignOutAfterTerm()) || StringUtils.isBlank(attendanceTimetable.getPmSignOutFrontTerm())) {
if (attendanceTimetable.getPmSignOut().compareTo(time) <= 0) {
attendance.setSignState(1); // 正常
} else {
attendance.setSignState(3); // 早退
}
} else {
if (attendanceTimetable.getPmSignOut().compareTo(time) <= 0) {
if (StringUtils.isNotBlank(attendanceTimetable.getPmSignOutAfterTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getPmSignOut(), attendanceTimetable.getPmSignOutAfterTerm(), signNumType, time, 0);
if (!istrueterm) {
System.out.println("您签到时间超过打卡时间区间 请不要再打!");
return ResultBean.fireFail().setMsg("您签到时间超过打卡时间区间 请不要再打!");
} else {
attendance.setSignState(1); // 正常
}
} else {
attendance.setSignState(1); // 正常
}
} else {
if (StringUtils.isNotBlank(attendanceTimetable.getPmSignOutFrontTerm())) {
Boolean istrueterm = istrueterm(attendanceTimetable.getPmSignOut(), attendanceTimetable.getPmSignOutFrontTerm(), signNumType, time, 1);
if (!istrueterm) {
System.out.println("您没在打卡时间区间内 请稍后再打!");
return ResultBean.fireFail().setMsg("您没在打卡时间区间内 请稍后再打!");
} else {
attendance.setSignState(3); // 早退
}
} else {
attendance.setSignState(3); // 早退
}
}
}
attendance.setOvTimeThis(0.0);
attendance.setOvTimeSum(null == lastAttend ? 0.0 : lastAttend.getOvTimeSum());
}
}
if (null != attendanceErrand) {
attendance.setSignDestDlwz(attendanceErrand.getDestDlwz());
}
}
attendanceService.save(attendance);
//更新统计表
Map<String, Object> m = new HashMap<String, Object>();
m.put("dwSid", dwSid);
m.put("userSid", userSid);
m.put("year", year);
m.put("month", month);
AttendStatistics attendanceStatistics = attendStatisticsService.selectByUserSid(m);
if (null == attendanceStatistics) {
attendanceStatistics = new AttendStatistics();
// 全月天数
double allDay = DateUtils.getMonthLastDay(Integer.valueOf(date.substring(0, 4)), Integer.valueOf(date.substring(5, 7)));
// 休假天数
double vacationDay = 0.00;
// 加班天数
double overtimeDay = 0.00;
// 差旅天数
double tripDay = 0.00;
// 计算公休天数
double holidayNum = 0;
String holidays = attendHolidaySetService.getDaysByMonth(m);
if (!StringUtils.isEmpty(holidays)) {
String[] strings = holidays.split(",");
if (strings.length > 0) {
for (int k = 0; k < strings.length; k++) {
int temp = Integer.parseInt(strings[k]);
if (temp > 0 && temp <= 31) {
holidayNum += 1;
}
}
}
}
// 计算全勤天数(全月天数-公休天数)
double allAttendanceDay = allDay - holidayNum;
// 出勤天数
double attendanceDay = calAttendanceDay(userSid, date, Integer.valueOf(qdlx), attendanceSignType.getType());
// 缺勤天数(初始化是同全勤天数)
double absenceDay = allAttendanceDay - attendanceDay;
// 应签次数:根据全勤天数*签卡次数2次或4次
int supposedNum = attendanceSignType.getType() * 2 * (new Double(allAttendanceDay)).intValue();
// 正常、早退、迟到次数、初始化1或0
// 漏签次数:初始化是同应签次数,工作日有签到、签退即-1
int missNum = supposedNum;
int normalNum = 0;
int lateNum = 0;
int earlyNum = 0;
if (attendance.getSignState() == 1) {
normalNum = 1;
lateNum = 0;
earlyNum = 0;
missNum = missNum - 1;
} else if (attendance.getSignState() == 2) {
normalNum = 0;
lateNum = 1;
earlyNum = 0;
missNum = missNum - 1;
} else if (attendance.getSignState() == 3) {
normalNum = 0;
lateNum = 0;
earlyNum = 1;
missNum = missNum - 1;
} else if (attendance.getSignState() == 4) { // 4、外勤5、差旅6、加班7、休假
attendanceStatistics.setOutNum(1);
missNum = missNum - 1;
} else if (attendance.getSignState() == 5) { // 4、外勤5、差旅6、加班7、休假
attendanceStatistics.setTripNum(1);
missNum = missNum - 1;
} else if (attendance.getSignState() == 6) { // 4、外勤5、差旅6、加班7、休假
if (attendance.getSignNumType() == 6) { // 加班签退
/* 计算加班天数时不足半小时不计超过半小时按1小时计也就是说加班天数最短1小时为0.125天,
也就是说加班天数只有0.125天、0.25天、0.375天、0.5天等,依此类推。 */
// 计算加班时长
Attendance attendance2 = attendanceService.checkBySignNumType(userSid, date, 5);
if (null != attendance2) {
String signTime5 = attendance2.getSignTime();
double diffHour = DateUtils.dateDiff1(signTime5, attendance.getSignTime());
if (diffHour < 0.5) {
overtimeDay = 0;
} else {
for (int i = 0; i <= 24; i++) {
if (diffHour >= (i - 0.5) && diffHour < (i + 0.5)) {
overtimeDay = i * 0.125;
}
}
}
}
attendanceStatistics.setOvTimeNum(1);
attendanceStatistics.setOvertimeDay(overtimeDay);
}
} else if (attendance.getSignState() == 7) { // 4、外勤5、差旅6、加班7、休假
attendanceStatistics.setVacationNum(1);
missNum = missNum - 1;
}
// 差旅、外勤次数:根据打卡状态判断去+1
attendanceStatistics.setDwSid(dwSid);
attendanceStatistics.setUserSid(userSid);
attendanceStatistics.setYear(year);
attendanceStatistics.setMonth(month);
attendanceStatistics.setAllDay(allDay);
attendanceStatistics.setAllAttendanceDay(allAttendanceDay);
attendanceStatistics.setAttendanceDay(attendanceDay);
attendanceStatistics.setOvertimeDay(overtimeDay);
attendanceStatistics.setTripDay(tripDay);
attendanceStatistics.setVacationDay(vacationDay);
attendanceStatistics.setAbsenceDay(absenceDay);
attendanceStatistics.setSupposedNum(supposedNum);
attendanceStatistics.setNormalNum(normalNum);
attendanceStatistics.setLateNum(lateNum);
attendanceStatistics.setEarlyNum(earlyNum);
attendanceStatistics.setMissNum(missNum);
if (deptuser == null) {
attendanceStatistics.setDeptPath("");
} else {
if (StringUtils.isEmpty(deptuser.getDepartmentName())) {
attendanceStatistics.setDeptPath("");
} else {
attendanceStatistics.setDeptPath(deptuser.getDepartmentName());
}
}
attendStatisticsService.save(attendanceStatistics);
} else {
// 出勤天数
double attendanceDay = calAttendanceDay(userSid, date, Integer.valueOf(qdlx), attendanceSignType.getType());
attendanceStatistics.setAttendanceDay(attendanceStatistics.getAttendanceDay() + attendanceDay);
// 缺勤天数
attendanceStatistics.setAbsenceDay(attendanceStatistics.getAbsenceDay() - attendanceDay);
// 加班天数
double overtimeDay = 0.00;
// 差旅、外勤次数:根据打卡状态判断去+1
if (attendance.getSignState() == 1) { // 1、正常2、迟到3、早退
attendanceStatistics.setNormalNum(attendanceStatistics.getNormalNum() + 1);
attendanceStatistics.setMissNum(attendanceStatistics.getMissNum() - 1);
} else if (attendance.getSignState() == 2) {
attendanceStatistics.setLateNum(attendanceStatistics.getLateNum() + 1);
attendanceStatistics.setMissNum(attendanceStatistics.getMissNum() - 1);
} else if (attendance.getSignState() == 3) {
attendanceStatistics.setEarlyNum(attendanceStatistics.getEarlyNum() + 1);
attendanceStatistics.setMissNum(attendanceStatistics.getMissNum() - 1);
} else if (attendance.getSignState() == 4) { // 4、外勤5、差旅6、加班7、休假
attendanceStatistics.setOutNum(attendanceStatistics.getOutNum() + 1);
attendanceStatistics.setMissNum(attendanceStatistics.getMissNum() - 1);
} else if (attendance.getSignState() == 5) { // 4、外勤5、差旅6、加班7、休假
attendanceStatistics.setTripNum(attendanceStatistics.getTripNum() + 1);
attendanceStatistics.setMissNum(attendanceStatistics.getMissNum() - 1);
} else if (attendance.getSignState() == 6) { // 4、外勤5、差旅6、加班7、休假
if (attendance.getSignNumType() == 6) { // 加班签退
// 计算加班时长
Attendance attendance2 = attendanceService.checkBySignNumType(userSid, date, 5);
if (null != attendance2) {
String signTime5 = attendance2.getSignTime();
double diffHour = DateUtils.dateDiff1(signTime5, attendance.getSignTime());
/*计算加班天数时不足半小时不计超过半小时按1小时计也就是说加班天数最短1小时为0.125天,
也就是说加班天数只有0.125天、0.25天、0.375天、0.5天等,依此类推。
*/
// 小时折算天数
if (diffHour < 0.5) {
overtimeDay = 0;
} else {
for (int i = 0; i <= 24; i++) {
if (diffHour >= (i - 0.5) && diffHour < (i + 0.5)) {
overtimeDay = i * 0.125;
}
}
}
}
attendanceStatistics.setOvTimeNum(attendanceStatistics.getOvTimeNum() + 1);
attendanceStatistics.setOvertimeDay(attendanceStatistics.getOvertimeDay() + overtimeDay);
}
} else if (attendance.getSignState() == 7) { // 4、外勤5、差旅6、加班7、休假
attendanceStatistics.setVacationNum(attendanceStatistics.getVacationNum() + 1);
attendanceStatistics.setMissNum(attendanceStatistics.getMissNum() - 1);
}
attendStatisticsService.updateById(attendanceStatistics);
}
} else {
return ResultBean.fireFail().setMsg("该设备不属于您所属的单位!");
}
return ResultBean.fireSuccess().setMsg("操作成功!");
}
//加班签到打卡
//公休
public Attendance selectAttendance(String userSid, int qdlx, Date today) {
// 查询本次是否有自动签到,有的话则删除
Map<String, Object> curMap = new HashMap<String, Object>();
curMap.put("userSid", userSid);
curMap.put("day", DateUtils.dateConvertStr(today, "yyyy-MM-dd"));
curMap.put("signNumType", qdlx);
curMap.put("isAuto", "1");
Attendance curAttendance = attendanceService.selectBySignTime(curMap);
return curAttendance;
}
/**
* 更新签到统计表
*
* @param app2AttendQuery 参数
* @return
*/
public boolean updateStatistics(App2AttendQuery app2AttendQuery) {
//单位sid
String dwSid = app2AttendQuery.getDwSid();
//用户sid
String userSid = app2AttendQuery.getUserSid();
//年
String year = app2AttendQuery.getYear();
//月
String month = app2AttendQuery.getMonth();
String date = app2AttendQuery.getDate();
Attendance curAttendance = app2AttendQuery.getAttendance();
// 打卡状态1、正常2、迟到3、早退4、外勤5、差旅6、加班7、休假8、公休9、离职10、入职
int signState = curAttendance.getSignState();
// 签到统计表操作:更改统计数字
Map<String, Object> m1 = new HashMap<>();
m1.put("dwSid", dwSid);
m1.put("userSid", userSid);
m1.put("year", year);
m1.put("month", month);
AttendStatistics attendanceStatistics1 = attendStatisticsService.selectByUserSid(m1);
if (signState == 4) {
attendanceStatistics1.setOutNum(attendanceStatistics1.getOutNum() - 1);
attendanceStatistics1.setMissNum(attendanceStatistics1.getMissNum() + 1);
} else if (signState == 5) {
attendanceStatistics1.setTripNum(attendanceStatistics1.getTripNum() - 1);
attendanceStatistics1.setMissNum(attendanceStatistics1.getMissNum() + 1);
} else if (signState == 7) {
attendanceStatistics1.setVacationNum(attendanceStatistics1.getVacationNum() - 1);
attendanceStatistics1.setMissNum(attendanceStatistics1.getMissNum() + 1);
}
// 出勤天数
double attendanceDay = calAttendanceDay(userSid, date, curAttendance.getSignNumType(), curAttendance.getSignType());
// 出勤天数
attendanceStatistics1.setAttendanceDay(attendanceStatistics1.getAttendanceDay() - attendanceDay);
// 缺勤天数
attendanceStatistics1.setAbsenceDay(attendanceStatistics1.getAbsenceDay() + attendanceDay);
boolean isUpdated = attendStatisticsService.updateById(attendanceStatistics1);
return isUpdated;
}
/**
* 计算出勤天数以0.5天为单位计算
* 四次打卡每半天签到签退一次加0.5天,如半天两次打卡不完整则不计天数,如只打两头,则不计天数
*
* @param userSid 用户sid
* @param today 日期
* @param signNumType 1、上午签到2、上午签退3、下午签到4、下午签退
* @param type 1、2次签卡 2、4次签卡
* @return
*/
public double calAttendanceDay(String userSid, String today, int signNumType, int type) {
double attendanceDay = 0;
if (type == 1) {
if (signNumType == 4) {
Attendance attendance = attendanceService.checkBySignNumType(userSid, today, 1);
if (null != attendance) {
attendanceDay = 1;
}
} else if (signNumType == 1) {
Attendance attendance = attendanceService.checkBySignNumType(userSid, today, 4);
if (null != attendance) {
attendanceDay = 1;
}
}
} else {
Attendance attendance = null;
if (signNumType == 1) {
attendance = attendanceService.checkBySignNumType(userSid, today, 2);
} else if (signNumType == 2) {
attendance = attendanceService.checkBySignNumType(userSid, today, 1);
} else if (signNumType == 3) {
attendance = attendanceService.checkBySignNumType(userSid, today, 4);
} else if (signNumType == 4) {
attendance = attendanceService.checkBySignNumType(userSid, today, 3);
}
if (null != attendance) {
attendanceDay = 0.5;
}
}
return attendanceDay;
}
//根据期限设置以及签到时间判断能否打卡
public Boolean istrueterm(String sign, String term, int signNumType, String time, int ischidao) {
Boolean b = true;
//将设置的时间转化为分钟并于设置签到时间对比得到正确时间
Double aDouble = Double.valueOf(term);
double v = aDouble * 60;
int timeterm = new Double(v).intValue();
//将签到时间转换为分钟
int timeqiandao = Integer.valueOf(sign.substring(0, 2)) * 60 + Integer.valueOf(sign.substring(3, 5));
//根据打卡类型计算两个时间得到签到时间
int timeend = 0;
if (ischidao == 0) {
timeend = timeqiandao + timeterm;
} else {
timeend = timeqiandao - timeterm;
}
String resultStr = "";
//将分钟转成小时
if (timeend != 0) {
if (timeend / 60 == 0) {
resultStr = "00:" + timeend % 60;
} else {
if (timeend % 60 == 0) {
resultStr = timeend / 60 + ":00";
} else {
resultStr = (timeend / 60 + ":" + timeend % 60);
}
}
} else {
resultStr = "00:00";
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
Date dateTime = null;
try {
dateTime = simpleDateFormat.parse(resultStr);
} catch (ParseException e) {
e.printStackTrace();
}
String resultTime = DateUtils.dateConvertStr(dateTime, "HH:mm");
System.out.println(resultTime);
//根据迟到或早退来判断是否能继续打卡
if (ischidao == 0) {
if (resultTime.compareTo(time) < 0) {
b = false;
}
} else {
if (resultTime.compareTo(time) > 0) {
b = false;
}
}
return b;
}
}

View File

@@ -0,0 +1,27 @@
package com.yxt.attend.biz.appattend;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
/**
* @author dimengzhe
* @date 2021/8/2 13:41
* @description
*/
@Component
public class AttendanceCronAutoStart implements CommandLineRunner {
@Autowired
private AttendanceScheduleTask attendanceScheduleTask;
private HttpServletRequest request;
@Override
public void run(String... args) throws Exception {
attendanceScheduleTask.startCron(request);
System.out.println("考勤定时任务启动啦。撒花撒花");
}
}

View File

@@ -0,0 +1,165 @@
package com.yxt.attend.biz.appattend;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.yxt.attend.api.attendance.Attendance;
import com.yxt.attend.api.attendstatistics.AttendStatistics;
import com.yxt.attend.biz.attendance.AttendanceService;
import com.yxt.attend.biz.attenderrand.AttendErrandService;
import com.yxt.attend.biz.attendholiday.AttendHolidaySetService;
import com.yxt.attend.biz.attendsigntype.AttendSignTypeService;
import com.yxt.attend.biz.attendstatistics.AttendStatisticsService;
import com.yxt.attend.biz.attendtimetable.AttendTimetableService;
import com.yxt.common.base.utils.DateUtils;
import com.yxt.common.base.utils.StringUtils;
import com.yxt.jlzx.system.api.department.DepartmentApi;
import com.yxt.jlzx.system.api.department.QrCodeVo;
import com.yxt.jlzx.system.api.user.UserApi;
import com.yxt.jlzx.system.api.user.UserInfoVo;
/**
* 加班签退、签到
* @author Administrator
*
*/
@Component
@Configurable
@EnableScheduling
public class AttendanceOvTimeScheduler {
/**
* 考勤签到信息
*/
@Autowired
private AttendanceService attendanceService;
/**
* 休假、差旅、外勤申请单
*/
@Autowired
private AttendErrandService attendanceErrandService;
/**
* 考勤统计数据
*/
@Autowired
private AttendStatisticsService attendanceStatisticsService;
/**
* 公休日
*/
@Autowired
private AttendHolidaySetService attendanceHolidaySetService;
/**
* 签卡方式
*/
@Autowired
private AttendSignTypeService attendanceSignTypeService;
/**
* 作息时间
*/
@Autowired
private AttendTimetableService attendanceTimetableService;
@Autowired
private DepartmentApi departmentApi;
@Autowired
private UserApi userApi;
/**
* 已取消,改为实时更新
* 差旅、外勤未打卡每天凌晨5秒补充加班签到签退未打卡数据
*/
@Transactional
@Scheduled(cron = "0 4 16 * * ?")
public void insertAttendance(){
Date date = new Date();
String today = DateUtils.dateConvertStr(date, "yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, -1);
date = (Date) calendar.getTime();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String yesterday = df.format(date);
List<Attendance> ovTimeList = attendanceService.selectOvTime("", yesterday);
for (Attendance attend : ovTimeList) {
attend.setOvTimeIsEnd(1);
attendanceService.updateById(attend);
Attendance attendance = new Attendance();
BeanUtils.copyProperties(attend, attendance);
UserInfoVo user = userApi.selectBysid(attend.getUserSid()).getData();
QrCodeVo deptuser = departmentApi.queryByStaffSid(user.getStaffSid()).getData();
if(deptuser == null) {
attendance.setDeptPath("");
}else {
if(StringUtils.isEmpty(deptuser.getDepartmentName())) {
attendance.setDeptPath("");
}else {
attendance.setDeptPath(deptuser.getDepartmentName());
}
}
// 计算加班时长
double overtimeDay = 0.00;
String signTime5 = attend.getSignTime();
String signTime = "23:59"; // 系统默认
double diffHour = DateUtils.dateDiff1(signTime5, signTime);
if(diffHour < 0.5) {
overtimeDay = 0;
}else {
for (int i = 0; i <= 24; i++) {
if(diffHour>=(i-0.5) && diffHour<(i+0.5)) {
overtimeDay = i * 0.125;
}
}
}
attendance.setOvTimeIsEnd(1);
attendance.setIsAuto("1");
attendance.setOvTimeThis(overtimeDay);
Attendance lastAttend = attendanceService.selectLastByDay(attend.getUserSid(), yesterday);
attendance.setOvTimeSum(null == lastAttend ? 0.0:lastAttend.getOvTimeSum()+overtimeDay);
attendance.setSignTime(signTime);
attendance.setSignNumType(6);
attendance.setSid(UUID.randomUUID().toString());
// 插入昨天加班签退
attendanceService.insert(attendance);
// 签到统计表操作
Map<String, Object> m = new HashMap<String, Object>();
m.put("dwSid", attend.getDwSid());
m.put("userSid", attend.getUserSid());
m.put("year", DateUtils.dateConvertStr(date, "yyyy"));
m.put("month", DateUtils.dateConvertStr(date, "MM"));
AttendStatistics attendanceStatistics = attendanceStatisticsService.selectByUserSid(m);
attendanceStatistics.setOvTimeNum(attendanceStatistics.getOvTimeNum()+1);
attendanceStatistics.setOvertimeDay(attendanceStatistics.getOvertimeDay()+overtimeDay);
attendanceStatisticsService.updateById(attendanceStatistics);
// 插入今天加班签到
signTime = "00:00";
attendance.setYear(today.substring(0,4));
attendance.setMonth(today.substring(5, 7));
attendance.setDay(today);
attendance.setSignTime(signTime);
attendance.setSignNumType(5);
attendance.setOvTimeIsEnd(0);
attendance.setOvTimeThis(0.0);
attendance.setOvTimeSum(0.0);
attendance.setSid(UUID.randomUUID().toString());
attendanceService.insert(attendance);
}
}
}

View File

@@ -0,0 +1,424 @@
package com.yxt.attend.biz.appattend;
import com.yxt.attend.api.attendance.Attendance;
import com.yxt.attend.api.attenderrand.AttendErrand;
import com.yxt.attend.api.attendholiday.AttendHolidaySet;
import com.yxt.attend.api.attendholiday.AttendHolidaySetQuery;
import com.yxt.attend.api.attendschedule.AttendSchedule;
import com.yxt.attend.api.attendsigntype.AttendSignType;
import com.yxt.attend.api.attendstatistics.AttendStatistics;
import com.yxt.attend.api.attendtimetable.AttendTimetable;
import com.yxt.attend.biz.attendance.AttendanceService;
import com.yxt.attend.biz.attenderrand.AttendErrandService;
import com.yxt.attend.biz.attendholiday.AttendHolidaySetService;
import com.yxt.attend.biz.attendschedule.AttendScheduleService;
import com.yxt.attend.biz.attendsigntype.AttendSignTypeService;
import com.yxt.attend.biz.attendstatistics.AttendStatisticsService;
import com.yxt.attend.biz.attendtimetable.AttendTimetableService;
import com.yxt.common.base.utils.DateUtils;
import com.yxt.common.base.utils.StringUtils;
import com.yxt.jlzx.system.api.department.DepartmentApi;
import com.yxt.jlzx.system.api.department.QrCodeVo;
import com.yxt.jlzx.system.api.departmentstaff.DepartmentStaffApi;
import com.yxt.jlzx.system.api.user.UserApi;
import com.yxt.jlzx.system.api.user.UserInfoVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.concurrent.ScheduledFuture;
/**
* @author dimengzhe
* @date 2020/11/24 11:24
* @description
*/
@ComponentScan
@RestController
@RequestMapping("/attendanceScheduleTask")
public class AttendanceScheduleTask {
@Autowired
private AttendScheduleService attendScheduleService;
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
@Autowired
private UserApi userApi;
@Autowired
private AttendTimetableService attendTimetableService;
@Autowired
private AttendSignTypeService attendSignTypeService;
@Autowired
private AttendErrandService attendErrandService;
@Autowired
private AttendanceService attendanceService;
@Autowired
private DepartmentStaffApi departmentStaffApi;
@Autowired
private AttendStatisticsService attendStatisticsService;
@Autowired
private AttendHolidaySetService attendanceHolidaySetService;
@Autowired
private DepartmentApi departmentApi;
private ScheduledFuture<?> future;
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
@Autowired(required = false)
private HttpServletRequest request;
@PostMapping("/restart")
public void restart() {
stopCron();// 先停止,在开启.
startCron(request);
}
@PostMapping("/stopCron")
public void stopCron() {
if (future != null) {
future.cancel(true);
}
}
@PostMapping("/startCron")
public void startCron(HttpServletRequest request) {
List<AttendSchedule> list = attendScheduleService.listOne();
List<String> cronList = new ArrayList<String>();
for (AttendSchedule attendanceSchedule : list) {
if (!StringUtils.isEmpty(attendanceSchedule.getAmSignInCron())) {
cronList.add(attendanceSchedule.getAmSignInCron());
}
if (!StringUtils.isEmpty(attendanceSchedule.getAmSignOutCron())) {
cronList.add(attendanceSchedule.getAmSignOutCron());
}
if (!StringUtils.isEmpty(attendanceSchedule.getPmSignInCron())) {
cronList.add(attendanceSchedule.getPmSignInCron());
}
if (!StringUtils.isEmpty(attendanceSchedule.getPmSignOutCron())) {
cronList.add(attendanceSchedule.getPmSignOutCron());
}
}
for (String cron : cronList) {
future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger(cron));
}
}
private class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("定时任务执行");
insetAttendance();
}
}
/**
* 加班签退
*
* @param signTime 签退时间
* @param date 日期
*/
@Transactional
public void insertOvTimeData(String dwSid, String signTime, String date) {
List<Attendance> ovTimeList = attendanceService.selectOvTime(dwSid, date);
for (Attendance attend : ovTimeList) {
attend.setOvTimeIsEnd(1);
attendanceService.updateById(attend);
Attendance attendance = new Attendance();
BeanUtils.copyProperties(attend, attendance);
// 判断是否为公休日
AttendHolidaySetQuery attendHolidaySetQuery = new AttendHolidaySetQuery();
attendHolidaySetQuery.setDwSid(dwSid);
attendHolidaySetQuery.setYear(date.substring(0, 4));
attendHolidaySetQuery.setMonth(date.substring(5, 7));
attendHolidaySetQuery.setDay(date.substring(8, 10));
AttendHolidaySet holidaySet = attendanceHolidaySetService.checkByDay(attendHolidaySetQuery);
if (null == holidaySet) {
// 非公休日
UserInfoVo user = userApi.selectBysid(attend.getUserSid()).getData();
QrCodeVo deptuser = departmentApi.queryByStaffSid(user.getStaffSid()).getData();
// DepartmentStaff deptuser = departmentStaffApi.selectByStaffSid(user.getStaffSid()).getData();
if (deptuser == null) {
attendance.setDeptPath("");
} else {
if (StringUtils.isEmpty(deptuser.getDepartmentName())) {
attendance.setDeptPath("");
} else {
attendance.setDeptPath(deptuser.getDepartmentName());
}
}
// 计算加班时长
double overtimeDay = 0.00;
String signTime5 = attend.getSignTime();
double diffHour = DateUtils.dateDiff1(signTime5, signTime);
if (diffHour < 0.5) {
overtimeDay = 0;
} else {
for (int i = 0; i <= 24; i++) {
if (diffHour >= (i - 0.5) && diffHour < (i + 0.5)) {
overtimeDay = i * 0.125;
}
}
}
attendance.setOvTimeIsEnd(1);
attendance.setIsAuto("1");
attendance.setOvTimeThis(overtimeDay);
Attendance lastAttend = attendanceService.selectLastByDay(attend.getUserSid(), date);
attendance.setOvTimeSum(null == lastAttend ? 0.0 : lastAttend.getOvTimeSum() + overtimeDay);
attendance.setSignTime(signTime);
attendance.setSignNumType(6);
attendanceService.save(attendance);
// 签到统计表操作
Map<String, Object> m = new HashMap<String, Object>();
m.put("dwSid", attendance.getDwSid());
m.put("userSid", attendance.getUserSid());
m.put("year", attendance.getYear());
m.put("month", attendance.getMonth());
AttendStatistics attendanceStatistics = attendStatisticsService.selectByUserSid(m);
attendanceStatistics.setOvTimeNum(attendanceStatistics.getOvTimeNum() + 1);
attendanceStatistics.setOvertimeDay(attendanceStatistics.getOvertimeDay() + overtimeDay);
attendStatisticsService.updateById(attendanceStatistics);
}
}
}
// 根据单位设置的考勤时间插入相应的打卡记录
private void insetAttendance() {
Date date = new Date();
String signTime = DateUtils.dateConvertStr(date, "HH:mm");
String today = DateUtils.dateConvertStr(date, "yyyy-MM-dd");
String nowTime = DateUtils.dateConvertStr(date, "yyyy-MM-dd HH:mm");
List<AttendTimetable> list = attendTimetableService.selectBySignTime(signTime);
for (AttendTimetable attendanceTimetable : list) {
String dwSid = attendanceTimetable.getDwSid();
// 加班签退设置
if (signTime.equals(attendanceTimetable.getAmSignIn())) {
insertOvTimeData(dwSid, attendanceTimetable.getAmSignIn(), today);
} else if (signTime.equals(attendanceTimetable.getPmSignIn())) {
insertOvTimeData(dwSid, attendanceTimetable.getPmSignIn(), today);
}
AttendSignType attendanceSignType = attendSignTypeService.check(dwSid, DateUtils.dateConvertStr(date, "yyyy-MM"));
Map<String, Object> map = new HashMap<String, Object>();
map.put("dwSid", dwSid);
map.put("nowTime", nowTime);
//查询出当前时间所有有设置作息时间的单位
List<AttendErrand> list2 = attendErrandService.selectByDwsidAndTime(map);
for (AttendErrand attendanceErrand : list2) {
// 有无打卡记录
String userSid = attendanceErrand.getUserSid();
int signNumType = 0;
if (signTime.equals(attendanceTimetable.getAmSignIn().substring(0,5))) {
signNumType = 1;
} else if (signTime.equals(attendanceTimetable.getAmSignOut().substring(0,5))) {
signNumType = 2;
} else if (signTime.equals(attendanceTimetable.getPmSignIn().substring(0,5))) {
signNumType = 3;
} else if (signTime.equals(attendanceTimetable.getPmSignOut().substring(0,5))) {
signNumType = 4;
}
Map<String, Object> m = new HashMap<String, Object>();
m.put("userSid", userSid);
m.put("day", today);
m.put("signNumType", signNumType);
Attendance attendance = attendanceService.selectBySignTime(m);
if (null == attendance) { // 没有这条打卡记录
// 出勤天数
double attendanceDay = 0.0;
// 差旅天数
double tripDay = 0.00;
// 差旅次数
int tripNum = 0;
// 外勤次数
int outNum = 0;
// 休假次数
int vacationNum = 0;
// 漏签次数
int missNum = 0;
attendance = new Attendance();
attendance.setXm(attendanceErrand.getApplicant());
attendance.setDwSid(dwSid);
attendance.setUserSid(userSid);
attendance.setYear(today.substring(0, 4));
attendance.setMonth(today.substring(5, 7));
attendance.setDay(today);
attendance.setSignDestDlwz("");
UserInfoVo u = userApi.selectBysid(userSid).getData();
// DepartmentStaff departmentStaff = departmentStaffApi.selectByStaffSid(u.getStaffSid()).getData();
QrCodeVo deptuser = departmentApi.queryByStaffSid(u.getStaffSid()).getData();
if (deptuser == null) {
attendance.setDeptPath("");
} else {
if (StringUtils.isEmpty(deptuser.getDepartmentName())) {
attendance.setDeptPath("");
} else {
attendance.setDeptPath(deptuser.getDepartmentName());
}
}
// attendanceErrand :type类型1、差旅2、外勤3、休假
// attendance :type类型0、正常1、外勤2、差旅3、休假
// attendance :signDest类型1、单位2、外勤3、差旅4、休假
// attendance :signState类型打卡状态1、正常2、迟到3、早退4、外勤5、差旅6、加班7、休假8、公休
if (attendanceErrand.getType() == 1) {
attendance.setType(2);
attendance.setSignDest(3);
attendance.setSignState(5);
attendance.setSignDestDlwz(attendanceErrand.getDestDlwz());
tripNum = 1;
} else if (attendanceErrand.getType() == 2) {
attendance.setType(1);
attendance.setSignDest(2);
attendance.setSignState(4);
attendance.setSignDestDlwz(attendanceErrand.getDestDlwz());
outNum = 1;
} else if (attendanceErrand.getType() == 3) {
attendance.setType(3);
attendance.setSignDest(4);
attendance.setSignState(7);
attendance.setSignDestDlwz("");
vacationNum = 1;
}
attendance.setSignType(attendanceSignType.getType()); // 打卡类型12次2:4次
attendance.setSignTime(signTime);
attendance.setSignDlwz(StringUtils.isEmpty(attendanceErrand.getDestDlwz()) ? "" : attendanceErrand.getDestDlwz());
attendance.setSignNumType(signNumType);
attendance.setDlxx("0.0,0.0"); // 暂时默认
attendance.setIsAuto("1");
attendance.setOvTimeIsEnd(1);
// 最近一次打卡记录
Attendance lastAttend = attendanceService.selectLastByDay(userSid, today);
attendance.setOvTimeThis(0.0);
attendance.setOvTimeSum(null == lastAttend ? 0.0 : lastAttend.getOvTimeSum());
attendanceService.save(attendance);
// 签到统计表操作
if (attendanceSignType.getType() == 1) {
if (signNumType == 4) {
Attendance checkAttend = attendanceService.checkBySignNumType(userSid, today, 1);
if (checkAttend != null) {
attendanceDay = 1.0;
}
}
} else {
if (signNumType == 2) {
Attendance checkAttend = attendanceService.checkBySignNumType(userSid, today, 1);
if (checkAttend != null) {
attendanceDay = 0.5;
}
} else if (signNumType == 4) {
Attendance checkAttend = attendanceService.checkBySignNumType(userSid, today, 3);
if (checkAttend != null) {
attendanceDay = 0.5;
}
}
}
Map<String, Object> mapTj = new HashMap<String, Object>();
mapTj.put("dwSid", dwSid);
mapTj.put("userSid", userSid);
mapTj.put("year", today.substring(0, 4));
mapTj.put("month", today.substring(5, 7));
m.put("year", today.substring(0, 4));
m.put("month", today.substring(5, 7));
AttendStatistics attendanceStatistics = attendStatisticsService.selectByUserSid(m);
if (null == attendanceStatistics) {
attendanceStatistics = new AttendStatistics();
// 全月天数
double allDay = DateUtils.getMonthLastDay(Integer.valueOf(today.substring(0, 4)), Integer.valueOf(today.substring(5, 7)));
// 休假天数
double vacationDay = 0.00;
// 加班天数
double overtimeDay = 0.00;
// 计算公休天数
double holidayNum = 0;
String holidays = attendanceHolidaySetService.getDaysByMonth(mapTj);
if (!StringUtils.isEmpty(holidays)) {
String[] strings = holidays.split(",");
if (strings.length > 0) {
for (int k = 0; k < strings.length; k++) {
int temp = Integer.parseInt(strings[k]);
if (temp > 0 && temp <= 31) {
holidayNum += 1;
}
}
}
}
// 计算全勤天数(全月天数-公休天数)
double allAttendanceDay = allDay - holidayNum;
// 缺勤天数(初始化是同全勤天数)
double absenceDay = allAttendanceDay - attendanceDay;
// 应签次数:根据全勤天数*签卡次数2次或4次
int supposedNum = attendanceSignType.getType() * 2 * (new Double(allAttendanceDay)).intValue();
// 正常、早退、迟到次数、初始化1或0
// 漏签次数:初始化是同应签次数,工作日有签到、签退即-1
// int missNum = supposedNum;
int normalNum = 0;
int lateNum = 0;
int earlyNum = 0;
missNum = supposedNum - missNum;
// 差旅、外勤次数:根据打卡状态判断去+1
attendanceStatistics.setDwSid(dwSid);
attendanceStatistics.setUserSid(userSid);
attendanceStatistics.setYear(today.substring(0, 4));
attendanceStatistics.setMonth(today.substring(5, 7));
attendanceStatistics.setAllDay(allDay);
attendanceStatistics.setAllAttendanceDay(allAttendanceDay);
attendanceStatistics.setAttendanceDay(attendanceDay);
attendanceStatistics.setTripDay(tripDay);
attendanceStatistics.setOvertimeDay(overtimeDay);
attendanceStatistics.setVacationDay(vacationDay);
attendanceStatistics.setAbsenceDay(absenceDay);
attendanceStatistics.setSupposedNum(supposedNum);
attendanceStatistics.setNormalNum(normalNum);
attendanceStatistics.setLateNum(lateNum);
attendanceStatistics.setEarlyNum(earlyNum);
attendanceStatistics.setTripNum(tripNum);
attendanceStatistics.setOutNum(outNum);
attendanceStatistics.setVacationNum(vacationNum);
attendanceStatistics.setMissNum(missNum - 1);
if (deptuser == null) {
attendanceStatistics.setDeptPath("");
} else {
if (StringUtils.isEmpty(deptuser.getDepartmentName())) {
attendanceStatistics.setDeptPath("");
} else {
attendanceStatistics.setDeptPath(deptuser.getDepartmentName());
}
}
attendStatisticsService.save(attendanceStatistics);
} else {
// 出勤天数
attendanceStatistics.setAttendanceDay(attendanceStatistics.getAttendanceDay() + attendanceDay);
// 缺勤天数
attendanceStatistics.setAbsenceDay(attendanceStatistics.getAbsenceDay() - attendanceDay);
// 差旅、外勤次数:根据打卡状态判断去+1
if (attendanceErrand.getType() == 1) { // 差旅
attendanceStatistics.setTripNum(attendanceStatistics.getTripNum() + tripNum);
attendanceStatistics.setMissNum(attendanceStatistics.getMissNum() - 1);
} else if (attendanceErrand.getType() == 2) { // 外勤
attendanceStatistics.setOutNum(attendanceStatistics.getOutNum() + outNum);
attendanceStatistics.setMissNum(attendanceStatistics.getMissNum() - 1);
} else if (attendanceErrand.getType() == 3) { // 休假
attendanceStatistics.setVacationNum(attendanceStatistics.getVacationNum() + vacationNum);
attendanceStatistics.setMissNum(attendanceStatistics.getMissNum() - 1);
}
attendStatisticsService.updateById(attendanceStatistics);
}
}
}
}
}
}

View File

@@ -0,0 +1,70 @@
package com.yxt.attend.biz.attendance;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yxt.attend.api.attendance.Attendance;
import com.yxt.attend.api.attendance.AttendanceListOneVo;
import com.yxt.attend.api.attendance.AttendanceQuery;
import com.yxt.attend.api.attendance.AttendanceVo2;
/**
* @author dimengzhe
* @date 2020/11/23 14:28
* @description
*/
@Mapper
public interface AttendanceMapper extends BaseMapper<Attendance> {
public List<Attendance> selectOverTime(@Param("userSid") String userSid, @Param("day") String day, @Param("signNumType") String signNumType);
public List<Attendance> selectByRangeTime(@Param("map") Map<String, Object> map);
public List<Attendance> getCurDayInfo(@Param("map") Map<String, Object> map);
/**
* 查询没有签退的加班记录
*
* @param dwSid
* @param day
* @return
*/
public List<Attendance> selectOvTime(@Param("dwSid") String dwSid, @Param("day") String day);
public Attendance selectLastByDay(@Param("userSid") String userSid, @Param("day") String day);
public Attendance selectBySignTime(@Param("map") Map<String, Object> map);
public Attendance checkBySignNumType(@Param("userSid") String userSid, @Param("day") String day, @Param("signNumType") int signNumType);
public List<Attendance> getSignBtnState(@Param("map") Map<String, Object> map);
public int updateBySidOne(@Param("sid") String sid, @Param("ovTimeIsEnd") Integer ovTimeIsEnd);
public Attendance selectById(int id);
public Attendance queryByuserSid(@Param("usersid") String usersid, @Param("dwSid") String dwSid, @Param("dwlb") String dwlb, @Param("day") String day);
public IPage<AttendanceListOneVo> query(IPage<AttendanceQuery> page, @Param("Query") AttendanceQuery Query);
public List<Attendance> getSignTime(Map<String, Object> map);
public String selectVersionByDay(@Param("dwSid") String dwSid, @Param("year") String year, @Param("month") String month);
public IPage<AttendanceListOneVo> queryHistory(IPage<AttendanceQuery> page, @Param("Query") AttendanceQuery Query);
public List<AttendanceVo2> getByUserSid(@Param("map") Map<String, Object> map);
public AttendanceVo2 queryByuSidAndDay(@Param("usid") String usid, @Param("day") String day,@Param("signNumType") String signNumType);
}

View File

@@ -0,0 +1,308 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yxt.attend.biz.attendance.AttendanceMapper">
<select id="getCurDayInfo" resultType="com.yxt.attend.api.attendance.Attendance" parameterType="map">
SELECT *
FROM attendance
WHERE userSid = #{map.userSid}
AND day = #{map.curDay}
<if test="map != null">
<if test="map.signType != null">
<if test='map.signType == "1"'>
AND signNumType IN (1,4)
</if>
<if test='map.signType == "2"'>
AND signNumType IN (1,2,3,4)
</if>
</if>
</if>
</select>
<select id="selectOvTime" resultType="com.yxt.attend.api.attendance.Attendance">
SELECT *
FROM attendance
WHERE day = #{day}
AND signNumType = 5
AND ovTimeIsEnd = 0
<if test='dwSid != null and dwSid !=""'>
AND dwSid=#{dwSid}
</if>
</select>
<select id="selectLastByDay" resultType="com.yxt.attend.api.attendance.Attendance">
SELECT *
FROM attendance
WHERE id = (SELECT MAX(id) FROM attendance WHERE userSid = #{userSid} AND day = #{day} ORDER BY id DESC)
</select>
<select id="selectBySignTime" resultType="com.yxt.attend.api.attendance.Attendance">
SELECT *
FROM attendance
WHERE userSid = #{map.userSid}
AND day = #{map.day}
AND signNumType = #{map.signNumType}
<if test="map != null">
<if test='map.isAuto != null and map.isAuto != "" '>
AND isAuto=#{map.isAuto}
</if>
</if>
</select>
<select id="checkBySignNumType" resultType="com.yxt.attend.api.attendance.Attendance">
SELECT *
FROM attendance
WHERE userSid = #{userSid}
AND day = #{day}
AND signNumType = #{signNumType}
ORDER BY id DESC
</select>
<select id="getSignBtnState" resultType="com.yxt.attend.api.attendance.Attendance" parameterType="map">
SELECT *
FROM attendance
WHERE userSid = #{map.userSid}
AND day = #{map.curDay}
AND signType = #{map.signType}
<if test="map != null">
<if test="map.signType != null">
<if test='map.signType == "2"'>
<if test="map.str != null">
<if test='map.str == "1"'>
AND signNumType IN (1,2)
</if>
<if test='map.str == "2"'>
AND signNumType IN (3,4)
</if>
</if>
</if>
<if test="map.str != null">
<if test='map.str == "3"'>
AND signNumType IN (5,6)
</if>
<if test='map.str != "2"'>
AND isAuto!='1'
</if>
</if>
</if>
</if>
ORDER BY id
</select>
<select id="updateBySidOne" resultType="java.lang.Integer">
UPDATE attendance
SET ovTimeIsEnd = #{ovTimeIsEnd}
WHERE sid = #{sid}
</select>
<select id="selectByRangeTime" resultType="com.yxt.attend.api.attendance.Attendance" parameterType="map">
SELECT *
FROM attendance
WHERE CONCAT(day, ' ', signTime) &gt;= #{map.startTime}
AND CONCAT(day, ' ', signTime) &lt;= #{map.endTime}
AND userSid = #{map.userSid}
</select>
<select id="query" resultType="com.yxt.attend.api.attendance.AttendanceListOneVo">
select DISTINCT(gzxx.staffSid),u.sid as usid,ry.name,d.name as deptName,
ad1.signTime as signTime1,ad1.signDlwz as signDlwz1,ad1.signDest as signDest1,
ad1.signState as signState1,ad1.day as day1,ad1.signDestDlwz as signDestDlwz1,
ad4.signTime as signTime4,
ad4.signDlwz as signDlwz4,ad4.signDest as signDest4,
ad4.signState as signState4,ad4.day as day4,ad4.signDestDlwz as signDestDlwz4,
ad1.deptPath as adDeptPath,
<if test='Query.signType == "2"'>
ad2.signTime as signTime2,ad2.signDlwz as signDlwz2,ad2.signDest as signDest2,
ad2.signState as signState2,ad2.day as day2,ad2.signDestDlwz as signDestDlwz2,
ad3.signTime as signTime3,ad3.signDlwz as signDlwz3,ad3.signDest as signDest3,
ad3.signState as signState3,ad3.day as day3,ad3.signDestDlwz as signDestDlwz3,
</if>
(select count(1) from attendance as a where u.sid=a.userSid and a.day=#{Query.day} and a.signNumType=5) as
OTNum,
ae.startTime as startTime,
ae.endTime as endTime,ae.type as errendType,ae.vacationType as aeVacationType,
ae.destDlwz as errendDlwz,ad5.ovTimeSum
from jlzx_base.workexperience gzxx
LEFT JOIN jlzx_base.staffinfo ry ON gzxx.staffSid=ry.sid
left join jlzx_system.user u on u.staffSid=gzxx.staffSid
left join jlzx_system.department_staff link on u.staffSid=link.staffSid
left join jlzx_system.department d on d.sid=link.departmentSid
left join attend_errand ae on u.sid=ae.userSid and ae.state &lt;&gt;3
and ae.startTime&lt;=concat(#{Query.day},"23:59") and ae.endTime&gt;=concat(#{Query.day}," 00:00")
left join (select userSid,deptPath,signTime,signDest,signDlwz,signState,day,signDestDlwz,ovTimeSum from
attendance
where signNumType=1 and dwSid=#{Query.dwSid} and day=#{Query.day} GROUP BY userSid
) ad1 on u.sid=ad1.userSid
<if test='Query.signType == "2"'>
left join (select userSid,signTime,signDest,signDlwz,signState,day,signDestDlwz,ovTimeSum from attendance
where signNumType=2 and dwSid=#{Query.dwSid} and day=#{Query.day} GROUP BY userSid
) ad2 on u.sid=ad2.userSid
left join (select userSid,signTime,signDest,signDlwz,signState,day,signDestDlwz,ovTimeSum from attendance
where signNumType=3 and dwSid=#{Query.dwSid} and day=#{Query.day} GROUP BY userSid
) ad3 on u.sid=ad3.userSid
</if>
left join (select userSid,signTime,signDest,signDlwz,signState,day,signDestDlwz,ovTimeSum from attendance
where signNumType=4 and dwSid=#{Query.dwSid} and day=#{Query.day} GROUP BY userSid
) ad4 on u.sid=ad4.userSid
left join (select userSid,ovTimeSum from attendance where id in (select MAX(id) from attendance where
dwSid=#{Query.dwSid} and day=#{Query.day} and (signNumType=5 or signNumType=6) GROUP BY userSid ORDER BY id
desc)) ad5 on u.sid=ad5.userSid where 1=1 and (u.isAdmin is null or u.isAdmin &lt;&gt; 1)
<if test='Query.userType!=null and Query.userType =="1" '>
and gzxx.orgSid=#{Query.dwSid} AND (concat(#{Query.day}," 00:00")&lt;gzxx.leaveDate OR gzxx.leaveDate='' OR gzxx.leaveDate
is null) AND (concat(#{Query.day}," 23:59")&gt;gzxx.createTime OR gzxx.createTime='' OR gzxx.leaveDate is null)
</if>
<if test='Query.userType==null or Query.userType != "1"'>
and (u.sid=#{Query.userSid}) AND (#{Query.day}&lt;gzxx.leaveDate OR gzxx.leaveDate='' OR gzxx.leaveDate is null) AND
(#{Query.day}&gt;gzxx.leaveDate OR gzxx.leaveDate='' OR gzxx.leaveDate is null)
</if>
<if test='Query.dept!="" and Query.dept!=null'>
and d.name like concat("%",#{Query.dept},"%")
</if>
<if test='Query.xm!=null and Query.xm!="" '>
and ry.name like concat("%",#{Query.xm},"%")
</if>
and u.id is not null
order by u.id
</select>
<select id="selectOverTime" resultType="com.yxt.attend.api.attendance.Attendance">
SELECT *
FROM attendance
WHERE userSid = #{userSid}
AND day = #{day}
AND signNumType = #{signNumType}
</select>
<select id="getByUserSid" resultType="com.yxt.attend.api.attendance.AttendanceVo2">
SELECT ad.*, t.sum
FROM attendance ad
LEFT JOIN (SELECT day, MAX(ovTimeSum) sum
FROM attendance
WHERE year = #{map.year}
AND month = #{map.month}
AND userSid = #{map.userSid}
GROUP BY day) t ON t.day = ad.day
WHERE ad.year = #{map.year}
AND ad.month = #{map.month}
AND ad.userSid = #{map.userSid}
ORDER BY ad.day ASC
</select>
<select id="selectVersionByDay" resultType="java.lang.String">
SELECT version
FROM yxt_attend.attendance
WHERE dwSid = #{dwSid}
AND year = #{year}
AND month = #{month}
ORDER BY id DESC
LIMIT 1
</select>
<select id="getSignTime" resultType="com.yxt.attend.api.attendance.Attendance">
SELECT *
FROM attendance
WHERE signType = #{map.signType}
AND userSid = #{map.userSid}
AND day = #{map.curDay}
AND signNumType IN (#{map.signNumType})
</select>
<select id="queryByuserSid" resultType="com.yxt.attend.api.attendance.Attendance">
SELECT *
FROM attendance
WHERE userSid = #{usersid}
AND dwSid = #{dwSid}
AND dwlb = #{dwlb}
AND day = #{day}
ORDER BY id DESC
LIMIT 1
</select>
<select id="selectById" resultType="com.yxt.attend.api.attendance.Attendance">
SELECT *
FROM attendance
WHERE id = #{id}
</select>
<select id="queryHistory" resultType="com.yxt.attend.api.attendance.AttendanceListOneVo">
select
u.sid as usid,
si.name,
d.name AS deptName,
ad1.signTime as signTime1,
ad1.signDlwz as signDlwz1,
ad1.signDest as signDest1,
ad1.signState as signState1,
ad1.day as day1,
ad4.signTime as signTime4,
ad4.signDlwz as signDlwz4,
ad4.signDest as signDest4,
ad4.signState as signState4,
ad4.day as day4
<if test='Query.signType == "2"'>
,ad2.signTime as signTime2,ad2.signDlwz as signDlwz2,ad2.signDest as signDest2,
ad2.signState as signState2,ad2.day as day2,ad3.signTime as signTime3,
ad3.signDlwz as signDlwz3,ad3.signDest as signDest3,ad3.signState as signState3,
ad3.day as day3
</if>
,ad5.signTime as signTime5,ad5.signDlwz as signDlwz5,ad5.signDest as signDest5,
ad5.signState as signState5,ad5.day as day5,ad6.signTime as signTime6,
ad6.signDlwz as signDlwz6,ad6.signDest as signDest6,ad6.signState as signState6
,ad6.day as day6,(select count(1) from attendance att where u.sid=att.userSid
and att.day=#{Query.day} and att.signNumType=5) as OTNum, ae.startTime as startTime,
ae.endTime as endTime,ae.type as errendType,ae.destDlwz as errendDlwz
from jlzx_system.user u
left join jlzx_system.department_staff link on u.staffSid=link.staffSid
left join jlzx_system.department d on link.departmentSid = d.sid
left join jlzx_base.staffinfo si on si.sid = u.staffSid
left join attend_errand ae on u.sid=ae.userSid and ae.state&lt;&gt;3 and ae.startTime&lt;=#{Query.day}
and ae.endTime&gt;=#{Query.day}
left join (select userSid,signTime,signDest,signDlwz,signState,day from attendance
where signNumType=1 and dwSid=#{Query.dwSid} and day=#{Query.day} GROUP BY userSid
) ad1 on u.sid=ad1.userSid
<if test='Query.signType == "2" '>
left join (select userSid,signTime,signDest,signDlwz,signState,day from attendance
where signNumType=2 and dwSid=#{Query.dwSid} and day=#{Query.day} GROUP BY userSid
) ad2 on u.sid=ad2.userSid
left join (select userSid,signTime,signDest,signDlwz,signState,day from attendance
where signNumType=3 and dwSid=#{Query.dwSid} and day=#{Query.day} GROUP BY userSid
) ad3 on u.sid=ad3.userSid
</if>
left join (select userSid,signTime,signDest,signDlwz,signState,day from attendance
where signNumType=4 and dwSid=#{Query.dwSid} and day=#{Query.day} GROUP BY userSid
) ad4 on u.sid=ad4.userSid
left join (select userSid,signTime,signDest,signDlwz,signState,day from attendance
where signNumType=5 and dwSid=#{Query.dwSid} and day=#{Query.day} GROUP BY userSid
) ad5 on u.sid=ad5.userSid
left join (select userSid,signTime,signDest,signDlwz,signState,day from attendance
where signNumType=6 and dwSid=#{Query.dwSid} and day=#{Query.day} GROUP BY userSid
) ad6 on u.sid=ad6.userSid
where 1=1 and (u.isAdmin is null or u.isAdmin &lt;&gt; 1)
<if test='Query.userType!=null and Query.userType =="1"'>
and u.organizationSid=#{Query.dwSid}
and u.sid in (select userSid from attendance where dwSid=#{Query.dwSid} and day=#{Query.day} group by
userSid)
</if>
<if test='Query.userType==null or Query.userType != "1"'>
and u.sid in (select userSid from attendance where userSid=#{Query.userSid} and day=#{Query.day} group by userSid)
</if>
<if test="Query.dept!=null">
and d.name like concat("%",#{Query.dept},"%")
</if>
<if test="Query.xm!=null">
and si.name like concat("%",#{Query.xm},"%")
</if>
order by u.id
</select>
<select id="queryByuSidAndDay" resultType="com.yxt.attend.api.attendance.AttendanceVo2">
SELECT *
FROM attendance
WHERE userSid = #{usid} and day=#{day} and signNumType=#{signNumType} limit 1
</select>
</mapper>

View File

@@ -0,0 +1,160 @@
package com.yxt.attend.biz.attendance;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.alibaba.spring.util.BeanUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yxt.attend.api.attendance.Attendance;
import com.yxt.attend.api.attendance.AttendanceListOneVo;
import com.yxt.attend.api.attendance.AttendanceQuery;
import com.yxt.attend.api.attendance.AttendanceVo;
import com.yxt.attend.api.attendance.AttendanceVo2;
import com.yxt.common.base.service.MybatisBaseService;
import com.yxt.common.base.utils.PagerUtil;
import com.yxt.common.core.query.PagerQuery;
import com.yxt.jlzx.oa.api.car.CarVo;
/**
* @author dimengzhe
* @date 2020/11/23 14:28
* @description
*/
@Service
public class AttendanceService extends MybatisBaseService<AttendanceMapper, Attendance> {
public List<Attendance> getCurDayInfo(Map<String, Object> map) {
return baseMapper.getCurDayInfo(map);
}
/**
* 查询没有签退的加班记录
*
* @param dwSid
* @param day
* @return
*/
public List<Attendance> selectOvTime(String dwSid, String day) {
return baseMapper.selectOvTime(dwSid, day);
}
/**
* 查询今日最近一次打卡记录
*
* @param userSid
* @param day
* @return
*/
public Attendance selectLastByDay(String userSid, String day) {
return baseMapper.selectLastByDay(userSid, day);
}
public Attendance selectBySignTime(Map<String, Object> map) {
return baseMapper.selectBySignTime(map);
}
/**
* 正常签到签退统计
*
* @param userSid
* @param day
* @param signNumType
* @return
*/
public Attendance checkBySignNumType(String userSid, String day, int signNumType) {
return baseMapper.checkBySignNumType(userSid, day, signNumType);
}
public List<Attendance> getSignBtnState(Map<String, Object> map) {
return baseMapper.getSignBtnState(map);
}
public int updateBySidOne(String sid, Integer ovTimeIsEnd) {
return baseMapper.updateBySidOne(sid, ovTimeIsEnd);
}
public Attendance selectById(int id) {
return baseMapper.selectById(id);
}
public Attendance queryByuserSid(String usersid,String dwSid,String dwlb,String day) {
// TODO Auto-generated method stub
return baseMapper.queryByuserSid(usersid,dwSid,dwlb,day);
}
public IPage<AttendanceListOneVo> query(PagerQuery<AttendanceQuery> pagerQuery) {
// mybits所用的分页对对象
IPage<AttendanceQuery> page = PagerUtil.queryToPage(pagerQuery);
// mybits所用的查询条件封装类
QueryWrapper<AttendanceVo> qw = new QueryWrapper<>();
return baseMapper.query(page, pagerQuery.getParams());
}
public List<Attendance> getSignTime(Map<String, Object> map) {
return baseMapper.getSignTime(map);
}
/**
* 加班统计(可以多次)
* @param userSid
* @param day
* @param signNumType
* @return
*/
public List<Attendance> selectOverTime(String userSid, String day,String signNumType){
return baseMapper.selectOverTime(userSid, day, signNumType);
}
/**
* 获取版本考勤设置的版本
* @param dwSid
* @param year
* @param month
* @return
*/
public String selectVersionByDay(String dwSid, String year, String month) {
return baseMapper.selectVersionByDay(dwSid, year, month);
}
// 查询历史记录
public IPage<AttendanceListOneVo> queryHistory(PagerQuery<AttendanceQuery> pagerQuery) {
// mybits所用的分页对对象
IPage<AttendanceQuery> page = PagerUtil.queryToPage(pagerQuery);
// mybits所用的查询条件封装类
QueryWrapper<AttendanceListOneVo> qw = new QueryWrapper<>();
return baseMapper.queryHistory(page, pagerQuery.getParams());
}
//根据时间范围查询打卡记录
public List<Attendance> selectByRangeTime(Map<String, Object> map){
return baseMapper.selectByRangeTime(map);
}
public List<AttendanceVo2> getByUserSid(Map<String, Object> map){
return baseMapper.getByUserSid(map);
}
public AttendanceVo2 queryByuSidAndDay(String usid,String day,String signNumType){
return baseMapper.queryByuSidAndDay(usid,day,signNumType);
}
}

View File

@@ -0,0 +1,300 @@
package com.yxt.attend.biz.attenderrand;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.validation.Valid;
import io.swagger.models.auth.In;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yxt.attend.api.attenderrand.AttendErrand;
import com.yxt.attend.api.attenderrand.AttendErrandApi;
import com.yxt.attend.api.attenderrand.AttendErrandDto;
import com.yxt.attend.api.attenderrand.AttendErrandQuery;
import com.yxt.attend.api.attenderrand.AttendErrandVo;
import com.yxt.attend.api.attenderrand.FormResultVo;
import com.yxt.attend.api.attendsigntype.AttendSignType;
import com.yxt.attend.api.attendtimetable.AttendTimetable;
import com.yxt.attend.biz.attendsigntype.AttendSignTypeService;
import com.yxt.attend.biz.attendtimetable.AttendTimetableService;
import com.yxt.attend.biz.workflow.WorkFlowService;
import com.yxt.common.base.utils.DateUtils;
import com.yxt.common.base.utils.PagerUtil;
import com.yxt.common.core.query.PagerQuery;
import com.yxt.common.core.result.ResultBean;
import com.yxt.common.core.vo.PagerVo;
import com.yxt.jlzx.jlcyry.api.staffinfo.StaffBasicDetailsVo;
import com.yxt.jlzx.jlcyry.api.staffinfo.StaffInfoApi;
import com.yxt.jlzx.oa.api.form.FormDto;
import com.yxt.jlzx.oa.api.formfile.FormFile;
import com.yxt.jlzx.oa.api.formfile.FormFileDto;
import com.yxt.jlzx.system.api.department.DepartmentApi;
import com.yxt.jlzx.system.api.department.QrCodeVo;
import com.yxt.jlzx.system.api.user.UserApi;
import com.yxt.jlzx.system.api.user.UserInfoVo;
import com.yxt.workflow.api.task.WfTaskVo;
import io.swagger.annotations.Api;
/**
* @author hanweijia
* @date 2020/11/23 11:28
* @description
*/
@Controller
@RequestMapping("v1/attenderrands")
@Api(tags = "考勤申请单")
public class AttendErrandApiImpl implements AttendErrandApi {
@Autowired
private UserApi userApi;
@Autowired
private StaffInfoApi staffInofApi;
@Autowired
private DepartmentApi departmentApi;
@Autowired
private AttendErrandService attendanceErrandService;
@Autowired
private AttendSignTypeService attendSignTypeService;
@Autowired
private AttendTimetableService attendTimetableService;
@Autowired
private WorkFlowService wfservice;
@Override
public ResultBean<List<AttendErrandVo>> list(@Valid AttendErrandQuery query) {
// TODO Auto-generated method stub
return null;
}
@Override
public ResultBean<PagerVo<AttendErrandVo>> pageList(@Valid PagerQuery<AttendErrandQuery> pagerQuery) {
ResultBean<PagerVo<AttendErrandVo>> rb = ResultBean.fireFail();
IPage<AttendErrandVo> page = attendanceErrandService.selectPager(pagerQuery);
//把Ipage转换为PageVo
PagerVo<AttendErrandVo> pv_result = PagerUtil.pageToVo(page, null);
return rb.success().setData(pv_result);
}
@Override
public ResultBean<FormResultVo> save(@Valid AttendErrandDto dto) {
ResultBean<FormResultVo> resultBean=ResultBean.fireFail();
FormResultVo formResultVo = new FormResultVo();
// 首次保存,二次修改
if (dto != null && StringUtils.isNotBlank(dto.getFormSid())) {
if (update(dto, dto.getFormSid()).getSuccess()) {
return resultBean.success().setData(formResultVo);
} else {
return resultBean;
}
}
AttendErrand errand = new AttendErrand();
UserInfoVo vo = userApi.fetchUserInfoBysid(dto.getCreateBySid()).getData();
String title = vo.getName() + "" + DateUtils.getNowDateDayStr() + "提交申请";
dto.setTitle(title);
dto.setFormSid(errand.getSid());
dto.fillEntity(errand);
// 开始流程
WfTaskVo taskVo = wfservice.startProcess((FormDto) dto);
if (taskVo == null) {
return resultBean;
}
errand.setOrderSid(taskVo.getOrderSid());
UserInfoVo userInfoVo = userApi.fetchUserInfoBysid(errand.getCreateBySid()).getData();
if (null != userInfoVo)
errand.setCreateOrgSid(userInfoVo.getOrganizationSid());
// 验证同一时间段内是否有其他申请单
Date date = new Date();
String today = DateUtils.dateConvertStr(date, "yyyy-MM");
AttendSignType attendanceSignType = attendSignTypeService.check(dto.getDwSid(), today);
AttendTimetable attendanceTimetable = attendTimetableService.check(dto.getDwSid(), today);
if(null == attendanceSignType) {
return resultBean.fail().setMsg("本单位暂未设置考勤,请先设置签卡方式!");
}else if(null == attendanceTimetable) {
return resultBean.fail().setMsg("本单位暂未设置考勤,请先设置作息时间!");
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("userSid", dto.getUserSid());
map.put("startTime", dto.getStartTime());
map.put("endTime", dto.getEndTime());
List<AttendErrand> list = attendanceErrandService.checkOneByTime(map);
if(list.size() > 0) {
return resultBean.fail().setMsg("本时间段内有其他申请单,请重新选择!");
}
dto.fillEntity(errand);
//调用远程
// dto.setFormSid(errand.getSid());
// dto.setCreateBySid(dto.getUserSid());
// dto.setProcessSid("f8579a93-40ba-42d5-a6f7-69156e86d401");
// dto.setTitle(dto.getApprover()+"的考勤申请");
// WfTaskVo taskVo = wfservice.startProcess((FormDto) dto);
// if (taskVo == null)
// return resultBean;
dto.fillEntity(errand);
// errand.setOrderSid(taskVo.getOrderSid());
String now = DateUtils.dateConvertStr(date, "yyyy-MM-dd HH:mm:ss");
String date1 = DateUtils.dateConvertStr(date, "yyyy-MM-dd");
String year = date1.substring(0, 4);
String month = date1.substring(5, 7);
String day = date1.substring(8, 10);
// attendanceErrandService.selectByCurTime(userSid, curTime);
errand.setUserSid(dto.getUserSid());
errand.setApplicant("");
errand.setDwSid("");
ResultBean<UserInfoVo> bean=userApi.selectBysid(dto.getUserSid());
UserInfoVo user=null;
if(bean.getSuccess()) {
user=bean.getData();
}
if(user!=null&&StringUtils.isNoneBlank(user.getStaffSid())) {
StaffBasicDetailsVo staffinfo= staffInofApi.staffBasicDetails(user.getStaffSid()).getData();
if(staffinfo!=null) {
errand.setApplicant(staffinfo.getName());
}
QrCodeVo qrCodeVo=departmentApi.queryByStaffSid(user.getStaffSid()).getData();
if(qrCodeVo == null) {
errand.setDeptPath("");
}else {
if(StringUtils.isEmpty(qrCodeVo.getDepartmentName())) {
errand.setDeptPath("");
}else {
errand.setDeptPath(qrCodeVo.getDepartmentName());
}
}
errand.setDwSid(user.getOrganizationSid());
}
errand.setSubmitTime(now);
String title1 = "";
if(dto.getType() == 1) {
title1 = "差旅";
errand.setDayCount(dto.getDayCount());
errand.setDestDlwz(dto.getDestDlwz());
}else if(dto.getType() == 2) {
title1 = "外勤";
errand.setDestDlwz(dto.getDestDlwz());
}else if(dto.getType() == 3) {
title1 = "休假";
errand.setDayCount(dto.getDayCount());
String vacationType = dto.getDestDlwz(); // 休假类型1、事假2、病假3、婚假4、产假5、丧假6、年假
if(vacationType.equals("1") || vacationType.equals("2") ) { // 只有事假、病假有时假
errand.setVacationCategory(dto.getVacationCategory());// 请假类别:1、时假2、日假
}
errand.setVacationType(Integer.valueOf(vacationType));
}
errand.setState(1);
errand.setType(dto.getType());
errand.setApproverSid(dto.getApproverSid());
errand.setApprover(dto.getApprover());
errand.setReason(dto.getReason());
if(attendanceErrandService.save(errand)){
formResultVo.setFormSid(errand.getSid());
formResultVo.setTaskSid(taskVo.getTaskSid());
return resultBean.success().setData(formResultVo);
}else {
return ResultBean.fireFail();
}
// SubmitWorkDto dto1=new SubmitWorkDto();
// dto1.setActionSid("a357af21-b6df-4207-9c40-f4e4114603db");
// dto1.setCurrentTaskSid(taskVo.getTaskSid());
// dto1.setIsSendMsg(1);
// dto1.setNextUserSid(dto.getApproverSid());
// dto1.setOperOpinion(dto.getReason());
// dto1.setOperUserSid(dto.getUserSid());
// workFlowService.submitWork(dto1);
}
// @Override
// public ResultBean update(@Valid AttendErrandDto dto, String sid) throws Exception {
// AttendErrand errand = attendanceErrandService.selectBySidAndState(sid);
// String now = DateUtils.dateConvertStr(new Date(), "yyyy-MM-dd HH:mm:ss");
// errand.setState(4);
// errand.setApproverTime(now);
// attendanceErrandService.updateById(errand);
// return null;
// }
// @Override
// public ResultBean updates(String sid) throws Exception {
// AttendErrand errand = attendanceErrandService.selectBySidAndState(sid);
// String now = DateUtils.dateConvertStr(new Date(), "yyyy-MM-dd HH:mm:ss");
// errand.setState(4);
// errand.setApproverTime(now);
// attendanceErrandService.updateById(errand);
// return ResultBean.fireSuccess().setData(sid);
// }
@Override
public ResultBean<String> update(AttendErrandDto dto, String sid){
ResultBean<String> rb = ResultBean.fireFail();
AttendErrand t = attendanceErrandService.fetchBySid(sid);
if (null == t)
return rb.setMsg("该记录不存在").setData("");
//if issueUserSid 包含"签发"则设置签发人sid签发人姓名签发日期
Map<String, Object> map = dto.toMap();
if (0 == attendanceErrandService.updateBySid(map, sid))
return rb.setData("");
// 修改流程实例中的title和紧急紧急程度
dto.setOrderSid(t.getOrderSid());
if (wfservice.updateMfOrderFormInfo((FormDto) dto)) {
return rb.success().setData(sid);
}
return rb.success().setMsg("修改成功");
}
@Override
public ResultBean getHanld(String sid) {
ResultBean<Integer> resultBean=ResultBean.fireFail();
Integer integer = attendanceErrandService.getHanld(sid);
return resultBean.setData(integer).success();
}
@Override
public ResultBean delete(String sid) {
// TODO Auto-generated method stub
return null;
}
@Override
public ResultBean<AttendErrandVo> getVo(String sid) {
// TODO Auto-generated method stub
return null;
}
@Override
public ResultBean updates(String sid) throws Exception {
// TODO Auto-generated method stub
return null;
}
}

View File

@@ -0,0 +1,54 @@
package com.yxt.attend.biz.attenderrand;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.yxt.attend.api.attenderrand.AttendErrand;
import com.yxt.attend.api.attenderrand.AttendErrandQuery;
import com.yxt.attend.api.attenderrand.AttendErrandVo;
import com.yxt.jlzx.oa.api.car.CarVo;
/**
* @author dimengzhe
* @date 2020/11/23 11:28
* @description
*/
@Mapper
public interface AttendErrandMapper extends BaseMapper<AttendErrand> {
public AttendErrandVo selectByCurTime(@Param("userSid")String userSid, @Param("curTime")String curTime);
public List<AttendErrand> selectByDwsidAndTime(@Param("dwSid") String dwSid, @Param("start") String start, @Param("end") String end);
public AttendErrand selectBySidAndState(String sid);
public List<AttendErrand> selectByMonth(@Param("map") Map<String, Object> map);
public List<AttendErrand> selectByApproverSid(@Param("map") Map<String, Object> map);
public List<AttendErrand> selectByApproverSid2(@Param("map") Map<String, Object> map);
IPage<AttendErrandVo> query(IPage<AttendErrandQuery> page,@Param(Constants.WRAPPER) Wrapper<AttendErrandVo> qw);
public List<AttendErrand> selectDayByUserSid(Map<String, Object> map);
public List<AttendErrand> checkOneByTime(@Param("map") Map<String, Object> map);
public int selectCountByApproverSid(String userSid);
public List<AttendErrand> selectAllByTime(@Param("map") Map<String, Object> map);
IPage<AttendErrandVo> selectPager(IPage<AttendErrandVo> page,@Param(Constants.WRAPPER) Wrapper<AttendErrandVo> qw);
Integer getHanld(@Param("sid") String sid);
}

View File

@@ -0,0 +1,134 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yxt.attend.biz.attenderrand.AttendErrandMapper">
<select id="selectPager" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
SELECT ae.*
FROM attend_errand ae
LEFT JOIN jlzx_system.user u
ON ae.userSid = u.sid
${ew.customSqlSegment}
</select>
<select id="query" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
SELECT ae.*, info.name, d.name deptName
FROM attend_errand ae
LEFT JOIN jlzx_system.user u
ON ae.userSid = u.sid
LEFT JOIN jlzx_system.department_staff link ON u.staffSid = link.staffSid
LEFT JOIN jlzx_base.staffinfo info ON info.sid = u.staffSid
LEFT JOIN jlzx_system.department d ON d.sid = link.departmentSid
</select>
<select id="selectByApproverSid" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
SELECT *
FROM attend_errand
WHERE state &lt;&gt; 4
AND approverSid = #{map.userSid}
<if test="map != null">
<if test='map.type!=null and map.type !=""'>
and type=#{map.type}
</if>
<if test='map.month!=null and map.month !="" '>
and submitTime like ('%',#{map.month},'%')
</if>
<if test='map.state!=null and map.state !="" '>
and state=#{map.state}
</if>
</if>
ORDER BY state = 1 DESC, startTime DESC
</select>
<select id="selectByApproverSid2" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
SELECT *
FROM attend_errand
WHERE state &lt;&gt; 4
AND approverSid = #{map.userSid}
<if test="map != null">
<if test='map.type!=null and map.type !=""'>
and type=#{map.type}
</if>
<if test='map.month!=null and map.month !="" '>
and submitTime like ('%',#{map.month},'%')
</if>
and (state=2 or state=3)
</if>
ORDER BY state = 1 DESC, startTime DESC
</select>
<select id="selectByCurTime" resultType="com.yxt.attend.api.attenderrand.AttendErrandVo">
SELECT *
FROM attend_errand ae
WHERE userSid = #{userSid}
AND ae.startTime &lt;= #{curTime}
AND ae.endTime &gt;= #{curTime}
AND ae.state &lt;&gt; 4
</select>
<select id="selectByDwsidAndTime" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
SELECT *
FROM attend_errand
WHERE dwSid = #{dwSid}
AND startTime &lt;= #{start}
AND endTime &gt;= #{end}
</select>
<select id="selectByMonth" resultType="com.yxt.attend.api.attenderrand.AttendErrand" parameterType="map">
select * from attend_errand
where state&lt;&gt;4 and userSid=#{map.userSid}
<if test="map != null">
<if test='map.type!=null and map.type !="" '>
and type=#{map.type}
</if>
<if test='map.month!=null and map.month !="" '>
and submitTime like CONCAT('%',#{map.month},'%')
</if>
<if test='map.state!=null and map.state !="" '>
and state=#{map.state}
</if>
<if test='map.date!=null and map.date !="" '>
and (startTime like CONCAT('%',#{map.date},'%') or endTime like CONCAT('%',#{map.date},'%'))
</if>
</if>
order by state=1 desc,startTime desc
</select>
<select id="selectBySidAndState" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
SELECT *
FROM attend_errand
WHERE state &lt;&gt; 4
AND sid = #{sid}
</select>
<select id="selectDayByUserSid" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
select * from attend_errand where state&lt;&gt;4 and userSid=#{map.userSid}
and (startTime like CONCAT('%',#{map.date},'%') or endTime like CONCAT('%',#{map.date},'%'))
<if test='map.type!=null and map.type !="" '>
and type=#{map.type}
</if>
</select>
<select id="checkOneByTime" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
SELECT *
FROM attend_errand
WHERE state &lt;&gt; 4
AND userSid = #{map.userSid}
AND NOT (endTime &lt; #{map.startTime} OR startTime >&gt; #{map.endTime})
</select>
<select id="selectAllByTime" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
SELECT *
FROM attend_errand
WHERE state &lt;&gt; 4
AND state &lt;&gt; 2
AND (startTime &lt; #{map.startTime} AND endTime >&gt; #{map.endTime})
ORDER BY dwSid
</select>
<select id="getHanld" resultType="java.lang.Integer">
SELECT COUNT(1) from attend_errand WHERE state = 1 AND approverSid =#{sid}
</select>
</mapper>

View File

@@ -0,0 +1,206 @@
package com.yxt.attend.biz.attenderrand;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yxt.attend.api.attenderrand.AttendErrand;
import com.yxt.attend.api.attenderrand.AttendErrandQuery;
import com.yxt.attend.api.attenderrand.AttendErrandVo;
import com.yxt.attend.biz.form.IFormService;
import com.yxt.common.base.service.MybatisBaseService;
import com.yxt.common.base.utils.PagerUtil;
import com.yxt.common.core.query.PagerQuery;
import com.yxt.jlzx.oa.api.form.FormSelectLinkDto;
import com.yxt.jlzx.oa.api.form.MaxFileNumDto;
import com.yxt.jlzx.oa.api.formzzfw.FormZzfwVo;
import com.yxt.jlzx.oa.api.index.AppDailyDto;
import com.yxt.jlzx.oa.api.index.AppDailyVo;
/**
* @author dimengzhe
* @date 2020/11/23 11:28
* @description
*/
@Service("08b3238d-4bfb-4d82-99f3-698bf391393c")
public class AttendErrandService extends MybatisBaseService<AttendErrandMapper, AttendErrand> implements IFormService {
public List<AttendErrand> selectByApproverSid(Map<String,Object> map) {
return baseMapper.selectByApproverSid(map);
}
public List<AttendErrand> selectByApproverSid2(Map<String,Object> map) {
return baseMapper.selectByApproverSid2(map);
}
public AttendErrandVo selectByCurTime(String userSid, String curTime) {
return baseMapper.selectByCurTime(userSid, curTime);
}
public List<AttendErrand> selectByDwsidAndTime(Map<String, Object> map){
String dwSid = String.valueOf(map.get("dwSid"));
String start = String.valueOf(map.get("nowTime"));
String end = String.valueOf(map.get("nowTime"));
return baseMapper.selectByDwsidAndTime(dwSid,start,end);
}
public AttendErrand selectBySidAndState(String sid) {
return baseMapper.selectBySidAndState(sid);
}
public List<AttendErrand> selectByMonth(Map<String, Object> map){
return baseMapper.selectByMonth(map);
}
public List<AttendErrand> selectDayByUserSid(Map<String, Object> map){
return baseMapper.selectDayByUserSid(map);
}
public List<AttendErrand> checkOneByTime(Map<String, Object> map){
return baseMapper.checkOneByTime(map);
}
public int selectCountByApproverSid(String userSid) {
return baseMapper.selectCountByApproverSid(userSid);
}
public List<AttendErrand> selectAllByTime(Map<String, Object> map){
return baseMapper.selectAllByTime(map);
}
// public Pager query(Map<String, String> map, Pager pager) {
// PageQuery pageQuery = new PageQuery(pager.getPageNumber(), map, -1, pager.getPageSize());
// baseMapper.query(pageQuery);
// pager.setList(pageQuery.getList());
// pager.setRecordCount((int) pageQuery.getTotalRow());
// return pager;
// }
// 休假、差旅、外勤申请单
public IPage<AttendErrandVo> selectPager(PagerQuery<AttendErrandQuery> pagerQuery) {
IPage<AttendErrandVo> page = PagerUtil.queryToPage(pagerQuery);
// mybits所用的查询条件封装类
QueryWrapper<AttendErrandVo> qw = buildQueryWrapper(pagerQuery.getParams());
return baseMapper.selectPager(page, qw);
}
private QueryWrapper<AttendErrandVo> buildQueryWrapper(AttendErrandQuery pagerQuery) {
QueryWrapper<AttendErrandVo> qw = new QueryWrapper<>();
if (pagerQuery != null) {
if (org.apache.commons.lang3.StringUtils.isNotBlank(pagerQuery.getIsadmin())&&"1".equals(pagerQuery.getIsadmin())) {
qw.eq("ae.dwSid", pagerQuery.getDwSid());
}else {
//2021.09.14查询申请人 .or().eq("ae.approverSid",pagerQuery.getUserSid())
qw.eq ("ae.userSid",pagerQuery.getUserSid()) ;
}
if (org.apache.commons.lang3.StringUtils.isNotBlank(pagerQuery.getDept())) {
qw.like("ae.deptPath", pagerQuery.getDept());
}
if (org.apache.commons.lang3.StringUtils.isNotBlank(pagerQuery.getApplicant())) {
qw.like("ae.applicant", pagerQuery.getApplicant());
}
if (org.apache.commons.lang3.StringUtils.isNotBlank(pagerQuery.getApprover())) {
qw.like("ae.approver", pagerQuery.getApprover());
}
if (org.apache.commons.lang3.StringUtils.isNotBlank(pagerQuery.getStartTime())) {
qw.ge("ae.startTime", pagerQuery.getStartTime());
}
if (org.apache.commons.lang3.StringUtils.isNotBlank(pagerQuery.getEndTime())) {
qw.le("ae.endTime", pagerQuery.getEndTime());
}
if (org.apache.commons.lang3.StringUtils.isNotBlank(pagerQuery.getState())) {
qw.eq("ae.state", pagerQuery.getState());
}
if (org.apache.commons.lang3.StringUtils.isNotBlank(pagerQuery.getType())) {
qw.eq("ae.type", pagerQuery.getType());
}
if (org.apache.commons.lang3.StringUtils.isNotBlank(pagerQuery.getVacationType())) {
qw.eq("ae.vacationType", pagerQuery.getVacationType());
}
qw.orderByDesc("ae.state=1","ae.currentTime");
}
return qw;
}
/**
* 获取动态表单
* @param sid
* @return
*/
public Map<String,Object> getFormItemsVo(String sid){
AttendErrand t=fetchBySid(sid);
if(null==t)
return null;
AttendErrandVo vo=new AttendErrandVo();
vo.fromEntity(t);
if(t.getType()==1) {
vo.setTypeVal("差旅");
}else if(t.getType()==2) {
vo.setTypeVal("外勤");
}else {
vo.setTypeVal("休假");
}
return vo.toFormItemsMap();
}
public Integer getHanld(String sid) {
return baseMapper.getHanld(sid);
}
@Override
public Map<String, Object> getNewFormItemsVo() {
// TODO Auto-generated method stub
return null;
}
@Override
public Map<String, Object> getEditFormItemsVo(String formSid) {
// TODO Auto-generated method stub
return null;
}
@Override
public Map<String, Object> getMaxFileNum(MaxFileNumDto dto) {
// TODO Auto-generated method stub
return null;
}
@Override
public AppDailyVo isSave(AppDailyDto appDailyDto) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public AppDailyVo update(AppDailyDto appDailyDto) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public Map<String, Object> getLinkAge(FormSelectLinkDto dto) {
// TODO Auto-generated method stub
return null;
}
}

View File

@@ -0,0 +1,171 @@
package com.yxt.attend.biz.attendholiday;
import com.yxt.attend.api.attendholiday.*;
import com.yxt.common.base.config.RedisUtil;
import com.yxt.common.core.result.ResultBean;
import com.yxt.jlzx.system.api.user.User;
import com.yxt.jlzx.system.api.user.UserApi;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author dimengzhe
* @date 2020/11/19 15:17
* @description 休息日设置
*/
@Controller
@RequestMapping("v1/attendholidaysets")
@Api(tags = "考勤-休息日设置接口")
public class AttendHolidaySetApiImpl implements AttendHolidaySetApi {
@Autowired(required = false)
private HttpServletRequest httpServletRequest;
@Autowired
private RedisUtil redisUtil;
@Autowired
private UserApi userApi;
@Autowired
private AttendHolidaySetService attendHolidaySetService;
@Override
public ResultBean save(AttendHolidaySetDto attendHolidaySetDto) {
String token = httpServletRequest.getHeader("token");
String userName = redisUtil.get(token);
User user = userApi.selectByUserNameOne(userName).getData();
String year = attendHolidaySetDto.getYear();
System.err.println(year);
Map<String, Object> map = new HashMap<>();
map.put("dwSid", user.getOrganizationSid());
map.put("year", year);
AttendHolidaySet holidaySet = new AttendHolidaySet();
holidaySet.setDwSid(user.getOrganizationSid());
holidaySet.setYear(year);
String days = "";
// 验证
for (int i = 1; i <= 12; i++) {
switch (i) {
case 1:
map.put("month", "01");
holidaySet.setMonth("01");
days = attendHolidaySetDto.getJanDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
case 2:
map.put("month", "02");
holidaySet.setMonth("02");
days = attendHolidaySetDto.getFebDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
case 3:
map.put("month", "03");
holidaySet.setMonth("03");
days = attendHolidaySetDto.getMarDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
case 4:
map.put("month", "04");
holidaySet.setMonth("04");
days = attendHolidaySetDto.getAprDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
case 5:
map.put("month", "05");
holidaySet.setMonth("05");
days = attendHolidaySetDto.getMayDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
case 6:
map.put("month", "06");
holidaySet.setMonth("06");
days = attendHolidaySetDto.getJunDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
case 7:
map.put("month", "07");
holidaySet.setMonth("07");
days = attendHolidaySetDto.getJulDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
case 8:
map.put("month", "08");
holidaySet.setMonth("08");
days = attendHolidaySetDto.getAugDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
case 9:
map.put("month", "09");
holidaySet.setMonth("09");
days = attendHolidaySetDto.getSepDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
case 10:
map.put("month", "10");
holidaySet.setMonth("10");
days = attendHolidaySetDto.getOctDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
case 11:
map.put("month", "11");
holidaySet.setMonth("11");
days = attendHolidaySetDto.getNovDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
case 12:
map.put("month", "12");
holidaySet.setMonth("12");
days = attendHolidaySetDto.getDecDays();
days = attendHolidaySetService.checkDays(days);
holidaySet.setDay(days);
break;
default:
break;
}
AttendHolidaySet holidaySet0 = attendHolidaySetService.check(map);
if (null == holidaySet0) {
attendHolidaySetService.save(holidaySet);
} else {
holidaySet0.setDay(holidaySet.getDay());
attendHolidaySetService.updateById(holidaySet0);
}
}
return ResultBean.fireSuccess().setData(user.getOrganizationSid());
}
@Override
public ResultBean<List<AttendHolidaySetVo>> list(String year) {
String token = httpServletRequest.getHeader("token");
String userName = redisUtil.get(token);
User user = userApi.selectByUserNameOne(userName).getData();
List<AttendHolidaySetVo> list = attendHolidaySetService.getByYear(user.getOrganizationSid(), year);
return new ResultBean<List<AttendHolidaySetVo>>().success().setData(list);
}
@Override
public boolean checkIsHoliDay(AttendHolidaySetQuery attendHolidaySetQuery) {
AttendHolidaySet holidaySet = attendHolidaySetService.checkByDay(attendHolidaySetQuery);
if (null != holidaySet) {
return true;
}
return false;
}
}

View File

@@ -0,0 +1,30 @@
package com.yxt.attend.biz.attendholiday;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yxt.attend.api.attendholiday.AttendHolidaySet;
import com.yxt.attend.api.attendholiday.AttendHolidaySetQuery;
import com.yxt.attend.api.attendholiday.AttendHolidaySetVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @author dimengzhe
* @date 2020/11/19 15:59
* @description
*/
@Mapper
public interface AttendHolidaySetMapper extends BaseMapper<AttendHolidaySet> {
public AttendHolidaySet check(@Param("map") Map<String, Object> map);
public List<AttendHolidaySetVo> getByYear(@Param("organizationSid") String organizationSid, @Param("year") String year);
public List<AttendHolidaySet> getByYearOne(@Param("map") Map<String,Object> map);
public AttendHolidaySet checkByDay(@Param("attendHolidaySetQuery") AttendHolidaySetQuery attendHolidaySetQuery);
public String getDaysByMonth(@Param("map") Map<String, Object> map);
}

View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yxt.attend.biz.attendholiday.AttendHolidaySetMapper">
<select id="check" resultType="com.yxt.attend.api.attendholiday.AttendHolidaySet">
SELECT *
FROM attend_holiday_set
WHERE
<if test="map != null">
<if test="map.dwSid != null">
dwSid = #{map.dwSid}
</if>
<if test="map.year">
AND YEAR=#{map.year}
</if>
<if test="map.month">
AND MONTH=#{map.month}
</if>
</if>
</select>
<select id="getByYear" resultType="com.yxt.attend.api.attendholiday.AttendHolidaySetVo">
SELECT month, day
FROM attend_holiday_set
WHERE dwSid = #{organizationSid}
AND year = #{year}
</select>
<select id="getByYearOne" resultType="com.yxt.attend.api.attendholiday.AttendHolidaySet" parameterType="map">
SELECT month, day
FROM attend_holiday_set
WHERE dwSid = #{map.dwSid}
AND year = #{map.year}
</select>
<select id="checkByDay" resultType="com.yxt.attend.api.attendholiday.AttendHolidaySet"
parameterType="com.yxt.attend.api.attendholiday.AttendHolidaySetQuery">
SELECT *
FROM attend_holiday_set
WHERE 1=1
<if test='attendHolidaySetQuery != null and attendHolidaySetQuery != ""'>
<if test='attendHolidaySetQuery.dwSid != null and attendHolidaySetQuery.dwSid != ""'>
AND dwSid = #{attendHolidaySetQuery.dwSid}
</if>
<if test='attendHolidaySetQuery.year != null and attendHolidaySetQuery.year != ""'>
AND year = #{attendHolidaySetQuery.year}
</if>
<if test='attendHolidaySetQuery.month != null and attendHolidaySetQuery.month != ""'>
AND month = #{attendHolidaySetQuery.month}
</if>
<if test='attendHolidaySetQuery.day != null and attendHolidaySetQuery.day != ""'>
AND day LIKE CONCAT('%', #{attendHolidaySetQuery.day}, '%')
</if>
</if>
</select>
<select id="getDaysByMonth" resultType="java.lang.String" parameterType="map">
SELECT day
FROM attend_holiday_set
WHERE dwSid = #{map.dwSid}
AND year = #{map.year}
AND month = #{map.month}
</select>
</mapper>

View File

@@ -0,0 +1,134 @@
package com.yxt.attend.biz.attendholiday;
import com.yxt.attend.api.attendholiday.AttendHolidaySet;
import com.yxt.attend.api.attendholiday.AttendHolidaySetQuery;
import com.yxt.attend.api.attendholiday.AttendHolidaySetVo;
import com.yxt.common.base.service.MybatisBaseService;
import com.yxt.common.base.utils.DateUtils;
import com.yxt.common.base.utils.StringUtils;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* @author dimengzhe
* @date 2020/11/19 15:59
* @description
*/
@Service
public class AttendHolidaySetService extends MybatisBaseService<AttendHolidaySetMapper, AttendHolidaySet> {
public AttendHolidaySet check(Map<String, Object> map) {
return baseMapper.check(map);
}
public String checkDays(String days) {
if (!StringUtils.isEmpty(days)) {
String[] strings = days.split(",");
StringBuffer sb = new StringBuffer();
for (int j = 0; j < strings.length; j++) {
if (strings[j].length() == 1) {
sb.append("0" + strings[j] + ",");
} else {
sb.append(strings[j] + ",");
}
}
String string = sb.toString();
days = string.substring(0, string.length() - 1);
}
return days;
}
public List<AttendHolidaySetVo> getByYear(String organizationSid, String year) {
return baseMapper.getByYear(organizationSid, year);
}
public List<AttendHolidaySet> getByYearOne(Map<String, Object> map) {
return baseMapper.getByYearOne(map);
}
/**
* 判断当天是否为公休日
*
* @param attendHolidaySetQuery
* @return
*/
public AttendHolidaySet checkByDay(AttendHolidaySetQuery attendHolidaySetQuery) {
return baseMapper.checkByDay(attendHolidaySetQuery);
}
/**
* 根据月份获取公休日
*
* @param map
* @return
*/
public String getDaysByMonth(Map<String, Object> map) {
return baseMapper.getDaysByMonth(map);
}
// 根据单位sid查询改单位今年设置的公休日
public String getHolidays(String dwSid) {
Map<String, Object> map = new HashMap<String, Object>();
Calendar cal = Calendar.getInstance();
String year = String.valueOf(cal.get(Calendar.YEAR));
String month = String.valueOf(cal.get(Calendar.MONTH) + 1);
String day = String.valueOf(cal.get(Calendar.DATE));
cal.add(Calendar.MONTH, 1);
String nextMonth = String.valueOf(cal.get(Calendar.MONTH) + 1);
if (month.length() < 2) {
month = "0" + month;
}
if (nextMonth.length() < 2) {
nextMonth = "0" + nextMonth;
}
if (day.length() < 2) {
day = "0" + day;
}
Date today = DateUtils.dateStrConvertDateCST(year + "-" + month + "-" + day, "yyyy-MM-dd");
map.put("dwSid", dwSid);
map.put("year", year);
map.put("month", month);
map.put("nextMonth", nextMonth);
StringBuffer res = new StringBuffer();
List<AttendHolidaySet> list = getByYearOne(map);
for (AttendHolidaySet attendanceHolidaySet : list) {
String day1 = attendanceHolidaySet.getDay();
if (!StringUtils.isEmpty(day1)) {
String[] days = day1.split(",");
for (String d : days) {
String holiday = "";
holiday = year + "-" + attendanceHolidaySet.getMonth() + "-" + d;
Date date = DateUtils.dateStrConvertDateCST(holiday, "yyyy-MM-dd");
int i = date.compareTo(today);
if (i >= 0) {
res.append(holiday + ",");
}
}
}
}
return res.toString();
}
// 计算公休天数
public int getHolidayNum(String dwSid, String year, String month) {
int holidayNum = 0;
Map<String, Object> map = new HashMap<String, Object>();
map.put("dwSid", dwSid);
map.put("year", year);
map.put("month", month);
String holidays = getDaysByMonth(map);
if (!StringUtils.isEmpty(holidays)) {
String[] strings = holidays.split(",");
if (strings.length > 0) {
for (int k = 0; k < strings.length; k++) {
int temp = Integer.parseInt(strings[k]);
if (temp > 0 && temp <= 31) {
holidayNum += 1;
}
}
}
}
return holidayNum;
}
}

View File

@@ -0,0 +1,25 @@
package com.yxt.attend.biz.attendschedule;
import com.yxt.attend.api.attendschedule.AttendSchedule;
import com.yxt.attend.api.attendschedule.AttendScheduleApi;
import com.yxt.common.core.result.ResultBean;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* @author dimengzhe
* @date 2020/11/24 10:53
* @description
*/
public class AttendScheduleApiImpl implements AttendScheduleApi {
@Autowired
private AttendScheduleService attendScheduleService;
@Override
public ResultBean<List<AttendSchedule>> listOne() {
List<AttendSchedule> attendScheduleList = attendScheduleService.listOne();
return new ResultBean< List<AttendSchedule>>().success().setData(attendScheduleList);
}
}

View File

@@ -0,0 +1,20 @@
package com.yxt.attend.biz.attendschedule;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yxt.attend.api.attendschedule.AttendSchedule;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @author dimengzhe
* @date 2020/11/24 10:54
* @description
*/
@Mapper
public interface AttendScheduleMapper extends BaseMapper<AttendSchedule> {
public AttendSchedule checkByDwsid(String dwsid);
public List<AttendSchedule> listOne();
}

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yxt.attend.biz.attendschedule.AttendScheduleMapper">
<select id="checkByDwsid" resultType="com.yxt.attend.api.attendschedule.AttendSchedule">
SELECT *
FROM attend_schedule
WHERE dwsid = #{dwsid}
</select>
<select id="listOne" resultType="com.yxt.attend.api.attendschedule.AttendSchedule">
SELECT *
FROM attend_schedule
</select>
</mapper>

View File

@@ -0,0 +1,30 @@
package com.yxt.attend.biz.attendschedule;
import com.yxt.attend.api.attendschedule.AttendSchedule;
import com.yxt.common.base.service.MybatisBaseService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author dimengzhe
* @date 2020/11/24 10:54
* @description
*/
@Service
public class AttendScheduleService extends MybatisBaseService<AttendScheduleMapper, AttendSchedule> {
/**
* 根据单位sid查询该单位是否设置考勤
*
* @param dwsid 单位sid
* @return
*/
public AttendSchedule checkByDwsid(String dwsid) {
return baseMapper.checkByDwsid(dwsid);
}
public List<AttendSchedule> listOne(){
return baseMapper.listOne();
}
}

View File

@@ -0,0 +1,133 @@
package com.yxt.attend.biz.attendsigntype;
import com.yxt.attend.api.attendsigntype.AttendSignType;
import com.yxt.attend.api.attendsigntype.AttendSignTypeApi;
import com.yxt.attend.api.attendsigntype.AttendSignTypeDto;
import com.yxt.attend.api.attendtimetable.AttendTimetable;
import com.yxt.attend.biz.attendtimetable.AttendTimetableService;
import com.yxt.common.base.utils.DateUtils;
import com.yxt.common.core.result.ResultBean;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author dimengzhe
* @date 2020/11/23 14:01
* @description
*/
@Controller
@RequestMapping("v1/attendsigntypes")
@Api(tags = "考勤规则设置接口")
public class AttendSignTypeApiImpl implements AttendSignTypeApi {
@Autowired
private AttendSignTypeService attendSignTypeService;
@Autowired
private AttendTimetableService attendTimetableService;
@Override
public ResultBean saveSignType(AttendSignTypeDto attendSignTypeDto) throws ParseException {
String dwSid = attendSignTypeDto.getDwSid();
String type = attendSignTypeDto.getType();
String startDate = attendSignTypeDto.getStartDate().toString();
String now = DateUtils.dateConvertStr(new Date(), "yyyy-MM");
if (startDate.compareTo(now) < 0) {
return ResultBean.fireFail().setMsg("不能设置本月之前的签卡方式!");
} else {
// 去掉传入年月后有签卡方式的设置
List<AttendSignType> afterDate = attendSignTypeService.selectByAfterDate(dwSid, startDate);
if (null != afterDate) {
for(int i=0;i<afterDate.size();i++) {
attendSignTypeService.deleteBySid(afterDate.get(i).getSid());
}
}
// 查询之前是否有签卡方式的设置
AttendSignType attendanceSignTypeOld = attendSignTypeService.check(dwSid, startDate);
AttendSignType attendanceSignType = new AttendSignType();
attendanceSignType.setDwSid(dwSid);
attendanceSignType.setType(Integer.parseInt(type));
attendanceSignType.setStartDate(startDate);
attendSignTypeService.save(attendanceSignType);
if (null != attendanceSignTypeOld) {
// 更新签卡方式,结束时间为上一月
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Date date = sdf.parse(startDate);
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.MONTH, -1);
Date endDate = c.getTime();
attendanceSignTypeOld.setEndDate(sdf.format(endDate));
attendSignTypeService.updateById(attendanceSignTypeOld);
}
}
return ResultBean.fireSuccess().setMsg("设置成功");
}
@Override
public ResultBean checkSignTypeAfterDate(String dwSid, String startDate) {
List<AttendSignType> afterDate = attendSignTypeService.selectByAfterDate(dwSid, startDate);
if (null == afterDate||afterDate.size()==0) {
return ResultBean.fireFail().setMsg("");
}
return ResultBean.fireSuccess().setMsg("你所选起始时间后已有签卡方式设置,修改后将删除已设置的作息时间");
}
@Override
public ResultBean checkByDate(String dwSid, String startDate) {
AttendSignType attendanceSignType = attendSignTypeService.check(dwSid, startDate);
if (null == attendanceSignType) {
return ResultBean.fireFail().setMsg("");
}
return ResultBean.fireSuccess().setData(attendanceSignType);
}
@Override
public ResultBean getAttendnceSetDate(String dwSid) {
AttendSignType attendanceSignType = attendSignTypeService.selectByDwSid(dwSid);
AttendTimetable attendanceTimetable = attendTimetableService.selectByDwSid(dwSid);
Map<String, Object> map = new HashMap<String, Object>();
if (null != attendanceSignType) {
map.put("type", attendanceSignType.getType());
map.put("startDate", attendanceSignType.getStartDate());
} else {
map.put("type", "");
map.put("startDate", "");
}
if (null != attendanceTimetable) {
map.put("amSignIn", attendanceTimetable.getAmSignIn());
map.put("amSignInAfterTerm",attendanceTimetable.getAmSignInAfterTerm());
map.put("amSignInFrontTerm",attendanceTimetable.getAmSignInFrontTerm());
map.put("amSignOut", attendanceTimetable.getAmSignOut());
map.put("amSignOutAfterTerm",attendanceTimetable.getAmSignOutAfterTerm());
map.put("amSignOutFrontTerm",attendanceTimetable.getAmSignOutFrontTerm());
map.put("pmSignIn", attendanceTimetable.getPmSignIn());
map.put("pmSignInAfterTerm",attendanceTimetable.getPmSignInAfterTerm());
map.put("pmSignInFrontTerm",attendanceTimetable.getPmSignInFrontTerm());
map.put("pmSignOut", attendanceTimetable.getPmSignOut());
map.put("pmSignOutAfterTerm",attendanceTimetable.getPmSignOutAfterTerm());
map.put("pmSignOutFrontTerm",attendanceTimetable.getPmSignOutFrontTerm());
map.put("startDate2", attendanceTimetable.getStartDate());
} else {
map.put("amSignIn", "");
map.put("amSignOut", "");
map.put("pmSignIn", "");
map.put("pmSignOut", "");
map.put("startDate2", "");
}
return ResultBean.fireSuccess().setData(map);
}
}

View File

@@ -0,0 +1,25 @@
package com.yxt.attend.biz.attendsigntype;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yxt.attend.api.attendsigntype.AttendSignType;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* @author dimengzhe
* @date 2020/11/23 14:01
* @description
*/
@Mapper
public interface AttendSignTypeMapper extends BaseMapper<AttendSignType> {
public AttendSignType check(@Param("dwSid") String dwSid, @Param("startDate") String startDate);
public List<AttendSignType> selectByAfterDate(@Param("dwSid") String dwSid, @Param("startDate") String startDate);
public AttendSignType selectByDwSid(String dwSid);
}

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yxt.attend.biz.attendsigntype.AttendSignTypeMapper">
<select id="check" resultType="com.yxt.attend.api.attendsigntype.AttendSignType">
SELECT *
FROM attend_sign_type
WHERE dwSid = #{dwSid}
AND startDate &lt;= #{startDate}
AND (endDate IS NULL OR endDate &gt;= #{startDate})
ORDER BY id DESC
</select>
<select id="selectByAfterDate" resultType="com.yxt.attend.api.attendsigntype.AttendSignType">
SELECT *
FROM attend_sign_type
WHERE dwSid = #{dwSid}
AND startDate &gt;= #{startDate}
</select>
<select id="selectByDwSid" resultType="com.yxt.attend.api.attendsigntype.AttendSignType">
SELECT *
FROM attend_sign_type
WHERE id = (SELECT max(id) FROM attend_sign_type WHERE dwSid = #{dwSid})
</select>
</mapper>

View File

@@ -0,0 +1,36 @@
package com.yxt.attend.biz.attendsigntype;
import com.yxt.attend.api.attendsigntype.AttendSignType;
import com.yxt.common.base.service.MybatisBaseService;
import java.util.List;
import org.springframework.stereotype.Service;
/**
* @author dimengzhe
* @date 2020/11/23 14:01
* @description
*/
@Service
public class AttendSignTypeService extends MybatisBaseService<AttendSignTypeMapper, AttendSignType> {
public AttendSignType check(String dwSid, String startDate) {
return baseMapper.check(dwSid, startDate);
}
/**
* 查询传入年月后有无考勤作息时间设置
*
* @param dwSid 单位sid
* @param startDate 开始日期
* @return
*/
public List<AttendSignType> selectByAfterDate(String dwSid, String startDate) {
return baseMapper.selectByAfterDate(dwSid, startDate);
}
public AttendSignType selectByDwSid(String dwSid) {
return baseMapper.selectByDwSid(dwSid);
}
}

View File

@@ -0,0 +1,177 @@
package com.yxt.attend.biz.attendstatistics;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yxt.attend.api.attendance.Attendance;
import com.yxt.attend.api.attendance.AttendanceListQuery;
import com.yxt.attend.api.attendance.AttendanceListVo;
import com.yxt.attend.api.attendsigntype.AttendSignType;
import com.yxt.attend.api.attendstatistics.AttendStatistics;
import com.yxt.attend.api.attendstatistics.AttendStatisticsApi;
import com.yxt.attend.api.attendstatistics.AttendStatisticsOneQuery;
import com.yxt.attend.biz.attendholiday.AttendHolidaySetService;
import com.yxt.attend.biz.attendsigntype.AttendSignTypeService;
import com.yxt.common.base.config.RedisUtil;
import com.yxt.common.base.utils.DateUtils;
import com.yxt.common.base.utils.PagerUtil;
import com.yxt.common.core.query.PagerQuery;
import com.yxt.common.core.result.ResultBean;
import com.yxt.common.core.vo.PagerVo;
import com.yxt.jlzx.system.api.user.User;
import com.yxt.jlzx.system.api.user.UserApi;
import io.swagger.annotations.Api;
import org.bouncycastle.cms.PasswordRecipientId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author dimengzhe
* @date 2020/11/24 11:54
* @description
*/
@Controller
@RequestMapping("v1/attendStatisticss")
@Api(tags = "考勤-月考勤")
public class AttendStatisticsApiImpl implements AttendStatisticsApi {
@Autowired
private RedisUtil redisUtil;
@Autowired(required = false)
private HttpServletRequest httpServletRequest;
@Autowired
private UserApi userApi;
@Autowired
private AttendStatisticsService attendStatisticsService;
@Autowired
private AttendHolidaySetService attendHolidaySetService;
@Autowired
private AttendSignTypeService attendanceSignTypeService;
@Override
public ResultBean<PagerVo<AttendanceListVo>> pagerList(PagerQuery<AttendanceListQuery> pagerQuery) {
ResultBean<PagerVo<AttendanceListVo>> rb = ResultBean.fireFail();
String token = httpServletRequest.getHeader("token");
//String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyTm8iOiI5NiIsImlzcyI6IldCSyIsImV4cCI6MTYwNjg3MzM1NX0.6A65frhR62JrsimE_I-mtAqtmkeymfvZdN6fPMhAUf4";
String userName = redisUtil.get(token);
ResultBean<User> userResultBean = userApi.selectByUserNameOne(userName);
User user = userResultBean.getData();
PagerVo<AttendanceListVo> pv = new PagerVo<>();
IPage<AttendanceListVo> p2 = attendStatisticsService.pageList(user,pagerQuery);
PagerVo<AttendanceListVo> pv1 = PagerUtil.pageToVo(p2, pv);
return rb.success().setData(pv1);
}
@Override
public ResultBean userList(AttendStatisticsOneQuery attendStatisticsOneQuery) {
String year =attendStatisticsOneQuery.getYear();
String month = attendStatisticsOneQuery.getMonth();
String userSid =attendStatisticsOneQuery.getUserSid();
Map<String, Object> map = new HashMap<String, Object>();
map.put("year", year);
map.put("month", month);
map.put("userSid", userSid);
List<Attendance> list = attendStatisticsService.getByUserSid(map);
return ResultBean.fireSuccess().setData(list);
}
/**
* 月考勤记录
* @param request
*/
@Override
public ResultBean<Map<String, Object>> monthIndex() {
String token = httpServletRequest.getHeader("token");
String userName = redisUtil.get(token);
User user = userApi.selectByUserNameOne(userName).getData();
String dwsid=user.getOrganizationSid();
Date today = new Date();
String year = DateUtils.dateConvertStr(today, "yyyy");
String month = DateUtils.dateConvertStr(today, "MM");
Map<String, Object> map=new HashMap<String, Object>();
map.put("dwSid", dwsid);
map.put("userType",user.getIsAdmin());
map.put("userSid",user.getSid());
map.put("year",year);
map.put("month",month);
return new ResultBean<Map<String, Object>>().success().setData(map);
}
@Override
public ResultBean<Map<String, Object>> getAttendHolidayNum(
@Valid AttendStatisticsOneQuery attendStatisticsOneQuery) {
Map<String, Object> map = new HashMap<String, Object>();
String dwSid =attendStatisticsOneQuery.getDwSid();
String userSid =attendStatisticsOneQuery.getUserSid();
String year =attendStatisticsOneQuery.getYear();
String month = attendStatisticsOneQuery.getMonth();
Map<String, Object> mapPara = new HashMap<String, Object>();
mapPara.put("userSid", userSid);
mapPara.put("year", year);
mapPara.put("month", month);
Map<String, Object> m1 = new HashMap<String, Object>();
m1.put("dwSid", dwSid);
m1.put("userSid", userSid);
m1.put("year", year);
m1.put("month", month);
AttendStatistics statistics = attendStatisticsService.selectByUserSid(m1);
if(statistics!=null) {
map.put("statistics", statistics); // 统计数字
// int holidayNum =attendHolidaySetService.getHolidayNum(dwSid, year, month);
// map.put("holidayNum", holidayNum);
// int allday = DateUtils.getMonthLastDay(Integer.valueOf(year), Integer.valueOf(month));
// map.put("allday", allday); // 全月天数
// map.put("allAttendanceDay", allday-holidayNum); // 全月天数
// map.put("absenceDay", allday-holidayNum); // 缺勤天数
// Date today = new Date();
// String startDate = DateUtils.dateConvertStr(today, "yyyy-MM");
// AttendSignType attendanceSignType = attendanceSignTypeService.check(dwSid, startDate);
// int supposedNum =0;
// if(attendanceSignType!=null) {
// supposedNum = attendanceSignType.getType()*2 * (new Double(allday-holidayNum)).intValue();
// }else {
// supposedNum = 2*2 * (new Double(allday-holidayNum)).intValue();
// }
// map.put("supposedNum", supposedNum); // 应签次数
// map.put("missNum", supposedNum); // 漏签次数
}else {
statistics=new AttendStatistics();
int allday = DateUtils.getMonthLastDay(Integer.valueOf(year), Integer.valueOf(month));
Date today = new Date();
int holidayNum =attendHolidaySetService.getHolidayNum(dwSid, year, month);
String startDate = DateUtils.dateConvertStr(today, "yyyy-MM");
AttendSignType attendanceSignType = attendanceSignTypeService.check(dwSid, startDate);
int supposedNum =0;
if(attendanceSignType!=null) {
supposedNum = attendanceSignType.getType()*2 * (new Double(allday-holidayNum)).intValue();
}else {
supposedNum = 2*2 * (new Double(allday-holidayNum)).intValue();
}
statistics.setAllDay((double) (allday));
statistics.setAttendanceDay((double) 0);
statistics.setOvertimeDay((double) 0);
statistics.setTripDay((double) 0);
statistics.setVacationDay((double) 0);
statistics.setSupposedNum(supposedNum);
statistics.setNormalNum(0);
statistics.setOvTimeNum(0);
statistics.setEarlyNum(0);
statistics.setLateNum(0);
statistics.setMissNum(supposedNum);
map.put("statistics", statistics); // 统计数字
}
return new ResultBean<Map<String, Object>>().success().setData(map);
}
}

View File

@@ -0,0 +1,29 @@
package com.yxt.attend.biz.attendstatistics;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.yxt.attend.api.attendance.Attendance;
import com.yxt.attend.api.attendance.AttendanceListVo;
import com.yxt.attend.api.attendstatistics.AttendStatistics;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @author dimengzhe
* @date 2020/11/24 11:54
* @description
*/
@Mapper
public interface AttendStatisticsMapper extends BaseMapper<AttendStatistics> {
public AttendStatistics selectByUserSid(@Param("map") Map<String, Object> map);
public IPage<AttendanceListVo> pageList(IPage<?> page, @Param(Constants.WRAPPER) Wrapper<AttendanceListVo> qw);
public List<Attendance> getByUserSid(@Param("map") Map<String, Object> map);
}

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yxt.attend.biz.attendstatistics.AttendStatisticsMapper">
<select id="selectByUserSid" resultType="com.yxt.attend.api.attendstatistics.AttendStatistics"
parameterType="map">
SELECT *
FROM attend_statistics
WHERE userSid = #{map.userSid}
AND year = #{map.year}
AND month = #{map.month}
</select>
<select id="pageList" resultType="com.yxt.attend.api.attendance.AttendanceListVo">
SELECT DISTINCT(u.sid) AS uSid, si.name name, d.name deptName, atts.*
FROM jlzx_base.workexperience w
LEFT JOIN jlzx_system.user u ON u.staffSid = w.staffSid
LEFT JOIN attend_statistics atts ON u.sid = atts.userSid
LEFT JOIN jlzx_system.department_staff ds ON ds.staffSid = u.staffSid
LEFT JOIN jlzx_system.department d ON d.sid = ds.departmentSid
LEFT JOIN jlzx_base.staffinfo si ON u.staffSid = si.sid
${ew.customSqlSegment}
</select>
<select id="getByUserSid">
SELECT ad.*, t.sum
FROM attendance ad
LEFT JOIN (SELECT day, MAX(ovTimeSum) sum
FROM attendance
WHERE year = #{map.year}
AND month = #{map.month}
AND userSid = #{map.userSid}
GROUP BY day) t ON t.day = ad.day
WHERE ad.year = #{map.year}
AND ad.month = #{map.month}
AND ad.userSid = #{map.userSid}
ORDER BY ad.day ASC
</select>
</mapper>

View File

@@ -0,0 +1,84 @@
package com.yxt.attend.biz.attendstatistics;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yxt.attend.api.attendance.Attendance;
import com.yxt.attend.api.attendance.AttendanceListQuery;
import com.yxt.attend.api.attendance.AttendanceListVo;
import com.yxt.attend.api.attendstatistics.AttendStatistics;
import com.yxt.common.base.service.MybatisBaseService;
import com.yxt.common.base.utils.DateUtils;
import com.yxt.common.base.utils.PagerUtil;
import com.yxt.common.base.utils.StringUtils;
import com.yxt.common.core.query.PagerQuery;
import com.yxt.jlzx.system.api.user.User;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author dimengzhe
* @date 2020/11/24 11:54
* @description
*/
@Service
public class AttendStatisticsService extends MybatisBaseService<AttendStatisticsMapper, AttendStatistics> {
public AttendStatistics selectByUserSid(Map<String, Object> map) {
return baseMapper.selectByUserSid(map);
}
public IPage<AttendanceListVo> pageList(User user, PagerQuery<AttendanceListQuery> pagerQuery) {
String dwSid = user.getOrganizationSid();
String userSid = user.getSid();
int isAdmin = user.getIsAdmin();
IPage<AttendanceListQuery> page = PagerUtil.queryToPage(pagerQuery);
AttendanceListQuery params = pagerQuery.getParams();
QueryWrapper<AttendanceListVo> qw = new QueryWrapper<>();
if (params != null) {
String dept = params.getDept();
String name = params.getName();
String date = params.getDate();
String year = "";
String month = "";
String dateOne = "";
if (StringUtils.isBlank(date)) {
Date today = new Date();
year = DateUtils.dateConvertStr(today, "yyyy");
month = DateUtils.dateConvertStr(today, "MM");
dateOne = DateUtils.dateConvertStr(today, "yyyy-MM-dd");
} else {
year = date.substring(0, 4);
month = date.substring(5);
dateOne = date;
qw.eq("atts.year", year);
qw.eq("atts.month", month);
}
if (StringUtils.isNotBlank(dept)) {
qw.like("d.name", dept);
}
if (StringUtils.isNotBlank(name)) {
qw.like("si.name", name);
}
qw.eq("u.isAdmin", 2);
}
qw.eq("w.orgSid", dwSid);
if (isAdmin != 1) {
qw.eq("u.sid", userSid);
}
qw.isNotNull("u.id");
qw.orderByDesc("u.id");
return baseMapper.pageList(page, qw);
}
public List<Attendance> getByUserSid(Map<String, Object> map) {
return baseMapper.getByUserSid(map);
}
}

View File

@@ -0,0 +1,148 @@
package com.yxt.attend.biz.attendtimetable;
import com.alibaba.fastjson.JSON;
import com.yxt.attend.api.attendschedule.AttendSchedule;
import com.yxt.attend.api.attendtimetable.AttendTimetable;
import com.yxt.attend.api.attendtimetable.AttendTimetableApi;
import com.yxt.attend.api.attendtimetable.AttendTimetableDto;
import com.yxt.attend.api.attendtimetable.AttendTimetableQuery;
import com.yxt.attend.biz.appattend.AttendanceScheduleTask;
import com.yxt.attend.biz.attendschedule.AttendScheduleService;
import com.yxt.common.base.utils.DateUtils;
import com.yxt.common.base.utils.StringUtils;
import com.yxt.common.core.result.ResultBean;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* @author dimengzhe
* @date 2020/11/23 14:05
* @description
*/
@Controller
@RequestMapping("v1/attendtimetables")
@Api(tags = "考勤规则工作日作息时间设置接口")
public class AttendTimetableApiImpl implements AttendTimetableApi {
@Autowired
private AttendTimetableService attendTimetableService;
@Autowired
private AttendScheduleService attendanceScheduleService;
@Autowired
private AttendanceScheduleTask attendanceScheduleTask;
@Override
public ResultBean checkTimetableAfterDate(String dwSid, String startDate) {
// AttendTimetable afterDate = attendTimetableService.selectByAfterDate(dwSid, startDate);
List<AttendTimetable> afterDate = attendTimetableService.selectByAfterDate(dwSid, startDate);
if(afterDate==null||afterDate.size()==0) {
return ResultBean.fireFail().setMsg("");
}
// if (null == afterDate) {
// return ResultBean.fireFail().setMsg("");
// }
return ResultBean.fireSuccess().setMsg("你所选起始时间后已有作息时间设置,修改后将删除已设置的作息时间");
}
@Override
public ResultBean save(AttendTimetableDto attendTimetableDto) throws ParseException {
String dwSid = attendTimetableDto.getDwSid();
String startDate = attendTimetableDto.getStartDate();
String amSignIn = attendTimetableDto.getAmSignIn();
String amSignOut = attendTimetableDto.getAmSignOut();
String pmSignIn = attendTimetableDto.getPmSignIn();
String pmSignOut = attendTimetableDto.getPmSignOut();
String now = DateUtils.dateConvertStr(new Date(), "yyyy-MM");
// <= 及本月(方便调试改)
if (startDate.compareTo(now) < 0) {
return ResultBean.fireFail().setMsg("不能设置本月之前的考勤规则!");
} else {
// 去掉传入年月后有考勤作息时间的设置
List<AttendTimetable> afterDate = attendTimetableService.selectByAfterDate(dwSid, startDate);
if(afterDate!=null&&afterDate.size()>0) {
for (int i = 0; i < afterDate.size(); i++) {
attendTimetableService.deleteBySid(afterDate.get(i).getSid());
}
}
// if (null != afterDate) {
// attendTimetableService.deleteBySid(afterDate.getSid());
// }
// 查询之前是否有考勤作息时间的设置
AttendTimetable attendanceTimetableOld = attendTimetableService.check(dwSid, startDate);
AttendTimetable attendanceTimetable = new AttendTimetable();
attendanceTimetable.setDwSid(dwSid);
attendanceTimetable.setStartDate(startDate);
attendanceTimetable.setAmSignIn(amSignIn);
attendanceTimetable.setAmSignOut(amSignOut);
attendanceTimetable.setPmSignIn(pmSignIn);
attendanceTimetable.setPmSignOut(pmSignOut);
attendanceTimetable.setAmSignInFrontTerm(attendTimetableDto.getAmSignInFrontTerm());
attendanceTimetable.setAmSignInAfterTerm(attendTimetableDto.getAmSignInAfterTerm());
attendanceTimetable.setAmSignOutFrontTerm(attendTimetableDto.getAmSignOutFrontTerm());
attendanceTimetable.setAmSignOutAfterTerm(attendTimetableDto.getAmSignOutAfterTerm());
attendanceTimetable.setPmSignInFrontTerm(attendTimetableDto.getPmSignInFrontTerm());
attendanceTimetable.setPmSignInAfterTerm(attendTimetableDto.getPmSignInAfterTerm());
attendanceTimetable.setPmSignOutAfterTerm(attendTimetableDto.getPmSignOutAfterTerm());
attendanceTimetable.setPmSignOutFrontTerm(attendTimetableDto.getPmSignOutFrontTerm());
attendTimetableService.save(attendanceTimetable);
if (null != attendanceTimetableOld) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Date date = sdf.parse(startDate);
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.MONTH, -1);
Date endDate = c.getTime();
attendanceTimetableOld.setEndDate(sdf.format(endDate));
attendTimetableService.updateById(attendanceTimetableOld);
}
AttendSchedule attendanceSchedule = attendanceScheduleService.checkByDwsid(dwSid);
if (null == attendanceSchedule) {
attendanceSchedule = new AttendSchedule();
attendanceSchedule.setDwSid(dwSid);
attendanceSchedule.setAmSignInCron(transToCron(attendanceTimetable.getAmSignIn()));
attendanceSchedule.setAmSignOutCron(transToCron(attendanceTimetable.getAmSignOut()));
attendanceSchedule.setPmSignInCron(transToCron(attendanceTimetable.getPmSignIn()));
attendanceSchedule.setPmSignOutCron(transToCron(attendanceTimetable.getPmSignOut()));
attendanceScheduleService.save(attendanceSchedule);
} else {
attendanceSchedule.setAmSignInCron(transToCron(attendanceTimetable.getAmSignIn()));
attendanceSchedule.setAmSignOutCron(transToCron(attendanceTimetable.getAmSignOut()));
attendanceSchedule.setPmSignInCron(transToCron(attendanceTimetable.getPmSignIn()));
attendanceSchedule.setPmSignOutCron(transToCron(attendanceTimetable.getPmSignOut()));
attendanceScheduleService.updateById(attendanceSchedule);
}
attendanceScheduleTask.restart(); // 重新设置定时任务
}
return ResultBean.fireSuccess().setMsg("保存成功");
}
@Override
public ResultBean list(AttendTimetableQuery attendTimetableQuery) {
String dwSid = attendTimetableQuery.getDwSid();
String year = attendTimetableQuery.getYear();
String month = attendTimetableQuery.getMonth();
AttendTimetable attendanceTimetable = attendTimetableService.check(dwSid, year + "-" + month);
return ResultBean.fireSuccess().setData(attendanceTimetable);
}
// 将考勤设置的时间转换为定时格式
public String transToCron(String signTime) {
if (StringUtils.isEmpty(signTime)) {
return "";
} else {
String hour = signTime.substring(0, 2);
String min = signTime.substring(3, 5);
String cron = "00 " + min + " " + hour + " ? * *";
return cron;
}
}
}

View File

@@ -0,0 +1,25 @@
package com.yxt.attend.biz.attendtimetable;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yxt.attend.api.attendtimetable.AttendTimetable;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author dimengzhe
* @date 2020/11/23 14:06
* @description
*/
@Mapper
public interface AttendTimetableMapper extends BaseMapper<AttendTimetable> {
public AttendTimetable check(@Param("dwSid") String dwSid, @Param("startDate") String startDate);
public List<AttendTimetable> selectByAfterDate(@Param("dwSid") String dwSid, @Param("startDate") String startDate);
public List<AttendTimetable> selectBySignTime(@Param("time")String time);
public AttendTimetable selectByDwSid(String dwSid);
}

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yxt.attend.biz.attendtimetable.AttendTimetableMapper">
<select id="check" resultType="com.yxt.attend.api.attendtimetable.AttendTimetable">
SELECT *
FROM attend_timetable
WHERE dwSid = #{dwSid}
AND startDate &lt;= #{startDate}
AND (endDate IS NULL OR endDate &gt;= #{startDate})
ORDER BY id DESC
</select>
<select id="selectByAfterDate" resultType="com.yxt.attend.api.attendtimetable.AttendTimetable">
SELECT *
FROM attend_timetable
WHERE dwSid = #{dwSid}
AND startDate &gt;= #{startDate}
</select>
<select id="selectBySignTime" resultType="com.yxt.attend.api.attendtimetable.AttendTimetable">
SELECT *
FROM attend_timetable
WHERE 1 = 1
AND (LEFT(amSignIn,5) = #{time} OR LEFT(amSignOut,5) = #{time} OR LEFT(pmSignIn,5) = #{time} OR LEFT(pmSignOut,5) = #{time})
</select>
<select id="selectByDwSid" resultType="com.yxt.attend.api.attendtimetable.AttendTimetable">
SELECT *
FROM attend_timetable
WHERE id = (SELECT max(id) FROM attend_timetable WHERE dwSid = #{dwSid})
</select>
</mapper>

View File

@@ -0,0 +1,239 @@
package com.yxt.attend.biz.attendtimetable;
import com.yxt.attend.api.attendance.Attendance;
import com.yxt.attend.api.attendtimetable.AttendTimetable;
import com.yxt.attend.biz.attendance.AttendanceService;
import com.yxt.common.base.service.MybatisBaseService;
import com.yxt.common.base.utils.DateUtils;
import com.yxt.common.core.result.ResultBean;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author dimengzhe
* @date 2020/11/23 14:05
* @description
*/
@Service
public class AttendTimetableService extends MybatisBaseService<AttendTimetableMapper, AttendTimetable> {
@Autowired
private AttendanceService attendanceService;
public AttendTimetable check(String dwSid, String startDate) {
return baseMapper.check(dwSid, startDate);
}
// 查询传入年月后有无考勤作息时间设置
public List<AttendTimetable> selectByAfterDate(String dwSid, String startDate) {
return baseMapper.selectByAfterDate(dwSid, startDate);
}
// 根据当前时间查询有需要打卡的单位
public List<AttendTimetable> selectBySignTime(String time) {
return baseMapper.selectBySignTime(time);
}
public AttendTimetable selectByDwSid(String dwSid) {
return baseMapper.selectByDwSid(dwSid);
}
//单位是否设置签到打卡时间限制
public Boolean selectAttendTimetable(Integer signType,String dwSid, String startDate) {
AttendTimetable attendTimetable=check(dwSid,startDate);
if(1==signType) {
if(StringUtils.isNotBlank(attendTimetable.getAmSignInFrontTerm())&&StringUtils.isNotBlank(attendTimetable.getAmSignInAfterTerm())&&StringUtils.isNotBlank(attendTimetable.getPmSignOutFrontTerm())&&StringUtils.isNotBlank(attendTimetable.getPmSignOutAfterTerm())) {
return true;
}else {
return false;
}
}else {
if(StringUtils.isNotBlank(attendTimetable.getAmSignInFrontTerm())&&StringUtils.isNotBlank(attendTimetable.getAmSignInAfterTerm())&&StringUtils.isNotBlank(attendTimetable.getAmSignOutFrontTerm())&&StringUtils.isNotBlank(attendTimetable.getAmSignOutAfterTerm())&&StringUtils.isNotBlank(attendTimetable.getPmSignInFrontTerm())&&StringUtils.isNotBlank(attendTimetable.getPmSignInAfterTerm())&&StringUtils.isNotBlank(attendTimetable.getPmSignOutFrontTerm())&&StringUtils.isNotBlank(attendTimetable.getPmSignOutAfterTerm())) {
return true;
}else {
return false;
}
}
}
public ResultBean<Attendance> selectCheckTime(String userSid,Integer signType,String dwSid, String startDate,String curDay,String time) {
Attendance attendance=new Attendance();
Attendance lastAttend = attendanceService.selectLastByDay(userSid, curDay);
if(lastAttend!=null&&lastAttend.getSignNumType()>=4) {
return new ResultBean<Attendance>().fail().setData(null).setMsg("当天打卡记录已全部打完");//当天打卡记录已全部打完
}else {
AttendTimetable attendTimetable=check(dwSid,startDate);
if(1==signType) {//打卡2次
Boolean b1=istrueterm(attendTimetable.getAmSignIn(),attendTimetable.getAmSignInFrontTerm(),attendTimetable.getAmSignInAfterTerm(),time);
Boolean b2=istrueterm(attendTimetable.getPmSignOut(),attendTimetable.getPmSignOutFrontTerm(),attendTimetable.getPmSignOutAfterTerm(),time);
if(b1||b2) {//判断当前打卡时间是否在打卡时间范围内
if(b1) {
if(lastAttend==null) {
attendance.setSignNumType(1);//打卡次数类型1、上午签到2、上午签退3、下午签到4、下午签退5、加班签到6、加班签退
}else {
return new ResultBean<Attendance>().fail().setData(null).setMsg("上午已签到");
}
}
if(b2) {
attendance.setSignNumType(4);
}
return new ResultBean<Attendance>().success().setData(attendance);
}else {
return new ResultBean<Attendance>().fail().setData(null).setMsg("当前打卡时间不在打卡时间范围内");
}
}else {//打卡4次
Boolean b1=istrueterm(attendTimetable.getAmSignIn(),attendTimetable.getAmSignInFrontTerm(),attendTimetable.getAmSignInAfterTerm(),time);
Boolean b2=istrueterm(attendTimetable.getAmSignOut(),attendTimetable.getAmSignOutFrontTerm(),attendTimetable.getAmSignOutAfterTerm(),time);
Boolean b3=istrueterm(attendTimetable.getPmSignIn(),attendTimetable.getPmSignInFrontTerm(),attendTimetable.getPmSignInAfterTerm(),time);
Boolean b4=istrueterm(attendTimetable.getPmSignOut(),attendTimetable.getPmSignOutFrontTerm(),attendTimetable.getPmSignOutAfterTerm(),time);
if(b1||b2||b3||b4) {
if(b1) {
if(lastAttend==null) {
attendance.setSignNumType(1);//打卡次数类型1、上午签到2、上午签退3、下午签到4、下午签退5、加班签到6、加班签退
}else {
return new ResultBean<Attendance>().fail().setData(null).setMsg("上午已签到");
}
}
if(b2||b3) {//签到时间既在上午签退范围内又在下午签到范围内判断是上午签退还是下午签到
if(lastAttend!=null) {//当天打卡记录不为空
if(lastAttend.getSignNumType()==1) {//
attendance.setSignNumType(2);//上午签退
}else if(lastAttend.getSignNumType()==2){
attendance.setSignNumType(3);//下午签到
}else{
return new ResultBean<Attendance>().fail().setData(null).setMsg("下午已签到");
}
}else {
attendance.setSignNumType(2);//上午签退
}
}else {
if(b2) {
if(lastAttend!=null) {//当天打卡记录不为空
if(lastAttend.getSignNumType()==1) {
attendance.setSignNumType(2);//上午签退
}else{
return new ResultBean<Attendance>().fail().setData(null).setMsg("上午已签退");
}
}else {
attendance.setSignNumType(2);//上午签退
}
}
if(b3) {
if(lastAttend!=null) {//当天打卡记录不为空
if(lastAttend.getSignNumType()==2) {
attendance.setSignNumType(3);//下午签到
}else{
return new ResultBean<Attendance>().fail().setData(null).setMsg("下午已签到");
}
}else {
attendance.setSignNumType(2);//上午签退
}
}
}
if(b4) {
attendance.setSignNumType(4);
}
return new ResultBean<Attendance>().success().setData(attendance);
}else {
return new ResultBean<Attendance>().fail().setData(null).setMsg("当前打卡时间不在打卡时间范围内");
}
}
}
}
//根据期限设置以及签到时间判断能否打卡
public Boolean istrueterm(String sign,String frontTerm,String afterTerm,String time){
Boolean b = true;
//将设置的时间转化为分钟并于设置签到时间对比得到正确时间
Double aDoubleStart = Double.valueOf(frontTerm);//打卡时间前限制
Double aDoubleEnd = Double.valueOf(afterTerm);//打卡时间后限制
double vStart = aDoubleStart * 60;
double vEnd = aDoubleEnd * 60;
int timefrontterm = new Double(vStart).intValue();
int timeafterterm = new Double(vEnd).intValue();
//将签到时间转换为分钟
int timeqiandao = Integer.valueOf(sign.substring(0,2))*60+Integer.valueOf(sign.substring(3,5));
//根据打卡类型计算两个时间得到签到时间
int timestart=0;
int timeend=0;
timestart = timeqiandao - timefrontterm;
timeend = timeqiandao + timeafterterm;
String resultStartStr = "";
//将分钟转成小时
if (timestart != 0) {
if (timestart/60 == 0) {
resultStartStr ="00:"+timestart%60;
}else{
if (timestart%60 == 0) {
resultStartStr = timestart/60+":00";
}else{
resultStartStr = (timestart/60+":"+timestart%60);
}
}
}else {
resultStartStr = "00:00";
}
String resultEndStr = "";
//将分钟转成小时
if (timeend != 0) {
if (timeend/60 == 0) {
resultEndStr ="00:"+timeend%60;
}else{
if (timeend%60 == 0) {
resultEndStr = timeend/60+":00";
}else{
resultEndStr = (timeend/60+":"+timeend%60);
}
}
}else {
resultEndStr = "00:00";
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
Date dateTimeStart = null;
Date dateTimeEnd = null;
try {
dateTimeStart = simpleDateFormat.parse(resultStartStr);
dateTimeEnd = simpleDateFormat.parse(resultEndStr);
} catch (ParseException e) {
e.printStackTrace();
}
String resultTimeStart = DateUtils.dateConvertStr(dateTimeStart, "HH:mm");
String resultTimeEnd = DateUtils.dateConvertStr(dateTimeEnd, "HH:mm");
System.out.println(resultTimeStart);
System.out.println(resultTimeEnd);
//根据迟到或早退来判断是否能继续打卡
if (resultTimeStart.compareTo(time) <0&&resultTimeEnd.compareTo(time) >0) {
b=true;
}else {
b=false;
}
return b;
}
}

View File

@@ -0,0 +1,206 @@
package com.yxt.attend.biz.form;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.yxt.common.base.config.component.FileUploadComponent;
import com.yxt.common.base.utils.DateUtils;
import com.yxt.common.core.result.ResultBean;
import com.yxt.jlzx.oa.api.filesappendix.FilesappendixVo;
import com.yxt.jlzx.oa.api.form.FormApi;
import com.yxt.jlzx.oa.api.form.FormItemDto;
import com.yxt.jlzx.oa.api.form.FormItems;
import com.yxt.jlzx.oa.api.form.FormItemsDto;
import com.yxt.jlzx.oa.api.form.FormSelectLinkDto;
import com.yxt.jlzx.oa.api.form.MaxFileNumDto;
import com.yxt.jlzx.system.api.user.UserApi;
import com.yxt.jlzx.system.api.user.UserInfoVo;
import com.yxt.workflow.api.process.WfProcessApi;
import com.yxt.workflow.api.process.WfProcessVo;
import io.swagger.annotations.Api;
/**
* @author yxt_mtl
* @date 2020/9/29 13:30
* @description 角色信息
*/
@Controller
@RequestMapping("v1/forms")
@Api(tags = "表单通用接口")
public class FormApiImpl implements FormApi {
// @Autowired
// private IFormService formService;
@Autowired
private FileUploadComponent fileUploadComponent;
@Autowired
private UserApi userApi;
@Autowired
private WfProcessApi processApi;
/**
* 动态获取form中字段项信息
*/
@Override
public ResultBean<Map<String, Object>> getFormItemsVo(FormItemDto dto) {
ResultBean<Map<String, Object>> resultBean = ResultBean.fireFail();
//ProcessSid 流程的id
IFormService formService = FormServiceCreator.creator(dto.getProcessSid());
if (formService == null)
return resultBean.setData(null);
Map<String, Object> map = formService.getFormItemsVo(dto.getFormSid());
if (map == null)
return resultBean.setData(null);
// String filePath=map.get("filePath").toString();
// String pdfFilePath=map.get("pdfFilePath").toString();
// String path=fileUploadComponent.getUrlPrefix().replace("upload", "oadoc");
// //将oapdf的路径保存map中
// String pdfPath=fileUploadComponent.getUrlPrefix().replace("upload", "oapdf");
// map.put("filePath",path+filePath);
// map.put("pdfFilePath",pdfPath+pdfFilePath);
if (map.get("filePath") != null){
String path=fileUploadComponent.getUrlPrefix().replace("upload", "oadoc");
map.put("filePath",path+map.get("filePath").toString()) ;
} else{
map.put("filePath","");
}
if(map.get("pdfFilePath")!= null) {
String pdfFilePath=map.get("pdfFilePath").toString();
//将oapdf的路径保存map中
String pdfPath=fileUploadComponent.getUrlPrefix().replace("upload", "oapdf");
map.put("pdfFilePath",pdfPath+pdfFilePath);
}else {
map.put("pdfFilePath","");
}
map.put("fileList", Collections.emptyList());
return resultBean.setData(map).success();
}
@Override
public ResultBean<Map<String, Object>> getMaxFileNum(MaxFileNumDto dto) {
String processSid=dto.getProcessSid();
ResultBean<Map<String, Object>> resultBean = ResultBean.fireFail();
IFormService formService = FormServiceCreator.creator(processSid);
if (formService == null)
return resultBean.setData(null);
Map<String, Object> map = formService.getMaxFileNum(dto);
if (map == null)
return resultBean.setData(null);
return resultBean.setData(map).success();
}
@Override
public ResultBean<Map<String, Object>> getNewFormItemsVo(@Valid FormItemsDto dto) {
ResultBean<Map<String, Object>> resultBean = ResultBean.fireFail();
IFormService formService = FormServiceCreator.creator(dto.getProcessSid());
if (formService == null)
return resultBean.setData(null);
Map<String, Object> map= formService.getNewFormItemsVo();
if (map == null)
return resultBean.setData(null);
ResultBean<UserInfoVo> rb_user=userApi.fetchUserInfoBysid(dto.getUserSid());
if(!rb_user.getSuccess())
return resultBean.setData(null);
List<FormItems> list=(List<FormItems>)map.get("formItems");
//初始化form中的公共内容发起人姓名、创建日期、创建部门
list.get(0).getRight_text().setDefaultText(rb_user.getData().getName());
list.get(1).getRight_text().setDefaultText(DateUtils.getNowDateDayStr());
list.get(2).getRight_text().setDefaultText(rb_user.getData().getDepartmentName());
//需要调用流程中是否有附件的
ResultBean<WfProcessVo> rb=processApi.getVo(dto.getProcessSid());
if(rb.getSuccess())
{
map.put("isFileList",rb.getData().getIsAppendix());
}
return resultBean.setData(map).success();
}
@Override
public ResultBean<Map<String, Object>> getEditFormItemsVo(FormItemDto dto) {
ResultBean<Map<String, Object>> resultBean = ResultBean.fireFail();
IFormService formService = FormServiceCreator.creator(dto.getProcessSid());
if (formService == null)
return resultBean.setData(null);
Map<String, Object> map= formService.getEditFormItemsVo(dto.getFormSid());
if (map == null)
return resultBean.setData(null);
// String filePath=map.get("filePath").toString();
// String pdfFilePath=map.get("pdfFilePath").toString();
// String path=fileUploadComponent.getUrlPrefix().replace("upload", "oadoc");
// //将oapdf的路径保存map中
// String pdfPath=fileUploadComponent.getUrlPrefix().replace("upload", "oapdf");
// map.put("filePath",path+filePath);
// map.put("pdfFilePath",pdfPath+pdfFilePath);
if (map.get("filePath") != null){
String path=fileUploadComponent.getUrlPrefix().replace("upload", "oadoc");
map.put("filePath",path+map.get("filePath").toString()) ;
} else{
map.put("filePath","");
}
if(map.get("pdfFilePath")!= null) {
String pdfFilePath=map.get("pdfFilePath").toString();
//将oapdf的路径保存map中
String pdfPath=fileUploadComponent.getUrlPrefix().replace("upload", "oapdf");
map.put("pdfFilePath",pdfPath+pdfFilePath);
}else {
map.put("pdfFilePath","");
}
//需要调用流程中是否有附件的
// ResultBean<WfProcessVo> rb=processApi.getVo(dto.getProcessSid());
// if(rb.getSuccess())
// {
// map.put("isFileList",rb.getData().getIsAppendix());
// if(rb.getData().getIsAppendix().equals("1"))
// {
// // 需要增加文件的附件列表
// List<FilesappendixVo> list_appendix = appendixService
// .queryBylinkSid(dto.getFormSid());
// map.put("fileList", list_appendix);
// }
// }
return resultBean.setData(map).success();
}
@Override
public ResultBean<Map<String, Object> > getLinkAge(FormSelectLinkDto dto) {
ResultBean<Map<String, Object>> resultBean = ResultBean.fireFail();
IFormService formService = FormServiceCreator.creator(dto.getProcessSid());
if (formService == null)
return resultBean.setData(null);
Map<String, Object> map= formService.getLinkAge(dto);
if (map == null)
return resultBean.setData(null).fail().setMessage("下级下拉框数据未获取到!");
return resultBean.setData(map).success();
}
}

View File

@@ -0,0 +1,28 @@
package com.yxt.attend.biz.form;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.yxt.jlzx.oa.api.form.Form;
import com.yxt.jlzx.oa.api.form.FormQuery;
import com.yxt.jlzx.oa.api.form.FormVo;
/**
* @author yxt_mtl
* @date 2020/10/16 15:50
* @description
*/
@Mapper
public interface FormMapper<T extends Form,V extends FormVo,Q extends FormQuery> extends BaseMapper<T>{
//分页列表
IPage<V> pageList(IPage<Q> page,@Param(Constants.WRAPPER) Wrapper<V> qw);
//不分页列表
List<V> list(@Param(Constants.WRAPPER) Wrapper<V> qw);
}

View File

@@ -0,0 +1,43 @@
package com.yxt.attend.biz.form;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yxt.common.base.config.component.FileUploadComponent;
import com.yxt.common.base.service.MybatisBaseService;
import com.yxt.common.base.utils.PagerUtil;
import com.yxt.common.core.query.PagerQuery;
import com.yxt.common.core.result.ResultBean;
import com.yxt.jlzx.oa.api.form.FileNumVo;
import com.yxt.jlzx.oa.api.formfile.FormFile;
import com.yxt.jlzx.oa.api.formfile.FormFileQuery;
import com.yxt.jlzx.oa.api.formfile.FormFileVo;
import com.yxt.jlzx.oa.api.formtzgg.FormTzgg;
import com.yxt.jlzx.oa.api.formtzgg.FormTzggVo;
import com.yxt.jlzx.system.api.filenumrule.FilenumruleApi;
import com.yxt.jlzx.system.api.filenumrule.FilenumruleVo;
@Service
public class FormService {
@Autowired
private FilenumruleApi filenumruleApi;
// public Map<String, Object> getMaxFileNum(String processSid) {
//
// ResultBean<List<FilenumruleVo>> bean = filenumruleApi.getVoByProcessSid(processSid);
// List<FilenumruleVo> list=bean.getData();
// if(list!=null&&list.size()>0) {
//
// }
//// FileNumVo vo=baseMapper.getMaxFileNum(map);
// }
}

View File

@@ -0,0 +1,38 @@
package com.yxt.attend.biz.form;
import com.yxt.common.base.config.utils.SpringUtil;
/**
* 表单service生成器
*
* @author yxt_mtl
*
*/
public class FormServiceCreator {
/**
* 根据流程sid生成对应表单的service
*
* @param processSid
* @return
*/
public static IFormService creator(String processSid) {
//Map<String,IFormService> formServices=SpringUtil.getBeansOfType(IFormService.class);
// for(Map.Entry<String, IFormService> entry:formServices.entrySet()){
//if(entry.getValue().getProcessSid().equals(processSid))
//return entry.getValue();
//}
//return null;
return (IFormService)SpringUtil.getBean(processSid);
}
}

View File

@@ -0,0 +1,59 @@
package com.yxt.attend.biz.form;
import java.util.Map;
import com.yxt.jlzx.oa.api.form.FormSelectLinkDto;
import com.yxt.jlzx.oa.api.form.MaxFileNumDto;
import com.yxt.jlzx.oa.api.index.AppDailyDto;
import com.yxt.jlzx.oa.api.index.AppDailyVo;
public interface IFormService {
/**
* 获取表单信息
* @param sid
* @return
*/
//Map<String,Object> getFormVo(String sid);
/**
* 获取动态表单(详情)
*
* @param sid
* @return
*/
Map<String, Object> getFormItemsVo(String sid);
/**
* 获取动态表单(新建)
*
* @param sid
* @return
*/
Map<String, Object> getNewFormItemsVo();
/**
* 获取动态表单(修改)
*
* @param sid
* @return
*/
Map<String, Object> getEditFormItemsVo(String formSid);
Map<String, Object> getMaxFileNum(MaxFileNumDto dto);
//APP_保存表单信息
AppDailyVo isSave(AppDailyDto appDailyDto) throws Exception;
AppDailyVo update(AppDailyDto appDailyDto) throws Exception;
Map<String, Object> getLinkAge(FormSelectLinkDto dto);
}

View File

@@ -0,0 +1,275 @@
package com.yxt.attend.biz.work;
import com.yxt.attend.biz.attenderrand.AttendErrandService;
import com.yxt.attend.biz.form.FormServiceCreator;
import com.yxt.attend.biz.form.IFormService;
import com.yxt.common.base.config.component.FileUploadComponent;
import com.yxt.common.base.utils.StringUtils;
import com.alibaba.fastjson.JSON;
import com.yxt.attend.api.attenderrand.AttendErrand;
import com.yxt.attend.api.attenderrand.AttendErrandVo;
import com.yxt.attend.api.work.*;
import com.yxt.workflow.api.histtask.WfHistTaskDidVo;
import com.yxt.workflow.api.histtask.WfHistTaskQuery;
import com.yxt.workflow.api.task.WfTaskQuery;
import com.yxt.workflow.api.task.WfTaskVo;
import com.yxt.workflow.api.wfmanger.WfManagerApi;
import com.yxt.workflow.api.wfmanger.WfProcessTreeVo;
import io.swagger.annotations.Api;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.yxt.common.base.utils.PagerUtil;
import com.yxt.common.core.query.PagerQuery;
import com.yxt.common.core.result.ResultBean;
import com.yxt.common.core.vo.PagerVo;
import com.yxt.jlzx.oa.api.car.Car;
import com.yxt.jlzx.oa.api.car.CarDidVo;
import com.yxt.jlzx.oa.api.seal.Seal;
import com.yxt.jlzx.system.api.dictcommon.DictCommonVo;
/**
* @author yxt_mtl
* @date 2020/11/02 14:18
* @description
*/
@Controller
@RequestMapping("/v1/appwork")
@Api(tags = "App-我的工作")
public class AppWorkApiImpl implements AppWorkApi {
@Autowired
private WorkService workService;
@Autowired
private WfManagerApi wfManagerApi;
@Autowired
private FileUploadComponent fileUploadComponent;
@Autowired
private AttendErrandService attendErrandService;
@Override
public ResultBean<PagerVo<WorkDoAppVo>> doingWorks(
PagerQuery<WorkQuery> pagerQuery) {
ResultBean<PagerVo<WorkDoAppVo>> rb = ResultBean.fireFail();
// 直接调用流程任务
PagerVo<WorkDoVo> workdovo = workService
.doingWorks(pagerQuery);
// 结果转换
PagerVo<WorkDoAppVo> workdoappVo_pager = PagerUtil.switchPagerVo(workdovo);
for (int i = 0; i < workdovo.getRecords().size(); i++) {
WorkDoAppVo workDoVo = new WorkDoAppVo();
workdoappVo_pager.getRecords().add(workDoVo.fromMap(workdovo.getRecords().get(i).toMap()));
}
return rb.success().setData(workdoappVo_pager);
}
@Override
public ResultBean doingWorksCount(PagerQuery<WorkQuery> pagerQuery) {
ResultBean rb = ResultBean.fireFail();
// 直接调用流程任务
PagerVo<WorkDoVo> workdovo = workService.doingWorks(pagerQuery);
// 结果转换
PagerVo<WorkDoAppVo> workdoappVo_pager = PagerUtil.switchPagerVo(workdovo);
for (int i = 0; i < workdovo.getRecords().size(); i++) {
WorkDoAppVo workDoVo = new WorkDoAppVo();
workdoappVo_pager.getRecords().add(workDoVo.fromMap(workdovo.getRecords().get(i).toMap()));
}
return rb.success().setData(workdoappVo_pager.getTotal());
}
@Override
public ResultBean<PagerVo<WorkDidAppVo>> didWorks(
PagerQuery<WorkQuery> pagerQuery) {
ResultBean<PagerVo<WorkDidAppVo>> rb = ResultBean.fireFail();
// 直接调用流程任务
PagerVo<WorkDidVo> workdidvo = workService
.didWorks(pagerQuery);
// 结果转换
PagerVo<WorkDidAppVo> workdidappvo_pager = PagerUtil.switchPagerVo(workdidvo);
for (int i = 0; i < workdidvo.getRecords().size(); i++) {
WorkDidAppVo workDidVo = new WorkDidAppVo();
workdidappvo_pager.getRecords().add(workDidVo.fromMap(workdidvo.getRecords().get(i).toMap()));
}
return rb.success().setData(workdidappvo_pager);
}
@Override
public ResultBean<PagerVo<WorkDidAppVo>> myAttenderrand(
PagerQuery<WorkQuery> pagerQuery) {
ResultBean<PagerVo<WorkDidAppVo>> rb = ResultBean.fireFail();
pagerQuery.setSize(50);
// 直接调用流程任务
PagerVo<WorkDoVo> workdidvo = workService
.doingWorks(pagerQuery);
// for (int i = 0; i < workdidvo.getRecords().size(); i++) {
// AttendErrandVo workDidVo = new AttendErrandVo();
// workDidVo.fromMap(workdidvo.getRecords().get(i).toMap());
// AttendErrand AttendErrand =attendErrandService.fetchBySid(workdidvo.getRecords().get(i).getFormSid());
// if (AttendErrand != null) {
// Map map = JSON.parseObject(JSON.toJSONString(AttendErrand), Map.class);
// workDidVo.fromMap(map);
// ResultBean<DictCommonVo> selectBykey = dictCommonApi.selectBykey(workDidVo.getRemarks(), "ycsyOA");
// if(selectBykey.getData()!=null) {
// workDidVo.setRemarks(selectBykey.getData().getDictValue());
// }
// }
//
// workVo_pager.getRecords().add(workDidVo);
// }
// workVo_pager.getRecords().add(workDidVo);
// }
String month = pagerQuery.getParams().getMonth();//传参年月
String createBySid = pagerQuery.getParams().getCreateBySid();//传参创建人sid
String type = pagerQuery.getParams().getType();//请假类型
for (int i = 0; i < workdidvo.getRecords().size(); i++) {
AttendErrandVo workDidVo = new AttendErrandVo();
workDidVo.fromMap(workdidvo.getRecords().get(i).toMap());
AttendErrand attendErrand = attendErrandService.fetchBySid(workdidvo.getRecords().get(i).getFormSid());
if(attendErrand!=null) {
if(!attendErrand.getCreateBySid().equals(createBySid)){
workdidvo.getRecords().remove(i);
i = i - 1;
continue;
}
if(StringUtils.isNoneBlank(month)) {
if(attendErrand.getSubmitTime().indexOf(month)<0) {
workdidvo.getRecords().remove(i);
i = i - 1;
continue;
}
}
}else {
workdidvo.getRecords().remove(i);
i = i - 1;
continue;
}
}
// 结果转换
PagerVo<WorkDidAppVo> workdidappvo_pager = PagerUtil.switchPagerVo(workdidvo);
workdidappvo_pager.setTotal(workdidvo.getRecords().size());
for (int i = 0; i < workdidvo.getRecords().size(); i++) {
WorkDidAppVo workDidVo = new WorkDidAppVo();
workDidVo.fromMap(workdidvo.getRecords().get(i).toMap());
workdidappvo_pager.getRecords().add(workDidVo.fromMap(workdidvo.getRecords().get(i).toMap()));
}
return rb.success().setData(workdidappvo_pager);
}
@Override
public ResultBean<WorkRecordOneVo> recordList(WorkRecordQuery query) {
ResultBean<WorkRecordOneVo> resultBean = ResultBean.fireFail();
if (query == null) {
return resultBean.setData(null);
}
List<WorkRecordVo> workRecordOneVoList = workService.recordList(query);
WorkRecordOneVo workRecordOneVo = new WorkRecordOneVo();
workRecordOneVo.setWorkRecordVoList(workRecordOneVoList);
IFormService formService = FormServiceCreator.creator(query.getProcessSid());
if (formService == null) {
return resultBean.setData(null);
}
Map<String, Object> map = formService.getFormItemsVo(query.getFormSid());
if (map == null) {
return resultBean.setData(null);
}
// 需要增加文件的附件列表
// List<FilesappendixVo> list_appendix = filesappendixService
// .queryBylinkSid(query.getFormSid());
workRecordOneVo.setSize(workRecordOneVoList.size());
workRecordOneVo.setTitle(map.get("title").toString());
workRecordOneVo.setFilesappendixVoList(Collections.emptyList());
if (map.get("filePath") != null){
String path=fileUploadComponent.getUrlPrefix().replace("upload", "oadoc");
workRecordOneVo.setFilePath(path+map.get("filePath").toString());
} else{
workRecordOneVo.setFilePath("");
}
if(map.get("pdfFilePath")!= null) {
String pdfFilePath=map.get("pdfFilePath").toString();
//将oapdf的路径保存map中
String pdfPath=fileUploadComponent.getUrlPrefix().replace("upload", "oapdf");
workRecordOneVo.setPdfFilePath(pdfPath+pdfFilePath);
}else {
if (map.get("filePath") != null){
String path=fileUploadComponent.getUrlPrefix().replace("upload", "oadoc");
workRecordOneVo.setPdfFilePath(path+map.get("filePath").toString());
} else{
workRecordOneVo.setPdfFilePath("");
}
}
return resultBean.success().setData(workRecordOneVo);
}
/**
* 流程类别与流程列表
*
* @param workQuery 查询条件
* @return 流程类别与流程列表
*/
@Override
public ResultBean<List<WorkTypeTreeVo>> getWorkTypeTree(WorkQuery workQuery) {
ResultBean<List<WorkTypeTreeVo>> rb = ResultBean.fireFail();
return rb.success().setData(workService.getWorkTypeTree(workQuery));
}
@Override
public ResultBean selectNum(String userSid, String sid) {
//直接调用流程任务
//ResultBean<List<WfProcessTreeVo>> processTreeVoList = wfManagerApi.getProcessTree("000002");
//List<WorkTypeTreeVo> workTypeTreeVoList = new ArrayList<>();
int num = 0;
PagerQuery<WfTaskQuery> pager_task_query = new PagerQuery<>();
WfTaskQuery taskQuery = new WfTaskQuery();
taskQuery.setActorSid(userSid);
taskQuery.setProcessTypeSid(sid);
pager_task_query.setParams(taskQuery);
//直接调用流程任务
ResultBean<PagerVo<WfTaskVo>> task_rb = wfManagerApi.webTaskPageList(pager_task_query);
num = (int) task_rb.getData().getTotal();
return ResultBean.fireSuccess().setData(num);
}
@Override
public ResultBean selectReadNum(String userSid, String sid) {
int num = 0;
PagerQuery<WfTaskQuery> pager_task_query = new PagerQuery<>();
WfTaskQuery taskQuery = new WfTaskQuery();
taskQuery.setActorSid(userSid);
taskQuery.setProcessTypeSid(sid);
taskQuery.setTaskType("1");
pager_task_query.setParams(taskQuery);
//直接调用流程任务
ResultBean<PagerVo<WfTaskVo>> task_rb = wfManagerApi.webTaskPageList(pager_task_query);
num = (int) task_rb.getData().getTotal();
return ResultBean.fireSuccess().setData(num);
}
}

View File

@@ -0,0 +1,115 @@
package com.yxt.attend.biz.work;
import com.yxt.common.base.config.RedisUtil;
import com.yxt.jlzx.system.api.department.DepartmentApi;
import com.yxt.jlzx.system.api.department.QrCodeVo;
import com.yxt.jlzx.system.api.user.User;
import com.yxt.jlzx.system.api.user.UserApi;
import io.swagger.annotations.Api;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.yxt.common.core.query.PagerQuery;
import com.yxt.common.core.result.ResultBean;
import com.yxt.common.core.vo.PagerVo;
import com.yxt.attend.api.work.WorkApi;
import com.yxt.attend.api.work.WorkDidVo;
import com.yxt.attend.api.work.WorkDoVo;
import com.yxt.attend.api.work.WorkQuery;
import com.yxt.attend.api.work.WorkRecordQuery;
import com.yxt.attend.api.work.WorkRecordVo;
import javax.servlet.http.HttpServletRequest;
/**
* @author yxt_mtl
* @date 2020/11/02 14:18
* @description
*/
@Controller
@RequestMapping("/v1/work")
@Api(tags = "我的工作")
public class WorkApiImpl implements WorkApi{
@Autowired
private WorkService workService;
@Autowired(required = false)
private HttpServletRequest httpServletRequest;
@Autowired
private UserApi userApi;
@Autowired
private DepartmentApi departmentApi;
@Autowired
private RedisUtil redisUtil;
//待办/待阅工作列表
@Override
public ResultBean<Long> doingWorksNum(PagerQuery<WorkQuery> pagerQuery) {
ResultBean<Long> resultBean=ResultBean.fireFail();
if(pagerQuery==null)
return resultBean.setData(null);
//直接调用流程任务
return resultBean.success().setData(workService.doingWorks(pagerQuery).getTotal());
}
//待办/待阅工作列表
@Override
public ResultBean<PagerVo<WorkDoVo>> doingWorks(PagerQuery<WorkQuery> pagerQuery) {
ResultBean<PagerVo<WorkDoVo>> resultBean=ResultBean.fireFail();
if(pagerQuery==null)
return resultBean.setData(null);
//直接调用流程任务
return resultBean.success().setData(workService.doingWorks(pagerQuery));
}
//已办/已阅工作列表
@Override
public ResultBean<PagerVo<WorkDidVo>> didWorks(PagerQuery<WorkQuery> pagerQuery) {
ResultBean<PagerVo<WorkDidVo>> resultBean=ResultBean.fireFail();
if(pagerQuery==null)
return resultBean.setData(null);
//直接调用流程任务
return resultBean.success().setData(workService.didWorks(pagerQuery));
}
//共文库查看
@Override
public ResultBean<PagerVo<WorkDidVo>> didworksadmin(PagerQuery<WorkQuery> pagerQuery) {
String token = httpServletRequest.getHeader("token");
String userName = redisUtil.get(token);
ResultBean<User> userResultBean = userApi.selectByUserNameOne(userName);
ResultBean<QrCodeVo> staffSid = departmentApi.queryByStaffSid(userResultBean.getData().getStaffSid());
if (userResultBean.getData().getIsAdmin()==1){
pagerQuery.getParams().setActorSid("");
pagerQuery.getParams().setState("");
}
ResultBean<PagerVo<WorkDidVo>> resultBean=ResultBean.fireFail();
if(pagerQuery==null)
return resultBean.setData(null);
//直接调用流程任务
return resultBean.success().setData(workService.didWorksadmin(pagerQuery));
}
//审批记录列表
@Override
public ResultBean<List<WorkRecordVo>> recordList(WorkRecordQuery query) {
ResultBean<List<WorkRecordVo>> resultBean=ResultBean.fireFail();
if(query==null)
return resultBean.setData(null);
//直接调用流程任务
return resultBean.success().setData(workService.recordList(query));
}
//待阅工作
//已阅工作
}

View File

@@ -0,0 +1,235 @@
package com.yxt.attend.biz.work;
import cn.hutool.core.bean.BeanUtil;
import com.yxt.common.base.utils.PagerUtil;
import com.yxt.common.core.query.PagerQuery;
import com.yxt.common.core.result.ResultBean;
import com.yxt.common.core.vo.PagerVo;
import com.yxt.jlzx.oa.api.form.OpinionRow;
import com.yxt.attend.api.work.*;
import com.yxt.jlzx.system.api.cahtmlsignature.CahtmlsignatureApi;
import com.yxt.jlzx.system.api.cahtmlsignature.CahtmlsignatureQuery;
import com.yxt.jlzx.system.api.cahtmlsignature.CahtmlsignatureVo;
import com.yxt.workflow.api.histtask.WfHistTaskDidVo;
import com.yxt.workflow.api.histtask.WfHistTaskQuery;
import com.yxt.workflow.api.histtask.WfHistTaskRecordQuery;
import com.yxt.workflow.api.histtask.WfHistTaskVo;
import com.yxt.workflow.api.task.WfTaskQuery;
import com.yxt.workflow.api.task.WfTaskVo;
import com.yxt.workflow.api.wfmanger.WfManagerApi;
import com.yxt.workflow.api.wfmanger.WfProcessTreeVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class WorkService {
@Autowired
private WfManagerApi wfManagerApi;
@Autowired
private CahtmlsignatureApi cahtmlsignatureApi;
// 待办/待阅工作列表
public PagerVo<WorkDoVo> doingWorks(PagerQuery<WorkQuery> pagerQuery) {
// 参数转换
PagerQuery<WfTaskQuery> task_query = new PagerQuery<>();
task_query.setParams(new WfTaskQuery());
task_query.fromPagerQuery(pagerQuery);
// 直接调用流程任务
ResultBean<PagerVo<WfTaskVo>> task_rb = wfManagerApi
.webTaskPageList(task_query);
PagerVo<WorkDoVo> workVo_pager = new PagerVo<WorkDoVo>();
if (null == task_rb.getData())
return workVo_pager;
// 结果转换
workVo_pager = PagerUtil.switchPagerVo(task_rb
.getData());
for (int i = 0; i < task_rb.getData().getRecords().size(); i++) {
WorkDoVo workDoVo = new WorkDoVo();
workVo_pager.getRecords().add(
workDoVo.fromMap(task_rb.getData().getRecords().get(i)
.toMap()));
}
return workVo_pager;
}
// 已办/已阅工作列表
public PagerVo<WorkDidVo> didWorks(PagerQuery<WorkQuery> pagerQuery) {
// 参数转换
PagerQuery<WfHistTaskQuery> histtask_query = new PagerQuery<>();
histtask_query.setParams(new WfHistTaskQuery());
histtask_query.fromPagerQuery(pagerQuery);
// 直接调用流程任务
ResultBean<PagerVo<WfHistTaskDidVo>> task_rb = wfManagerApi
.histTaskPageList(histtask_query);
PagerVo<WorkDidVo> workVo_pager = new PagerVo<WorkDidVo>();
if (null == task_rb.getData())
return workVo_pager;
// 结果转换
workVo_pager = PagerUtil.switchPagerVo(task_rb
.getData());
for (int i = 0; i < task_rb.getData().getRecords().size(); i++) {
WorkDidVo workDidVo = new WorkDidVo();
workVo_pager.getRecords().add(
workDidVo.fromMap(task_rb.getData().getRecords().get(i)
.toMap()));
}
return workVo_pager;
}
// 共文库
public PagerVo<WorkDidVo> didWorksadmin(PagerQuery<WorkQuery> pagerQuery) {
// 参数转换
PagerQuery<WfHistTaskQuery> histtask_query = new PagerQuery<>();
histtask_query.setParams(new WfHistTaskQuery());
histtask_query.fromPagerQuery(pagerQuery);
// 直接调用流程任务
ResultBean<PagerVo<WfHistTaskDidVo>> task_rb = wfManagerApi
.histTaskGongWenPageList(histtask_query);
PagerVo<WorkDidVo> workVo_pager = new PagerVo<WorkDidVo>();
if (null == task_rb.getData())
return workVo_pager;
// 结果转换
workVo_pager = PagerUtil.switchPagerVo(task_rb
.getData());
for (int i = 0; i < task_rb.getData().getRecords().size(); i++) {
WorkDidVo workDidVo = new WorkDidVo();
workVo_pager.getRecords().add(
workDidVo.fromMap(task_rb.getData().getRecords().get(i)
.toMap()));
}
return workVo_pager;
}
// 审批记录列表
public List<WorkRecordVo> recordList(WorkRecordQuery query) {
// 参数转换
WfHistTaskRecordQuery histtask_query = new WfHistTaskRecordQuery();
histtask_query.fromMap(query.toMap());
// 直接调用流程任务
ResultBean<List<WfHistTaskVo>> task_rb = wfManagerApi
.histTaskList(histtask_query);
List<WorkRecordVo> list_recordvo = new ArrayList<>();
if (null == task_rb.getData())
return list_recordvo;
// 结果转换
// 把Ipage转换为PageVo
List<WfHistTaskVo> histtaskVo_list = task_rb.getData();
for (int i = 0; i < histtaskVo_list.size(); i++) {
WorkRecordVo recordVo = new WorkRecordVo();
// recordVo.fromMap(histtaskVo_list.get(i).toMap());
BeanUtil.copyProperties(histtaskVo_list.get(i), recordVo);
//按照orderSid查询流程实例的签名信息
CahtmlsignatureQuery caquery = new CahtmlsignatureQuery();
caquery.setDocumentSid(histtaskVo_list.get(i).getOrderSid());
ResultBean<List<CahtmlsignatureVo>> ca_rb = cahtmlsignatureApi.list(caquery);
if (ca_rb.getSuccess() && ca_rb.getData().size() > 0) {
//过滤signaturesid
List<CahtmlsignatureVo> cavos = ca_rb.getData().stream().filter(s -> s.getSignatureSid().equals(recordVo.getSid())).collect(Collectors.toList());
if (0 < cavos.size())
// recordVo.setSignature(cavos.get(0).getSignature());
{
recordVo.setSignature(cavos.get(0).getSealPic());
}
}
list_recordvo.add(recordVo);
}
return list_recordvo;
}
/**
* 获取环节意见列表
*
* @param orderSid
* @param taskName
* @return
*/
public List<OpinionRow> getOpinioRows(String orderSid, String taskName) {
WorkRecordQuery query = new WorkRecordQuery();
query.setOrderSid(orderSid);
query.setTaskName(taskName);
List<WorkRecordVo> workRecordVos = recordList(query);
List<OpinionRow> rows = new ArrayList<OpinionRow>();
for (int i = workRecordVos.size() - 1; i >= 0; i--) {
if (!workRecordVos.get(i).getActionName().equals("撤回")) {
OpinionRow row = new OpinionRow();
BeanUtil.copyProperties(workRecordVos.get(i), row);
rows.add(row);
}
}
return rows;
}
/**
* 流程类别与流程列表
*
* @param pagerQuery 查询条件
* @return 流程类别与流程列表
*/
public List<WorkTypeTreeVo> getWorkTypeTree(WorkQuery workQuery) {
ResultBean<List<WfProcessTreeVo>> processTreeVoList = wfManagerApi
.getProcessTree("000002");
List<WorkTypeTreeVo> workTypeTreeVoList = new ArrayList<>();
for (int i = 0; i < processTreeVoList.getData().size(); i++) {
WorkTypeTreeVo workTypeTreeVo = new WorkTypeTreeVo();
// 参数转换
PagerQuery<WfTaskQuery> pager_task_query = new PagerQuery<>();
WfTaskQuery taskQuery = new WfTaskQuery();
taskQuery.setActorSid(workQuery.getActorSid());
taskQuery.setProcessTypeSid(processTreeVoList.getData().get(i)
.getProcessTypeVo().getSid());
taskQuery.setTaskType(workQuery.getTaskType());
pager_task_query.setParams(taskQuery);
// 直接调用流程任务
ResultBean<PagerVo<WfTaskVo>> task_rb = wfManagerApi
.webTaskPageList(pager_task_query);
WorkTypeVo workTypeVo = new WorkTypeVo();
if (Integer.parseInt(workQuery.getState()) == 0) {
// 已办
workTypeVo.setWorkCount(Integer.parseInt(workQuery.getState()));
} else {
// 待办
workTypeVo.setWorkCount((int) task_rb.getData().getTotal());
}
List<WorkVo> workVoList = new ArrayList<>();
for (int x = 0; x < processTreeVoList.getData().get(i)
.getProcessList().size(); x++) {
workVoList.add(new WorkVo().fromMap(processTreeVoList.getData()
.get(i).getProcessList().get(x).toMap()));
}
if (workVoList.size() == 1) {
workTypeTreeVo.setWorkList(new ArrayList<>());
} else {
workTypeTreeVo.setWorkList(workVoList);
}
workTypeTreeVo.setWorkTypeVo(workTypeVo.fromMap(processTreeVoList
.getData().get(i).getProcessTypeVo().toMap()));
workTypeTreeVoList.add(workTypeTreeVo);
}
return workTypeTreeVoList;
}
}

View File

@@ -0,0 +1,91 @@
package com.yxt.attend.biz.workflow;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.yxt.common.core.result.ResultBean;
import com.yxt.jlzx.oa.api.workflow.BackWorkDto;
import com.yxt.jlzx.oa.api.workflow.EndWorkDto;
import com.yxt.jlzx.oa.api.workflow.RecallWorkDto;
import com.yxt.jlzx.oa.api.workflow.SubmitWorkDto;
import com.yxt.jlzx.oa.api.workflow.WorkFlowApi;
/**
* @author yxt_mtl
* @date 2020/11/14 11:18
* @description
*/
@Controller
@RequestMapping("/v1/workflow")
@Api(tags = "OA工作流管理接口")
public class WorkFlowApiImpl implements WorkFlowApi{
@Autowired
private WorkFlowService workflowService;
/**
* 执行流程
*
* @param dto
* @return
*/
@Override
public ResultBean submitWork(SubmitWorkDto dto) {
ResultBean resultBean=ResultBean.fireFail();
if(null==dto)
resultBean.setData(null);
if(workflowService.submitWork(dto))
return resultBean.success().setData(null);
return resultBean.setData(null);
}
/**
* 结束流程
*
* @param taskSid 任务sid
* @return
*/
@Override
public ResultBean endWork(EndWorkDto dto) {
ResultBean resultBean=ResultBean.fireFail();
if(null==dto)
resultBean.setData(null);
if(workflowService.endWork(dto))
return resultBean.success().setData(null);
return resultBean.setData(null);
}
/**
* 退回流程。 意见页面退回时
* @param WfMTaskDto
* @return
*/
@Override
public ResultBean backWork(BackWorkDto dto) {
ResultBean resultBean=ResultBean.fireFail();
if(null==dto)
resultBean.setData(null);
if(workflowService.backWork(dto))
return resultBean.success().setData(null);
return resultBean.setData(null);
}
/**
* 撤回流程。待办列表中撤回.
* @param WfMTaskDto
* @return
*/
@Override
public ResultBean recallWork(RecallWorkDto dto) {
ResultBean resultBean=ResultBean.fireFail();
if(null==dto)
resultBean.setData(null);
if(workflowService.recallWork(dto))
return resultBean.success().setData(null);
return resultBean.setData(null);
}
}

View File

@@ -0,0 +1,126 @@
package com.yxt.attend.biz.workflow;
import com.yxt.common.core.result.ResultBean;
import com.yxt.jlzx.oa.api.workflow.*;
import com.yxt.jlzx.system.api.cahtmlsignature.Cahtmlsignature;
import com.yxt.jlzx.system.api.cahtmlsignature.CahtmlsignatureApi;
import com.yxt.jlzx.system.api.user.app.AppUserApi;
import com.yxt.jlzx.system.api.user.app.CaParseSignatureQuery;
import com.yxt.jlzx.system.api.user.app.CaParseSignatureVo;
import com.yxt.jlzx.system.api.user.app.CaSealEffectivenessQuery;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.validation.Valid;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
/**
* @author dimengzhe
* @date 2021/4/11 22:07
* @description
*/
@Controller
@RequestMapping("/v2/workflow")
@Api(tags = "OA2工作流管理接口")
public class WorkFlowApiImpl2 implements WorkFlowApi2 {
private String isTrue = "验证成功";
private String isFalse = "验证失败";
@Autowired
private WorkFlowService2 workFlowService2;
@Autowired
private CahtmlsignatureApi cahtmlsignatureApi;
@Autowired
private AppUserApi appUserApi;
@Override
public ResultBean submitWork(SubmitWorkDto2 dto) {
ResultBean resultBean = ResultBean.fireFail();
if (null == dto) {
resultBean.setData(null);
}
CaSealEffectivenessQuery caSealEffectivenessQuery = new CaSealEffectivenessQuery();
caSealEffectivenessQuery.setOriginalText(dto.getOperOpinion());
caSealEffectivenessQuery.setSignatureResultB64(dto.getSignatureResultB64());
caSealEffectivenessQuery.setUserSid(dto.getOperUserSid());
ResultBean<CaParseSignatureVo> caParseSignatureVoResultBean = appUserApi.sealEffectiveness(caSealEffectivenessQuery);
if (!caParseSignatureVoResultBean.getSuccess()) {
return ResultBean.fireFail().setMsg(caParseSignatureVoResultBean.getMsg());
}
if (workFlowService2.submitWork(dto,caParseSignatureVoResultBean.getData())) {
return resultBean.success().setData(null);
}
return resultBean.setData(null);
}
/**
* 结束流程
*
* @return
*/
@Override
public ResultBean endWork(EndWorkDto2 dto) {
ResultBean resultBean = ResultBean.fireFail();
if (null == dto) {
resultBean.setData(null);
}
CaSealEffectivenessQuery caSealEffectivenessQuery = new CaSealEffectivenessQuery();
caSealEffectivenessQuery.setOriginalText(dto.getOperOpinion());
caSealEffectivenessQuery.setSignatureResultB64(dto.getSignatureResultB64());
caSealEffectivenessQuery.setUserSid(dto.getOperUserSid());
ResultBean<CaParseSignatureVo> caParseSignatureVoResultBean = appUserApi.sealEffectiveness(caSealEffectivenessQuery);
if (!caParseSignatureVoResultBean.getSuccess()) {
return ResultBean.fireFail().setMsg(caParseSignatureVoResultBean.getMsg());
}
if (workFlowService2.endWork(dto,caParseSignatureVoResultBean.getData())) {
return resultBean.success().setData(null);
}
return resultBean.setData(null);
}
@Override
public ResultBean<RecordVo> selectRecord(String signatureSid, String userSid) throws UnsupportedEncodingException {
RecordVo recordVo = new RecordVo();
ResultBean<Cahtmlsignature> cahtmlsignature = cahtmlsignatureApi.selectBySignSid(signatureSid);
if (!cahtmlsignature.getSuccess()) {
return new ResultBean<RecordVo>().fail().setMsg("该签名表中不存在该条记录");
}
//签章结果
String signResultB64 = cahtmlsignature.getData().getSignResultB64();
//原文
String originalText = cahtmlsignature.getData().getOriginalText();
//印章高度
int sealHeight = cahtmlsignature.getData().getSealHeight();
//印章宽度
int sealWidth = cahtmlsignature.getData().getSealWidth();
//图片的格式
String sealPicType = cahtmlsignature.getData().getSealPicType();
//图片base64
String sealPic = cahtmlsignature.getData().getSealPic();
CaParseSignatureQuery caParseSignatureQuery = new CaParseSignatureQuery();
caParseSignatureQuery.setSealSignature(signResultB64);
ResultBean<CaParseSignatureVo> caParseSignatureVoResultBean = appUserApi.selectParseSignature(caParseSignatureQuery);
if (caParseSignatureVoResultBean.getSuccess()) {
String source = caParseSignatureVoResultBean.getData().getSource();
String original = new String(Base64.getDecoder().decode(source), "UTF-8");
if (!originalText.equals(original)) {
recordVo.setIsTrue(isFalse);
}
recordVo.setOriginalText(originalText);
recordVo.setSealHeight(sealHeight);
recordVo.setSealWidth(sealWidth);
recordVo.setSealPic(sealPic);
recordVo.setSealPicType(sealPicType);
recordVo.setIsTrue(isTrue);
} else {
return new ResultBean<RecordVo>().fail().setMsg(caParseSignatureVoResultBean.getMsg());
}
return new ResultBean<RecordVo>().success().setData(recordVo);
}
}

View File

@@ -0,0 +1,294 @@
package com.yxt.attend.biz.workflow;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.hutool.core.bean.BeanUtil;
import com.yxt.common.base.utils.MsgWs;
import com.yxt.jlzx.oa.api.form.FormDto;
import com.yxt.jlzx.oa.api.workflow.BackWorkDto;
import com.yxt.jlzx.oa.api.workflow.EndWorkDto;
import com.yxt.jlzx.oa.api.workflow.RecallWorkDto;
import com.yxt.jlzx.oa.api.workflow.SubmitWorkDto;
import com.yxt.jlzx.system.api.user.UserApi;
import com.yxt.jlzx.system.api.user.UserInfoVo;
import com.yxt.workflow.api.order.WfOrderDto;
import com.yxt.workflow.api.order.WfOrderFormsDto;
import com.yxt.workflow.api.task.WfTaskOpers;
import com.yxt.workflow.api.task.WfTaskVo;
import com.yxt.workflow.api.wfmanger.WfMBackTaskDto;
import com.yxt.workflow.api.wfmanger.WfMRecallTaskDto;
import com.yxt.workflow.api.wfmanger.WfMSimpleTaskDto;
import com.yxt.workflow.api.wfmanger.WfMTaskDto;
import com.yxt.workflow.api.wfmanger.WfManagerApi;
@Service
public class WorkFlowService {
@Autowired
private WfManagerApi wfManagerApi;
@Autowired
private UserApi userApi;
// @Autowired
// private MessageApi messageApi;
/**
* 启动流程。
*
* @param dto
* @return orderSid
*/
public WfTaskVo startProcess(FormDto dto) {
if (null == dto)
return null;
UserInfoVo vo = userApi.fetchUserInfoBysid(dto.getCreateBySid()).getData();
if (null != vo) {
dto.setCreateDeptName(vo.getDepartmentName());
dto.setCreaterName(vo.getName());
dto.setCreateDeptSid(vo.getDepartmentSid());
dto.setCreaterPhone(vo.getMobile());
}
WfOrderDto orderDto = new WfOrderDto();
BeanUtil.copyProperties(dto, orderDto);
return wfManagerApi.startProcess(orderDto).getData();
}
/**
* 提交工作(执行流程)
*
* @param dto
* @return
*/
public boolean submitWork(SubmitWorkDto dto) {
if(null==dto)
return false;
// 是否分发用户,分发用户的待阅工作
// 消息中心
/*
* List<userVo> list=new ArrayList<userVo>();
* MessageDto messageDto = new MessageDto(); String
* sendUserSid=dto.getSendUsersSid();
* if(StringUtils.isNoneBlank(sendUserSid)) {
* if(sendUserSid.indexOf(",")>=0) { String[]
* sendUserSids=sendUserSid.split(","); for(int
* i=0;sendUserSids.length-1>i;i++) { userVo vo=new userVo();vo.setUserSid(sendUserSids[i]);
* list.add(vo); } }else { vo.setUserSid(sendUserSid); list.add(vo); }
* messageDto.setReceiveSids(list);
* messageDto.setCreateBySid(dto.getOperUserSid());
* messageDto.setMsgTitle(""); messageDto.setMsgContent("");
* messageDto.setMsgSource(""); messageDto.setBusinessSid("");
* messageDto.setUrl(""); messageDto.setMsgType("");
* messageApi.save(messageDto); }
*/
WfMTaskDto mTaskDto = new WfMTaskDto();
BeanUtil.copyProperties(dto, mTaskDto);
// 完善当前处理人相关字段
/* UserInfoVo userInfoVo = userApi
.fetchUserInfoBysid(dto.getOperUserSid()).getData();
if (null != userInfoVo) {
// 调用根据userSid获取user信息
mTaskDto.setOperDeptName(userInfoVo.getOrganizationName());
mTaskDto.setOperName(userInfoVo.getName());
}*/
String userMobile="";
UserInfoVo userInfoVo=new UserInfoVo();
// 完善下一处理人相关字段0为上一处理人9是发起人-1是同时发给多个人分发用户
//if(!dto.getNextUserSid().equals("0") && !dto.getNextUserSid().equals("9") && !dto.getNextUserSid().equals("-1"))
if(dto.getNextUserSid().length()>3)
{
userInfoVo = userApi.fetchUserInfoBysid(
dto.getNextUserSid()).getData();
if (null != userInfoVo) {
// 调用根据userSid获取user信息
mTaskDto.setNextOperDeptName(userInfoVo.getDepartmentName());
mTaskDto.setNextOperName(userInfoVo.getName());
userMobile=userInfoVo.getMobile();
}
}
// 是否分发用户,分发用户的待阅工作
StringBuilder senderUserSids=new StringBuilder();
mTaskDto.setOpers(new ArrayList<WfTaskOpers>());
if (dto.getSendUsersSid() != null && !dto.getSendUsersSid().equals("")) {
String[] userSids = dto.getSendUsersSid().split(",");
for (int i = 0; i < userSids.length; i++) {
WfTaskOpers opers = new WfTaskOpers();
userInfoVo = userApi.fetchUserInfoBysid(userSids[i])
.getData();
if (null != userInfoVo) {
opers.setOperName(userInfoVo.getName());
opers.setOperDeptName(userInfoVo.getDepartmentName());
opers.setOperPost(userInfoVo.getRoleName());
opers.setCreateBySid(userInfoVo.getSid());
senderUserSids.append(userInfoVo.getMobile()+",");
}
mTaskDto.getOpers().add(opers);
}
}
if(wfManagerApi.runProcess(mTaskDto).getSuccess()){
// if() {
// //e223c446-5994-4937-9d75-f681450925be,12f07d79-78d1-4a51-b32b-a363e9cb7bce,d8e7ff60-3159-4568-9897-e7287c1b48e9
// }
//是否发送短信提醒
if(1==dto.getIsSendMsg() && !userMobile.equals(""))
MsgWs.SendWaitWorkMsg(userMobile, "您有待办工作需要办理,请及时登录平台办理!");
//分发用户发送短信提醒
if(senderUserSids.length()>0)
MsgWs.SendWaitWorkMsg(senderUserSids.substring(0, senderUserSids.length()-2), "您有一个新的待阅工作,请及时登录平台查看!");
return true;
}
return false;
}
/**
* 结束流程
*
* @param taskSid
* 任务sid
* @return
*/
public boolean endWork(EndWorkDto dto) {
if (null == dto)
return false;
// 消息中心中插入数据
/*
* List<userVo> list=new ArrayList<userVo>(); userVo vo=new userVo();
* MessageDto messageDto = new MessageDto(); String
* sendUserSid=dto.getSendUsersSid();
* if(StringUtils.isNoneBlank(sendUserSid)) {
* if(sendUserSid.indexOf(",")>=0) { String[]
* sendUserSids=sendUserSid.split(";"); for(int
* i=0;sendUserSids.length-1>i;i++) { vo.setUserSid(sendUserSids[i]);
* list.add(vo); } }else { vo.setUserSid(sendUserSid); list.add(vo); }
* messageDto.setReceiveSids(list);
* messageDto.setCreateBySid(dto.getOperUserSid());
* messageDto.setMsgTitle(""); messageDto.setMsgContent("");
* messageDto.setMsgSource(""); messageDto.setBusinessSid("");
* messageDto.setUrl(""); messageDto.setMsgType("");
* messageApi.save(messageDto);
*
* }
*/
WfMSimpleTaskDto mTaskDto = new WfMSimpleTaskDto();
BeanUtil.copyProperties(dto, mTaskDto);
// 是否分发用户,分发用户的待阅工作
StringBuilder senderUserSids=new StringBuilder();
mTaskDto.setOpers(new ArrayList<WfTaskOpers>());
if (dto.getSendUsersSid() != null && !dto.getSendUsersSid().equals("")) {
String[] userSids = dto.getSendUsersSid().split(",");
for (int i = 0; i < userSids.length; i++) {
WfTaskOpers opers = new WfTaskOpers();
UserInfoVo vo = userApi.fetchUserInfoBysid(userSids[i]).getData();
if (null != vo) {
opers.setOperName(vo.getName());
opers.setOperDeptName(vo.getDepartmentName());
opers.setOperPost(vo.getRoleName());
opers.setCreateBySid(vo.getSid());
senderUserSids.append(vo.getMobile()+",");
}
mTaskDto.getOpers().add(opers);
}
}
if(wfManagerApi.endProcess(mTaskDto).getSuccess())
{
//分发用户发送短信提醒
if(senderUserSids.length()>0)
MsgWs.SendWaitWorkMsg(senderUserSids.substring(0, senderUserSids.length()-2), "您有一个新的待阅工作,请及时登录平台查看!");
return true;
}
return false;
}
/**
* 退回流程。 意见页面退回时
*
* @param WfMTaskDto
* @return
*/
public boolean backWork(BackWorkDto dto) {
if (null == dto)
return false;
WfMBackTaskDto mTaskDto = new WfMBackTaskDto();
BeanUtil.copyProperties(dto, mTaskDto);
String userSid=wfManagerApi.backProcess(mTaskDto).getData();
if(!userSid.equals(""))
{
// 是否发送短信提醒
if (1 == dto.getIsSendMsg())
{
UserInfoVo vo = userApi.fetchUserInfoBysid(userSid).getData();
if(null!=vo)
MsgWs.SendWaitWorkMsg(vo.getMobile(), "您有工作被退回,请及时登录河北省计量业务应用平台办理!");
}
return true;
}
return false;
}
/**
* 撤回流程。待办列表中撤回.
*
* @param WfMTaskDto
* @return
*/
public boolean recallWork(RecallWorkDto dto) {
if (null == dto)
return false;
WfMRecallTaskDto mRecallTaskDto = new WfMRecallTaskDto();
BeanUtil.copyProperties(dto, mRecallTaskDto);
return wfManagerApi.recallProcess(mRecallTaskDto).getSuccess();
}
/**
* 更新流程实例中表单的数据(标题和紧急程度)
*
* @param
* @return
*/
public boolean updateMfOrderFormInfo(FormDto formDto) {
WfOrderFormsDto dto = new WfOrderFormsDto();
BeanUtil.copyProperties(formDto, dto);
dto.setSid(formDto.getOrderSid());
return wfManagerApi.updateMfOrderForms(dto).getSuccess();
}
}

View File

@@ -0,0 +1,203 @@
package com.yxt.attend.biz.workflow;
import cn.hutool.core.bean.BeanUtil;
import com.yxt.common.base.utils.MsgWs;
import com.yxt.common.core.result.ResultBean;
import com.yxt.jlzx.oa.api.workflow.EndWorkDto2;
import com.yxt.jlzx.oa.api.workflow.SubmitWorkDto2;
import com.yxt.jlzx.system.api.cahtmlsignature.CahtmlsignatureApi;
import com.yxt.jlzx.system.api.cahtmlsignature.CahtmlsignatureDto;
import com.yxt.jlzx.system.api.user.UserApi;
import com.yxt.jlzx.system.api.user.UserInfoVo;
import com.yxt.jlzx.system.api.user.app.AppUserApi;
import com.yxt.jlzx.system.api.user.app.CaParseSignatureVo;
import com.yxt.jlzx.system.api.user.app.CaSealEffectivenessQuery;
import com.yxt.workflow.api.task.WfTaskOpers;
import com.yxt.workflow.api.wfmanger.WfMSimpleTaskDto;
import com.yxt.workflow.api.wfmanger.WfMTaskDto;
import com.yxt.workflow.api.wfmanger.WfManagerApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
/**
* @author dimengzhe
* @date 2021/4/11 22:09
* @description
*/
@Service
public class WorkFlowService2 {
@Autowired
private WfManagerApi wfManagerApi;
@Autowired
private UserApi userApi;
@Autowired
private AppUserApi appUserApi;
@Autowired
private CahtmlsignatureApi cahtmlsignatureApi;
/**
* 提交工作(执行流程)
*
* @param dto
* @return
*/
public boolean submitWork(SubmitWorkDto2 dto, CaParseSignatureVo caParseSignatureVo) {
if (null == dto)
return false;
/* CaSealEffectivenessQuery caSealEffectivenessQuery = new CaSealEffectivenessQuery();
caSealEffectivenessQuery.setOriginalText(dto.getOperOpinion());
caSealEffectivenessQuery.setSignatureResultB64(dto.getSignatureResultB64());
caSealEffectivenessQuery.setUserSid(dto.getOperUserSid());
ResultBean<CaParseSignatureVo> caParseSignatureVoResultBean = appUserApi.sealEffectiveness(caSealEffectivenessQuery);
if (!caParseSignatureVoResultBean.getSuccess()) {
return false;
}*/
WfMTaskDto mTaskDto = new WfMTaskDto();
BeanUtil.copyProperties(dto, mTaskDto);
String userMobile = "";
UserInfoVo userInfoVo = new UserInfoVo();
// 完善下一处理人相关字段0为上一处理人9是发起人-1是同时发给多个人分发用户
//if(!dto.getNextUserSid().equals("0") && !dto.getNextUserSid().equals("9") && !dto.getNextUserSid().equals("-1"))
if (dto.getNextUserSid().length() > 3) {
userInfoVo = userApi.fetchUserInfoBysid(
dto.getNextUserSid()).getData();
if (null != userInfoVo) {
// 调用根据userSid获取user信息
mTaskDto.setNextOperDeptName(userInfoVo.getDepartmentName());
mTaskDto.setNextOperName(userInfoVo.getName());
userMobile = userInfoVo.getMobile();
}
}
// 是否分发用户,分发用户的待阅工作
StringBuilder senderUserSids = new StringBuilder();
mTaskDto.setOpers(new ArrayList<WfTaskOpers>());
if (dto.getSendUsersSid() != null && !dto.getSendUsersSid().equals("")) {
String[] userSids = dto.getSendUsersSid().split(",");
for (int i = 0; i < userSids.length; i++) {
WfTaskOpers opers = new WfTaskOpers();
userInfoVo = userApi.fetchUserInfoBysid(userSids[i])
.getData();
if (null != userInfoVo) {
opers.setOperName(userInfoVo.getName());
opers.setOperDeptName(userInfoVo.getDepartmentName());
opers.setOperPost(userInfoVo.getRoleName());
opers.setCreateBySid(userInfoVo.getSid());
senderUserSids.append(userInfoVo.getMobile() + ",");
}
mTaskDto.getOpers().add(opers);
}
}
if (wfManagerApi.runProcess(mTaskDto).getSuccess()) {
//是否发送短信提醒
if (1 == dto.getIsSendMsg() && !userMobile.equals("")) {
MsgWs.SendWaitWorkMsg(userMobile, "您有待办工作需要办理,请及时登录平台办理!");
}
//分发用户发送短信提醒
if (senderUserSids.length() > 0) {
MsgWs.SendWaitWorkMsg(senderUserSids.substring(0, senderUserSids.length() - 2), "您有一个新的待阅工作,请及时登录平台查看!");
}
//保存签名表
CahtmlsignatureDto cahtmlsignature = new CahtmlsignatureDto();
String signResultB64 = caParseSignatureVo.getSignatureResultB64();
String sealPic = caParseSignatureVo.getSeal().getSealPic();
String sealPicType = caParseSignatureVo.getSeal().getSealPicType();
int sealWidth = caParseSignatureVo.getSeal().getSealWidth();
int sealHeight = caParseSignatureVo.getSeal().getSealHeight();
cahtmlsignature.setSignResultB64(signResultB64);
cahtmlsignature.setOriginalText(dto.getOperOpinion());
cahtmlsignature.setSealPic(sealPic);
cahtmlsignature.setSealPicType(sealPicType);
cahtmlsignature.setSealWidth(sealWidth);
cahtmlsignature.setSealHeight(sealHeight);
cahtmlsignature.setSignatureSid(mTaskDto.getCurrentTaskSid());
cahtmlsignature.setDocumentSid(dto.getDocumentSid());
cahtmlsignatureApi.save(cahtmlsignature);
return true;
}
return false;
}
/**
* 结束流程
*
* @return
*/
public boolean endWork(EndWorkDto2 dto, CaParseSignatureVo caParseSignatureVo) {
if (null == dto) {
return false;
}
/* CaSealEffectivenessQuery caSealEffectivenessQuery = new CaSealEffectivenessQuery();
caSealEffectivenessQuery.setOriginalText(dto.getOperOpinion());
caSealEffectivenessQuery.setSignatureResultB64(dto.getSignatureResultB64());
caSealEffectivenessQuery.setUserSid(dto.getOperUserSid());
ResultBean<CaParseSignatureVo> caParseSignatureVoResultBean = appUserApi.sealEffectiveness(caSealEffectivenessQuery);
if (!caParseSignatureVoResultBean.getSuccess()) {
return false;
}*/
WfMSimpleTaskDto mTaskDto = new WfMSimpleTaskDto();
BeanUtil.copyProperties(dto, mTaskDto);
// 是否分发用户,分发用户的待阅工作
StringBuilder senderUserSids = new StringBuilder();
mTaskDto.setOpers(new ArrayList<WfTaskOpers>());
if (dto.getSendUsersSid() != null && !dto.getSendUsersSid().equals("")) {
String[] userSids = dto.getSendUsersSid().split(",");
for (int i = 0; i < userSids.length; i++) {
WfTaskOpers opers = new WfTaskOpers();
UserInfoVo vo = userApi.fetchUserInfoBysid(userSids[i]).getData();
if (null != vo) {
opers.setOperName(vo.getName());
opers.setOperDeptName(vo.getDepartmentName());
opers.setOperPost(vo.getRoleName());
opers.setCreateBySid(vo.getSid());
senderUserSids.append(vo.getMobile() + ",");
}
mTaskDto.getOpers().add(opers);
}
}
if (wfManagerApi.endProcess(mTaskDto).getSuccess()) {
//分发用户发送短信提醒
if (senderUserSids.length() > 0) {
MsgWs.SendWaitWorkMsg(senderUserSids.substring(0, senderUserSids.length() - 2), "您有一个新的待阅工作,请及时登录平台查看!");
}
//保存签名表
CahtmlsignatureDto cahtmlsignature = new CahtmlsignatureDto();
String signResultB64 = caParseSignatureVo.getSignatureResultB64();
String sealPic = caParseSignatureVo.getSeal().getSealPic();
String sealPicType = caParseSignatureVo.getSeal().getSealPicType();
int sealWidth = caParseSignatureVo.getSeal().getSealWidth();
int sealHeight = caParseSignatureVo.getSeal().getSealHeight();
cahtmlsignature.setSignResultB64(signResultB64);
cahtmlsignature.setOriginalText(dto.getOperOpinion());
cahtmlsignature.setSealPic(sealPic);
cahtmlsignature.setSealPicType(sealPicType);
cahtmlsignature.setSealWidth(sealWidth);
cahtmlsignature.setSealHeight(sealHeight);
cahtmlsignature.setSignatureSid(mTaskDto.getTaskSid());
cahtmlsignatureApi.save(cahtmlsignature);
return true;
}
return false;
}
}

View File

@@ -0,0 +1,32 @@
package com.yxt.attend.conf;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
@Configuration
@EnableSwagger2
@EnableKnife4j
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo()).select()
.apis(RequestHandlerSelectors.basePackage("com.yxt"))
.paths(PathSelectors.any()).build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("计量中心/考勤").description("计量中心OA考勤").version("1.0")
.build();
}
}

View File

@@ -0,0 +1,40 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/yxt_attend?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=GMT%2B8&failOverReadOnly=false
username: root
password: root
redis:
database: 6 # Redis数据库索引默认为0
host: 127.0.0.1
jedis:
pool:
max-active: -1 #连接池最大连接数(使用负值表示没有限制)
max-idle: 8 #连接池中的最大空闲连接
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
min-idle: 0 # 连接池中的最小空闲连接
password: 123456
port: 6379
timeout: 0 # 连接超时时间(毫秒)
nacos:
discovery:
server-addr: 127.0.0.1:8848
# 日志配置
logging:
level:
com.yxt: debug
org.mybatis: debug
org.springframework: warn
image:
upload:
#path: /Users/popo/works/projects/hbuilderx/gg815/gg_admin/target/classes/static/upload/
#path: D:\\works\\projects\\hbuilderx\\gg815\\gg_admin\\target\\classes\\static\\upload\\
#path: /home/lzh/webapps/hbhx_kzdapi/BOOT-INF/classes/static/img/
path: D:\\jlzx\\upload\\
url:
prefix: http://127.0.0.1:8111/upload/
#prefix: http://211.90.39.140:8008/
#prefix: http://b92.bwyljy.com/img/
#prefix: http://192.168.0.119:8089/lv-qggz-state-ww/img/

View File

@@ -0,0 +1,34 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://39.104.142.92:3306/yxt_attend?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=GMT%2B8&failOverReadOnly=false
username: root
password: 123456
nacos:
discovery:
server-addr: 39.104.100.138:8848
redis:
database: 2 # Redis数据库索引默认为0
host: 39.104.100.138
jedis:
pool:
max-active: -1 #连接池最大连接数(使用负值表示没有限制)
max-idle: 8 #连接池中的最大空闲连接
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
min-idle: 0 # 连接池中的最小空闲连接
password: 123456
port: 6379
timeout: 0 # 连接超时时间(毫秒)
# 日志配置
logging:
level:
com.yxt: debug
org.mybatis: debug
org.springframework: warn
image:
upload:
path: D:\\jlzx\\upload\\
url:
prefix: http://39.104.100.138:8111/upload/

View File

@@ -0,0 +1,36 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.103.6:3306/yxt_attend?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=GMT%2B8&failOverReadOnly=false
username: root
password: yxt_@jlzx_root
cloud:
nacos:
discovery:
server-addr: 192.168.103.6:8848
redis:
database: 2 # Redis数据库索引默认为0
host: 192.168.103.6
jedis:
pool:
max-active: -1 #连接池最大连接数(使用负值表示没有限制)
max-idle: 8 #连接池中的最大空闲连接
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
min-idle: 0 # 连接池中的最小空闲连接
password: 123456
port: 6379
timeout: 0 # 连接超时时间(毫秒)
# 日志配置
logging:
level:
com.yxt: debug
org.mybatis: debug
org.springframework: warn
image:
upload:
path: E:\\jlzx\\upload\\
url:
# prefix: http://192.168.103.6:8111/upload/
prefix: http://jlyw1.hebjlzy.com:8111/upload/

View File

@@ -0,0 +1,36 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.103.5:3306/yxt_attend?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=GMT%2B8&failOverReadOnly=false
username: root
password: 1LAiGz$t1*Iw
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
redis:
database: 2 # Redis数据库索引默认为0
host: 127.0.0.1
jedis:
pool:
max-active: -1 #连接池最大连接数(使用负值表示没有限制)
max-idle: 8 #连接池中的最大空闲连接
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
min-idle: 0 # 连接池中的最小空闲连接
password: 123456
port: 6379
timeout: 0 # 连接超时时间(毫秒)
# 日志配置
logging:
level:
com.yxt: debug
org.mybatis: debug
org.springframework: warn
image:
upload:
path: D:\jlzx\upload\
url:
# prefix: http://192.168.103.6:8111/upload/
prefix: http://jlyw.hebjlzy.com:8111/upload/

View File

@@ -0,0 +1,24 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jlzx_jlcyry?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=GMT%2B8&failOverReadOnly=false
username: root
password: root
# 日志配置
logging:
level:
com.yxt: debug
org.mybatis: debug
org.springframework: warn
image:
upload:
#path: /Users/popo/works/projects/hbuilderx/gg815/gg_admin/target/classes/static/upload/
path: D:\\works\\projects\\hbuilderx\\gg815\\gg_admin\\target\\classes\\static\\upload\\
#path: /home/lzh/webapps/hbhx_kzdapi/BOOT-INF/classes/static/img/
url:
prefix: http://192.168.56.1:8108/upload/
#prefix: http://211.90.39.140:8008/
#prefix: http://b92.bwyljy.com/img/
#prefix: http://192.168.0.119:8089/lv-qggz-state-ww/img/

View File

@@ -0,0 +1,48 @@
spring:
application:
name: yxt-attend
profiles:
active: dev
# 资源信息
messages:
# 国际化资源文件路径
basename: i18n/messages
servlet:
multipart:
max-file-size: 50MB
max-request-size: 100MB
output:
ansi:
enabled: ALWAYS
server:
port: 8108
#mybatis
mybatis-plus:
mapper-locations: classpath*:**Mapper.xml
global-config:
refresh: true
db-config:
id-type: 0
db-type: mysql
configuration:
map-underscore-to-camel-case: false
cache-enabled: true
call-setters-on-nulls: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#hystrix的超时时间
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 30000
#ribbon的超时时间
ribbon:
ReadTimeout: 30000
ConnectTimeout: 30000

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="log.base" value="logs/yxt_attend" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符
|%blue(%thread) 线程 如 DiscoveryClient-CacheRefreshExecutor-0-->
<!--<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
<pattern>%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%green(%logger:%line) |%black(%msg%n)</pattern>
<!--<charset>UTF-8</charset> -->
</encoder>
</appender>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<appender name="FILEOUT"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.base}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.base}.%d{yyyyMMdd}.%i.log.zip
</fileNamePattern>
<!-- 当文件大小超过10MB时触发滚动 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!--<pattern>%date [%thread] %-5level %logger{35} - %msg%n</pattern>-->
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}
-%msg%n</Pattern>
<!--<charset>UTF-8</charset> -->
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILEOUT" />
</root>
</configuration>