计量中心项目
This commit is contained in:
100
jlzx-single/yxt-single-attend/yxt-single-attend-biz/pom.xml
Normal file
100
jlzx-single/yxt-single-attend/yxt-single-attend-biz/pom.xml
Normal 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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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("考勤定时任务启动啦。撒花撒花");
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()); // 打卡类型:1:2次,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
@@ -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) >= #{map.startTime}
|
||||
AND CONCAT(day, ' ', signTime) <= #{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 <>3
|
||||
and ae.startTime<=concat(#{Query.day},"23:59") and ae.endTime>=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 <> 1)
|
||||
<if test='Query.userType!=null and Query.userType =="1" '>
|
||||
and gzxx.orgSid=#{Query.dwSid} AND (concat(#{Query.day}," 00:00")<gzxx.leaveDate OR gzxx.leaveDate='' OR gzxx.leaveDate
|
||||
is null) AND (concat(#{Query.day}," 23:59")>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}<gzxx.leaveDate OR gzxx.leaveDate='' OR gzxx.leaveDate is null) AND
|
||||
(#{Query.day}>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<>3 and ae.startTime<=#{Query.day}
|
||||
and ae.endTime>=#{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 <> 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>
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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 <> 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 <> 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 <= #{curTime}
|
||||
AND ae.endTime >= #{curTime}
|
||||
AND ae.state <> 4
|
||||
</select>
|
||||
|
||||
<select id="selectByDwsidAndTime" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
|
||||
SELECT *
|
||||
FROM attend_errand
|
||||
WHERE dwSid = #{dwSid}
|
||||
AND startTime <= #{start}
|
||||
AND endTime >= #{end}
|
||||
</select>
|
||||
|
||||
<select id="selectByMonth" resultType="com.yxt.attend.api.attenderrand.AttendErrand" parameterType="map">
|
||||
select * from attend_errand
|
||||
where state<>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 <> 4
|
||||
AND sid = #{sid}
|
||||
</select>
|
||||
|
||||
<select id="selectDayByUserSid" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
|
||||
select * from attend_errand where state<>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 <> 4
|
||||
AND userSid = #{map.userSid}
|
||||
AND NOT (endTime < #{map.startTime} OR startTime >> #{map.endTime})
|
||||
</select>
|
||||
|
||||
<select id="selectAllByTime" resultType="com.yxt.attend.api.attenderrand.AttendErrand">
|
||||
SELECT *
|
||||
FROM attend_errand
|
||||
WHERE state <> 4
|
||||
AND state <> 2
|
||||
AND (startTime < #{map.startTime} AND endTime >> #{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>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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 <= #{startDate}
|
||||
AND (endDate IS NULL OR endDate >= #{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 >= #{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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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 <= #{startDate}
|
||||
AND (endDate IS NULL OR endDate >= #{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 >= #{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>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
// }
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
//待阅工作
|
||||
|
||||
|
||||
//已阅工作
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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/
|
||||
@@ -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/
|
||||
@@ -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/
|
||||
@@ -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/
|
||||
@@ -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/
|
||||
@@ -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
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user